c语言数字拼图游戏代码

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<time.h>

#include<windows.h>

int i, j, r, k; //i、j、r用于循环, k存放随机数值

int m, n; // m、n是当前空位的下标

int a[4][4]; //存储4×4共16个数字的数组

void show(void); //输出界面

void csh(void); //初始化界面

int yes(void); //判断排序是否成功(1是0否)

void up(void); //数字向上移动到空位(空位则下移)

void down(void); //数字向下移

void left(void); //数字向左移

void rght(void); //数字向右移

void inkey(void); //按键操作

void gtxy(int x, int y) ; //控制光标位置的函数

int main(void)

{ while(1)

 { csh( );

   while(1)

      {  inkey();

         show();

         if ( yes( ) )

            { gtxy(6,12); printf("你成功了! 再来一局y/n?"); break; }

     }

   if(getch( )=='n')break;

 }

return 0;

}

void csh(void) //初始化

{ r=0;

CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下两行是隐藏光标的设置

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);

for(i=0;i<4;i++) //给数组a依序赋值

for(j=0;j<4;j++)

    { if (i==3 && j==3) a[i][j]=0;

      else  a[i][j]=1+r++;

    } 

m=3; n=3; //记下空格(值为0)的下标

down( ); rght( ); rght( ); down( ); //预演4步

srand((unsigned)time(0)); //初始化随机数发生器

for(r=0;r<500;r++) //将数组各值打乱

{ k=rand( )%(4);

  switch(k)

     { case 0: { up( ); break; }

      case 1: {down( ); break; }

     case 2: { left( ); break; }

     case 3: { rght( ); break; }

   }

}

system(“cls”);

printf("\n\n\t\t 数字拼图");

printf("\n\t┌──────┬──────┬──────┬──────┐");

printf("\n\t│ │ │ │ │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│ │ │ │ │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│ │ │ │ │");

printf("\n\t├──────┼──────┼──────┼──────┤");

printf("\n\t│ │ │ │ │");

printf("\n\t└──────┴──────┴──────┴──────┘");

show( );

}

void show(void) //输出界面

{ for(i=0;i<4;i++)

for(j=0;j<4;j++)    //gtxy(7*j+9, 2*i+4)是光标到指定位置输出数字

    { gtxy(7*j+9,2*i+4);  if(a[i][j]==0)printf("      │");

      else if(a[i][j]>9)printf("  %d  │",a[i][j]);

      else printf("   %d  │",a[i][j]);

    }

}

void inkey(void) //按键操作

{ int key;

key=getch( );

switch(key)

   { case 72: { up( ); break; }

     case 80: {down( ); break; }

     case 75: {left( ); break; }

     case 77: { rght( ); break; }

   }

}

void up(void) //向上移动

{ if (m!=3) //空位不得在下边界

  { a[m][n]=a[m+1][n];  m++; a[m][n]=0; }

}

void down(void) //向下移动

{ if (m!=0) //空位不得在上边界

 { a[m][n]=a[m-1][n];  m--; a[m][n]=0; }

}

void left(void) //向左移动

{ if (n!=3) //空位不得在右边界

 { a[m][n]=a[m][n+1]; n++; a[m][n]=0; }

}

void rght(void) //向右移动

{ if (n!=0) //空位不得在左边界

 { a[m][n]=a[m][n-1]; n--; a[m][n]=0; }

}

int yes(void) //判断是否成功

{ r=0;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

   { if (a[i][j]!=1+r++) return (r==16)?1:0; }

}

void gtxy(int x, int y) //控制光标位置的函数

{ COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EYYLTV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值