1、需要4x4的二维数组。
2、在数组中随机产生4|2,两个数字。
3、显示界。
4、获取方向。
5、把数组中的数字向某个方向移动(相同的数字要合并),统计得分。
6、如果数组发生了移动,要在数组再随机产生一个4|2。
7、检查游戏是否结束(没有空位置,上下左右相邻的数字没有相同的)。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#include<getch.h>
#include<string.h>
unsigned short arr[4][4];
unsigned long score=0;
bool is_rand;
bool is_null(void)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(0==arr[i][j])
return true;
}
}
return false;
}
void rand_num(void)
{
if(!is_null())
return;
while(is_rand)
{
int num1=rand()%4;
int num2=rand()%4;
if(0==arr[num1][num2])
{
arr[num1][num2]=(rand()%10<8)?2:4;
return;
}
}
}
//初始化界面并赋随机值2||4
void init_game(void)
{
srand(time(NULL));
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
arr[i][j]=0;
}
}
is_rand=true;
rand_num();
rand_num();
}
//显示界面
void show_arr(void)
{
system("clear");
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%3d",arr[i][j]);
}
printf("\n");
}
}
//向上合并
void up_move(void)
{
for(int j=0;j<4;j++)
{
for(int i=1;i<4;i++)
{
if(0==arr[i][j])
continue;
int end=-1;
for(int m=i-1;m>=0;m--)
{
if(0==arr[m][j] || arr[m][j]==arr[i][j])
end=m;
else
break;
/*score+=arr[end][j]*2;
arr[end][j]+=arr[i][j];
arr[i][j]=0;
is_rand=true;*/
}
if(-1 !=end)
{
score+=arr[end][j]*2;
arr[end][j]+=arr[i][j];
arr[i][j]=0;
is_rand=true;
}
}
}
}
//向下合并
void down_move(void)
{
for(int j=0;j<4;j++)
{
for(int i=1;i<4;i++)
{
if(0==arr[i][j])
continue;
int end=4;
for(int m=i+1;m<4;m++)
{
if(0==arr[m][j] || arr[m][j]==arr[i][j])
end=m;
else
break;
}
if(4 !=end)
{
score+=arr[end][j]*2;
arr[end][j]+=arr[i][j];
arr[i][j]=0;
is_rand=true;
}
}
}
}
//向右合并
void right_move(void)
{
for(int i=0;i<4;i++)
{
for(int j=1;j<4;j++)
{
if(0==arr[i][j])
continue;
int end=4;
for(int m=j+1;m<4;m++)
{
if(0==arr[i][m] || arr[i][m]==arr[i][j])
end=m;
else
break;
}
if(4 !=end)
{
score+=arr[i][end]*2;
arr[i][end]+=arr[i][j];
arr[i][j]=0;
is_rand=true;
}
}
}
}
//想左合并
void left_move(void)
{
for(int i=0;i<4;i++)
{
for(int j=1;j<4;j++)
{
if(0==arr[i][j])
continue;
int end=-1;
for(int m=j-1;m>=0;m--)
{
if(0==arr[i][m] || arr[i][m]==arr[i][j])
end=m;
else
break;
}
if(-1 !=end)
{
score+=arr[i][end]*2;
arr[i][end]+=arr[i][j];
arr[i][j]=0;
is_rand=true;
}
}
}
}
//检查游戏是否结束
bool check_over(void)
{
if(is_null())
return false;
return true;
}
//保存游戏
void save(void)
{
FILE*fp=fopen("date1.bin","w");
if(NULL==fp)
{
printf("数据保存失败!\n");
return;
}
int ret=fwrite(arr[4][4],sizeof(arr[0]),score,fp);
printf("成功保存 %d 条数据!\n",ret);
fclose(fp);
}
int main(int argc,const char* argv[])
{
init_game();
for(;;)
{
show_arr();
switch(getch())
{
case 183:
up_move();
break;
case 184:
down_move();
break;
case 185:
right_move();
break;
case 186:
left_move();
break;
case 'n':
break;
case 's':
save();
break;
case 'q':
return 0;
}
rand_num();
if(check_over())
{
show_arr();
printf("xxx\n");
break;
}
}
}