这个竟然不允许发,是在想不通为什么,是不是原标题是fifteen游戏,然后百度认为是15禁游戏?如果是这样,只能呵呵了。
申诉也没有反应,只能重新改标题,再发一次。
参照上一篇“手动移动的八数码程序相关(非算法)”而改编的,具体注释看上一篇的,如果看不懂可以把每个函数单独运行。
这个是4*4的15数码,其实基本都差不多,move函数那边有区别。
这个是公开课视频上输入数字移动,而上一篇是上下左右键移动。
哦,没验证won函数,也就是移动成功后会怎样,要手动移动比较麻烦。
下面的图片就是:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
// 声明
void clear(void);//清屏
void greet(void);//提示
void init(int array[]);//初始化
void draw(int array[]);//绘制
void move(int tile,int array[]);//移动
bool won(int array[]);//完成
//主函数
int
main()
{
int array[16];
int tile;
init(array);
do
{
clear();
greet();
draw(array);
if(won(array))
{
printf("你赢了!好棒!!\n");
break;
}
printf("\n");
printf("输入要移动的数字: ");
scanf("%d",&tile);
while(getchar()!='\n');
if(tile<0 || tile>15)
{
printf("retry!\n");
}
//tile = GetInt();
move(tile,array);
}while(tile!=0);
}
//清屏函数
void
clear(void)
{
/*printf("\033[2J");
printf("\033[%d;%dH", 0, 0);
*/
system("cls");
}
//提示函数
void
greet(void)
{
//clear();
printf("类似华容道的数字游戏,将其排列成1,2,3...15的顺序吧!\n");
printf("如果想结束,除了按右上角的x,还可以输入数字0,试试吧!\n");
printf("\n");
usleep(2000000);
}
//初始化函数
void
init(int array[])
{
// TODO
int i,j,sum;
srand((unsigned int)time(NULL));
do
{
sum=0;
for(i=0;i<16;i++)
array[i]=rand()%16;
for(i=0;i<16;i++)
{
for(j=0;j<i;j++)
{
if(array[j]==array[i])
{
array[i]=array[i]+1;
if(array[i]==16)
array[i]=0;
j=-1;
}
}
}
for(i=0;i<16;i++)
for(j=i+1;j<16;j++)
if(array[i]>array[j])
sum++;
}while(sum%2!=0);
}
//绘制函数
void
draw(int array[])
{
// TODO
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
if(array[i*4+j]==0)
printf("\t");
else
printf("%d\t",array[i*4+j]);
printf("\n");
}
}
//移动函数
void
move(int tile,int array[])
{
// TODO
int i;
for(i=0;i<16;i++)
if(array[i]==0)break;
if((i>=1)&&(tile==array[i-1]))
{
array[i]=array[i-1];
array[i-1]=0;
}
if((i<=14)&&(tile==array[i+1]))
{
array[i]=array[i+1];
array[i+1]=0;
}
if((i>=4)&&(tile==array[i-4]))
{
array[i]=array[i-4];
array[i-4]=0;
}
if((i<=11)&&(tile==array[i+4]))
{
array[i]=array[i+4];
array[i+4]=0;
}
/*
switch(tile)
{
case array[i-1]:j=i-1;break;
case array[i+1]:j=i+1;break;
case array[i-4]:j=i-4;break;
case array[i+4]:j=i+4;break;
}
if(j>=0&&j<=15)
{
array[i]=array[j];
array[j]=0;
}
*/
}
//完成函数
bool
won(int array[])
{
// TODO
int i;
for(i=0;i<14;i++)
if(array[i]!=i+1)
return false;
return true;
}