【C语言学习】利用基础语句实现2048
基本逻辑就是二维数组储存数据;
读入字符完成操作;
每次读入操作后,清空上次内容,打印新内容;
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>
int a[5][5],compi[5][5];
int flag = 0;
int makerand()
{
return rand() % 4 + 1;
}
void find(int* s, int* b)
{
int min = 10000, len, q = *s, p = *b;
for (int i = 1; i <= 4; i++)
{
for (int m = 1; m <= 4; m++)
if (a[i][m] == 0)
{
len = (q - i) * (q - i) + (p - m) * (p - m);
if (len <= min)
{
len = min;
*s = i;
*b = m;
}
}
}
}
void addnumber()
{
int flag = 0, s, b, c;
while (flag == 0)
{
s = makerand();
b = makerand();
c = makerand();
if (a[s][b] != 0)
find(&s, &b);
if (c % 2 == 1)
{
a[s][b] = 2;
flag = 1;
}
else
{
a[s][b] = 4;
flag = 1;
}
}
}
void print()
{
printf("用wasd来控制方向qwq:\n");
printf("---------------------\n");
for (int i = 1; i <= 4; i++)
{
printf("|");
for (int m = 1; m <= 4; m++)
{
if (a[i][m] == 0)
printf(" |");
else
printf("%4d|", a[i][m]);
}
printf("\n---------------------\n");
}
}
void downmove()
{
for (int i = 4; i >= 1; i--)
for (int m = 4; m >= 1; m--)
{
if (a[m][i] == 0)
continue;
else
{
for (int n = m; n < 4; n++)
{
if (a[n + 1][i] == 0)
{
a[n + 1][i] = a[n][i];
a[n][i] = 0;
flag = 1;
}
else
{
if (a[n][i] == a[n + 1][i]&&compi[n][i]==0&&compi[n+1][i]==0)
{
a[n + 1][i] += a[n][i];
a[n][i] = 0;
compi[n + 1][i] = 1;
flag = 1;
}
}
}
}
}
for (int i = 1; i <= 4; i++)
memset(compi[i], 0, sizeof(int) * 5);
}
void upmove()
{
for (int i = 1; i <= 4; i++)
for (int m = 1; m <= 4; m++)
{
if (a[m][i] == 0)
continue;
else
{
for (int n = m; n > 1; n--)
{
if (a[n - 1][i] == 0)
{
a[n - 1][i] = a[n][i];
a[n][i] = 0;
flag = 1;
}
else
{
if (a[n][i] == a[n - 1][i] && compi[n][i] == 0 && compi[n - 1][i] == 0)
{
a[n - 1][i] += a[n][i];
a[n][i] = 0;
compi[n - 1][i] = 1;
flag = 1;
}
}
}
}
}
for (int i = 1; i <= 4; i++)
memset(compi[i], 0, sizeof(int) * 5);
}
void rightmove()
{
for (int i = 4; i >= 1; i--)
for (int m = 4; m >= 1; m--)
{
if (a[i][m] == 0)
continue;
else
{
for (int n = m; n < 4; n++)
{
if (a[i][n + 1] == 0)
{
a[i][n + 1] = a[i][n];
a[i][n] = 0;
flag = 1;
}
else
{
if (a[i][n] == a[i][n + 1] && compi[i][n] == 0 && compi[i][n + 1] == 0)
{
a[i][n + 1] += a[i][n];
a[i][n] = 0;
compi[i][n + 1] = 1;
flag = 1;
}
}
}
}
}
for (int i = 1; i <= 4; i++)
memset(compi[i], 0, sizeof(int) * 5);
}
void leftmove()
{
for (int i = 1; i <= 4; i++)
for (int m = 1; m <= 4; m++)
{
if (a[i][m] == 0)
continue;
else
{
for (int n = m; n > 1; n--)
{
if (a[i][n - 1] == 0)
{
a[i][n - 1] = a[i][n];
a[i][n] = 0;
flag = 1;
}
else
{
if (a[i][n] == a[i][n - 1] && compi[i][n] == 0 && compi[i][n - 1] == 0)
{
a[i][n - 1] += a[i][n];
a[i][n] = 0;
compi[i][n - 1] = 1;
flag = 1;
}
}
}
}
}
for (int i = 1; i <= 4; i++)
memset(compi[i], 0, sizeof(int) * 5);
}
int judege()
{
int conti = 0;
for (int i = 1; i <= 4; i++)
{
for (int m = 1; m <= 4; m++)
{
if (a[i][m] == 2048)
{
return 1;
}
if (a[i][m] == 0)
conti = 1;
}
}
if (conti == 1)
return 2;
else
{
return 3;
}
}
int main()
{
srand((unsigned)time(0));
char c;
addnumber();
print();
while (1)
{
c = _getch();
system("cls");
if (!(c == 'w' || c == 'w' || c == 'a' || c == 'a' || c == 's' || c == 's' || c == 'd' || c == 'd'))
{
printf("错误输入!请重新输入!\n");
continue;
}
switch (c)
{
case'w':
upmove();
break;
case'W':
upmove();
break;
case'a':
leftmove();
break;
case'A':
leftmove();
break;
case'd':
rightmove();
break;
case'D':
rightmove();
break;
case's':
downmove();
break;
case'S':
downmove();
break;
}
if(flag==1)
addnumber();
print();
flag = 0;
if (judege() == 1)
{
printf("你赢了!!!\n");
system("pause");
return 0;
}
if (judege() == 3)
{
int flag = 0;
for(int i=1;i<=3;i++)
for (int m = 1; m <= 3; m++)
{
if (a[i][m] == a[i][m + 1] || a[m][i] == a[m + 1][i])
{
flag = 1;
break;
}
}
if (flag == 0)
{
printf("你输了@w@\n");
system("pause");
return 0;
}
}
}
}