c语言 字符版 简易2048

时间:2023-12-17 17:37:44

花了两个多小时,用最蠢的方法写的……最简陋版……

还不确定这么写逻辑对不对……

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std; int map[5][5]; int score; int move(int& a, int& b, int& c, int& d) //move nonzero digit to front
{
int vis_num = 0; //the number of visited digit, most is 4
int zero_num = 0; //the number of zero digit
while (1) {
if (a != 0) {
if (++vis_num >= 4) return zero_num;
break;
}
++zero_num;
a = b;
b = c;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
while (1) {
if (b != 0) {
if (++vis_num >= 4) return zero_num;
break;
}
++zero_num;
b = c;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
while (1) {
if (c != 0) {
++vis_num;
if (vis_num >= 4) return zero_num;
break;
}
++zero_num;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
if (d == 0)
++zero_num;
return zero_num;
} void change(int& a, int& b, int& c, int& d)
{
int zero_num = move(a, b, c, d);
if (zero_num == 4 || zero_num == 3) return ;
if (zero_num == 2) {
if (a == b) {
score += a * 10;
a <<= 1;
b = 0;
}
return ;
}
if (zero_num == 1) {
if (a == b) {
score += a * 10;
a <<= 1;
b = c;
c = 0;
} else if (c == b) {
score += c * 10;
b <<= 1;
c = 0;
}
return ;
}
if (a == b) {
if (c == d) {
score += c * 10;
score += a * 10;
a <<= 1;
b = c << 1;
c = d = 0;
} else {
score += a * 10;
a <<= 1;
b = c;
c = d;
d = 0;
}
} else if (b == c){
score += b * 10;
b <<= 1;
c = d;
d = 0;
} else if (c == d) {
score += c * 10;
c <<= 1;
d = 0;
}
} int rand_2_or_4()
{
if (rand() & 1) return 2;
return 4;
} void rand_pos()
{
int x, y;
do {
x = rand() % 4;
y = rand() % 4;
} while (map[x][y]);
map[x][y] = rand_2_or_4();
} void print()
{
int i, j;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
if (map[i][j] == 0) printf(" □ ");
else printf("%4d ", map[i][j]);
}
printf("\n");
}
printf("score:%d\n", score);
} bool is_full()
{
int i, j;
for (i = 0; i < 4; ++i)
for (j = 0; j < 4; ++j)
if (map[i][j] == 0) return false;
return true;
} bool is_over_row(int a, int b, int c, int d)
{
if (a != b && b != c && c != d) return true;
return false;
} bool is_over()
{
if (!is_full()) return false;
int i;
for (i = 0; i < 4; ++i) {
if (!is_over_row(map[i][0], map[i][1], map[i][2], map[i][3]))
return false;
}
for (i = 0; i < 4; ++i) {
if (!is_over_row(map[0][i], map[1][i], map[2][i], map[3][i]))
return false;
}
return true;
} int main()
{
// int a,b,c,d;
// while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF){
// change(a,b,c,d);
// printf("%d %d %d %d\n", a, b, c, d);
// }
srand(unsigned(time(NULL)));
rand_pos();
rand_pos();
print();
while (!is_over()) {
char dir = getch();
int i;
if (dir == 'w') {
for (i = 0; i < 4; ++i) {
change(map[0][i], map[1][i], map[2][i], map[3][i]);
}
} else if (dir == 's') {
for (i = 0; i < 4; ++i)
change(map[3][i], map[2][i], map[1][i], map[0][i]);
} else if (dir == 'a') {
for (i = 0; i < 4; ++i)
change(map[i][0], map[i][1], map[i][2], map[i][3]);
} else if (dir == 'd') {
for (i = 0; i < 4; ++i)
change(map[i][3], map[i][2], map[i][1], map[i][0]);
} else continue;
if (!is_full()) rand_pos();
system("cls");
print();
}
printf("Lose!");
return 0;
}

  

后来发现我的写法有问题,因为如果不移动的话,就不会产生新的数字,而我的逻辑是只要有空位就有新的数字。之前没有认真观察过,懒得改了(其实是没想到什么好的方法……