#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#define ROW 4
#define LINE 4
//这个数组为 全局数组--全局数组可以被该文件内任意函数调用
//调用的前提--出现在任何函数之前
int array_2048[ROW][LINE] = { 0 };
//现在设定一个函数,功能是设置某个位置的随机值
void position()//随机产生4或2
{
int i, j, value;
srand(time(0));
value = rand() % 2;
if (value == 0)
value = 2;
else
value = 4;
while (1)
{
i = rand() % 4;
j = rand() % 4;
if (array_2048[i][j] != 0)//如果该位置不为空,继续随机生成,直到该位置为空
continue;
else
array_2048[i][j] = value;//如果该位置为空则给该位置赋值为2或4
break;
}
}
//打印数组函数
void printf_array()
{
printf("\n----------------------------------------------------------------\n");
int i, j;
for (i = 0; i < ROW; i++)
{
printf("|\t");
for (j = 0; j < LINE; j++)
{
printf("%d\t|\t", array_2048[i][j]);
}
printf("\n");
}
printf("\n----------------------------------------------------------------\n");
}
//判断能否向上移动
int judge_up()
{
int i, j;
for (i = 1; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (array_2048[i][j] == array_2048[i - 1][j] && array_2048[i - 1][j] > 0)//上方的格子不为空而且和本身这个格子数字相同
return 1;
if (array_2048[i][j] != array_2048[i - 1][j] && array_2048[i - 1][j] ==0)//上方的格子为空
return 1;
}
return 0;
}
//判断能否向下移动
int judge_down()
{
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
{
if (array_2048[i][j] == array_2048[i + 1][j] && array_2048[i + 1][j] > 0)//下方的格子不为空而且和本身这个格子数字相同
return 1;
if (array_2048[i][j] != array_2048[i + 1][j] && array_2048[i + 1][j] ==0)//下方的格子为空
return 1;
}
return 0;
}
//判断能否向左移动
int judge_left()
{
int i, j;
for (i = 0; i < 4; i++)
for (j = 1; j < 4; j++)
{
if (array_2048[i][j] == array_2048[i][j - 1] && array_2048[i][j - 1] > 0)//左方的格子不为空而且和本身这个格子数字相同
return 1;
if (array_2048[i][j] != array_2048[i][j - 1] && array_2048[i][j - 1] ==0)//左方的格子为空
return 1;
}
return 0;
}
//判断能否向右移动
int judge_right()
{
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 3; j++)
{
if (array_2048[i][j] == array_2048[i][j + 1] && array_2048[i][j + 1] > 0)//右方的格子不为空而且和本身这个格子数字相同
return 1;
if (array_2048[i][j] != array_2048[i][j + 1] && array_2048[i][j + 1] ==0)//右方的格子为空
return 1;
}
return 0;
}
int judge_move(char ch)//判断能否进行移动
{
int i, j;
for (i = 0; i < 4; i ++)
for (j = 0; j < 4; j++)
if (array_2048[i][j] == 2048)
return 2;//有一个格子内的结果是2048
int x = 0;
switch ('w')//判断是否有方向可以移动
{
case 'w':x += judge_up();
case 's':x += judge_down();
case 'a':x += judge_left();
case 'd':x += judge_right();
default:printf("input error");
break;
}
if (x ==0)
return 1;//没有一个方向可以移动
int z = 0;
switch (ch)//每次判断一个方向
{
case 'w':z += judge_up(); break;
case 's':z += judge_down(); break;
case 'a':z += judge_left(); break;
case 'd':z += judge_right(); break;
default:printf("input error");
break;
}
if (z)
return 3;//在某个方向能移动
else
return 4;//z=0在某个方向不能移动
//遍历数组,比较周围有2048--有就直接返回2
//判断四个方向能不能移动
//判断单个方向能不能移动
}
void move_up()//向上移动的具体实现
{
int i, j, k;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 3; i++)
{
if (array_2048[i][j] != 0)//格子本身不能为空
{
for (k = i + 1; k < 4; k++)//找本格子下方的每个格子
{
if (array_2048[i][j] != array_2048[k][j] && array_2048[k][j] != 0)//若下方的格子不等于上方格子,不移动
break;
else if (array_2048[i][j] == array_2048[k][j])//若相同则可以合并
{
array_2048[i][j] = array_2048[i][j] * 2;
array_2048[k][j] = 0;
break;
}
}
}
}
}//以上都是合并操作
for (j = 0; j < 4; j++)//移动操作
{
for (i = 0; i < 3; i++)
{
if (array_2048[i][j] == 0)//格子本身为空
{
for (k = i + 1; k < 4; k++)
{
if (array_2048[k][j] != 0)
{
array_2048[i][j] = array_2048[k][j];
array_2048[k][j] = 0;
break;
}
}
}
}
}
}
void move_down()//原理同上
{
int i, j, k;
for (j = 0; j < 4; j++)
{
for (i = 3; i > 0; i--)
{
if (array_2048[i][j] != 0)
{
for (k = i - 1; k > -1; k--)
{
if (array_2048[i][j] != array_2048[k][j] && array_2048[k][j] != 0)
break;
else if (array_2048[i][j] == array_2048[k][j])
{
array_2048[i][j] = array_2048[i][j] * 2;
array_2048[k][j] = 0;
break;
}
}
}
}
}
for (j = 0; j < 4; j++)
{
for (i = 3; i > 0; i--)
{
if (array_2048[i][j] == 0)
{
for (k = i - 1; k > -1; k--)
{
if (array_2048[k][j] != 0)
{
array_2048[i][j] = array_2048[k][j];
array_2048[k][j] = 0;
break;
}
}
}
}
}
}
void move_left()
{
int i, j, k;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
if (array_2048[i][j] != 0)
{
for (k = j + 1; k < 4; k++)
{
if (array_2048[i][j] != array_2048[i][k] && array_2048[i][k] != 0)
break;
else if (array_2048[i][j] == array_2048[i][k])
{
array_2048[i][j] = array_2048[i][j] * 2;
array_2048[i][k] = 0;
break;
}
}
}
}
}
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
if (array_2048[i][j] == 0)
{
for (k = j + 1; k < 4; k++)
{
if (array_2048[i][k] != 0)
{
array_2048[i][j] = array_2048[i][k];
array_2048[i][k] = 0;
break;
}
}
}
}
}
}
void move_right()
{
int i, j, k;
for (i = 0; i < 4; i++)
{
for (j = 3; j > 0; j--)
{
if (array_2048[i][j] != 0)
{
for (k = j - 1; k > -1; k--)
{
if (array_2048[i][j] != array_2048[i][k] && array_2048[i][k] != 0)
break;
else if (array_2048[i][j] == array_2048[i][k])
{
array_2048[i][j] = array_2048[i][j] * 2;
array_2048[i][k] = 0;
break;
}
}
}
}
}
for (i = 0; i < 4; i++)
{
for (j = 3; j > 0; j--)
{
if (array_2048[i][j] == 0)
{
for (k = j - 1; k > -1; k--)
{
if (array_2048[i][k] != 0)
{
array_2048[i][j] = array_2048[i][k];
array_2048[i][k] = 0;
break;
}
}
}
}
}
}
void move(char ch)//手动输入移动的方向
{
switch (ch)
{
case'w':move_up(); break;
case'a':move_left(); break;
case's':move_down(); break;
case'd':move_right(); break;
}
}
int game()//游戏的实现步骤
{
//生成两个随机数
position();
position();
//打印数据
printf_array();
//移动--获取移动数据
//a--left,w--up,s--down,d--right
//getchar
int flag = 0;
while (1)
{
char ch = getchar();
//根据获取到的数据进行位置移动
//判断是都结束/成功/能够移动
//judge_move-->能够移动返回(3)
//不能移动--2048(2)/某个方向不能移动(1),该方向无法移动(4)
flag = judge_move(ch);
if (flag == 3)
{
move(ch);
position();
printf_array();//移动--void_move(char ch)
//移动之后还要判断游戏是否结束
flag = judge_move(ch);
if (flag == 2)
{
printf("success 2048\n");
break;
}
else if (flag == 1)
{
printf("defeat 2048\n");
break;
}
}
else if (flag == 2)
{
printf("success 2048\n");
break;
}
else if (flag == 1)
{
printf("defeat 2048\n");
break;
}
else if (flag == 4)
{
printf("no through\n");
}
}
return 0;
}
int main()
{
game();
return 0;
}