#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#define SIZE 4
void paintWindows(int a[SIZE][SIZE]);
void paintOne(int a[SIZE][SIZE]);
void paintRandom(int a[SIZE][SIZE]);
void move(char ch);
int a[SIZE][SIZE] = { 0 };
//int flag = 1;
int main()
{
char ch;
paintOne(a);
paintWindows(a);
while (1)
{
scanf("%c", &ch);
getchar();
move(ch);
paintRandom(a);
paintWindows(a);
}
printf("游戏结束");
return 0;
}
void paintWindows(int a[SIZE][SIZE])
{
for (int i = 0; i < SIZE; i++)
{
printf("*");
for (int j = 0; j < SIZE; j++)
{
printf("-----*");
}
printf("\n");
char ch = '|';
printf("%c", ch);
for (int j = 0; j < SIZE; j++)
{
printf("%3d%3c", a[i][j], ch);
}
printf("\n");
}
printf("*");
for (int j = 0; j < SIZE; j++)
{
printf("-----*");
}
printf("\n");
}
void paintOne(int a[SIZE][SIZE])
{
srand((int)time(NULL));
int orignx;
int origny;
for (int i = 0; i < 4; i++)
{
orignx = rand() % 4;
origny = rand() % 4;
if (a[orignx][origny] == 0)
a[orignx][origny] = 2;
else
i--;
}
}
void paintRandom(int a[SIZE][SIZE])
{
srand((int)time(NULL));
int newx;
int newy;
int i = 0;
do
{
newx = rand() % 4;
newy = rand() % 4;
i++;
} while (a[newx][newy] != 0);
a[newx][newy] = 2;
}
void move(char ch)
{
int i, j;
switch (ch)
{
case 'a':
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
int cell = a[i][j];
if (cell != 0)
{
int k = j + 1;
while (k < SIZE)
{
int nextcell = a[i][k];
if (nextcell != 0)
{
if (cell == nextcell)
{
a[i][j] += a[i][k];
a[i][k] = 0;
}
k = SIZE;
break;
}
k++;
}
}
}
}
//修改部分:for循环中的i或者j的循环条件
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE - 1; j++)
{
int cell = a[i][j];
if (cell == 0)
{
int k = j + 1;
while (k < SIZE)
{
int nextcell = a[i][k];
if (nextcell != 0)
{
a[i][j] = nextcell;
a[i][k] = 0;
k = SIZE;
}
k++;
}
}
}
}
break;
case 'w':
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
int cell = a[i][j];
if (cell != 0)
{
int k = i + 1;
while (k < SIZE)
{
int nextcell = a[k][j];
if (nextcell != 0)
{
if (cell == nextcell)
{
a[i][j] += a[k][j];
a[k][j] = 0;
}
k = SIZE;
break;
}
k++;
}
}
}
}
//修改部分:for循环中的i或者j的循环条件
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE - 1; j++)
{
int cell = a[i][j];
if (cell == 0)
{
int k = i + 1;
while (k < SIZE)
{
int nextcell = a[k][j];
if (nextcell != 0)
{
a[i][j] = nextcell;
a[k][j] = 0;
k = SIZE;
}
k++;
}
}
}
}
break;
case 's':
for (i = SIZE - 1; i >= 0; i--)
{
for (j = 0; j <SIZE; j++)
{
int cell = a[i][j];
if (cell != 0)
{
int k = i - 1;
while (k >= 0)
{
int nextcell = a[k][j];
if (nextcell != 0)
{
if (cell == nextcell)
{
a[i][j] += a[k][j];
a[k][j] = 0;
}
k = -1;
break;
}
k--;
}
}
}
}
//修改部分:for循环中的i或者j的循环条件
for (i = SIZE - 1; i >= 0; i--)
{
for (j = 0; j < SIZE; j++)
{
int cell = a[i][j];
if (cell == 0)
{
int k = i - 1;
while (k >= 0)
{
int nextcell = a[k][j];
if (nextcell != 0)
{
a[i][j] = nextcell;
a[k][j] = 0;
k = -1;
}
k--;
}
}
}
}
break;
case 'd':
for (i = 0; i < SIZE; i++)
{
for (j = SIZE -1; j >= 0; j--)
{
int cell = a[i][j];
if (cell != 0)
{
int k = j - 1;
while (k >= 0)
{
int nextcell = a[i][k];
if (nextcell != 0)
{
if (cell == nextcell)
{
a[i][j] += a[i][k];
a[i][k] = 0;
}
k = -1;
break;
}
k--;
}
}
}
}
for (i = 0; i < SIZE; i++)
{
for (j = SIZE - 1; j > 0; j--)
{
int cell = a[i][j];
if (cell == 0)
{
int k = j - 1;
while (k >= 0)
{
int nextcell = a[i][k];
if (nextcell != 0)
{
a[i][j] = nextcell;
a[i][k] = 0;
k = -1;
}
k--;
}
}
}
}
break;
default:
break;
}
}
目前只能实现最基本的玩法,游戏的退出还没有写好,以及数字多了以后会造成随机数生成时间长。
还有一个很关键的,就是数字占满了整个二维数组后,paintRandom()方法还会继续随机造成死循环。