游戏规则 1、其中有格子达到2048 即为游戏胜利 2、用上下左右箭头进行操作 3、格中数字往输入方向的顶点移去 相同便相加 为0则取代 如:第一列数字从上到下依次为0 2 2 4 输入上箭头 4 4 0 0 4、每次输入方向完之后 会随机在0的位置出现初始的数值 5、当4*4个格中的数字全不为0的时候则失败
#undef UNICODE #undef _UNICODE #if _MSC_VER > 1200 #define __sprintf(...) sprintf_s(__VA_ARGS__) #endif #include<iostream> #include<graphics.h> #include<ctime> #include<conio.h> #include<math.h> using namespace std; //初始两个值 void random(int a[][4]) { int i = rand() % 4; int j = rand() % 4; a[i][j] = 2; i = rand() % 4; j = rand() % 4; a[i][j] = 4; } void Sort(int b[]) { for (int i = 0; i<4; i++) { for (int j = 0; j<3 - i; j++) { if (b[j]<b[j + 1] && b[j] == 0) { swap(b[j], b[j + 1]); } } } } void judge(int b[]) { Sort(b); int c[4] = { 0 }; for (int i = 1; i<4; i++) { if (b[i] != 0) { for (int j = 0; j<i; j++) { if (b[j] == b[i] && c[j] != 1 && c[i] != 1&&abs(i-j)==1) { b[j] += b[i]; b[i] = 0; c[j] = 1; break; } } Sort(b); } } Sort(b); } //绘制框架 void Draw() { setcolor(RED); fillrectangle(120, 40, 520, 440); setlinecolor(BLUE); setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3); line(120, 140, 520, 140); line(120, 240, 520, 240); line(120, 340, 520, 340); line(220, 40, 220, 440); line(320, 40, 320, 440); line(420, 40, 420, 440); } //绘制数字 void Witer(int a[][4]) { settextstyle(20,0,"宋体"); setcolor(BLACK); for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { char s[5]; sprintf(s, "%d", a[j][i]); outtextxy(160 + i * 100, 80+ j * 100, s); } } } //随机取数 void value(int a[][4]) { while (1) { int x, y; x = rand() % 4; y = rand() % 4; if (a[x][y] == 0) { switch (rand() % 2) { case 0: a[x][y] = 2; break; case 1: a[x][y] = 4; break; } break; } } } //找最大值 ,判断是否为2048 int Find_max(int a[][4]) { int max = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (max < a[i][j]) { max = a[i][j]; } } } return max; } int main() { initgraph(640, 480);//窗口大小 setbkcolor(WHITE);//背景色 cleardevice();//清屏 srand(time(NULL)); int a[4][4] = { 0 };//方格点数 int b[4] = { 0 }; random(a); int max=0; while (1) { char ch = 0; cleardevice();//清屏 Draw(); Witer(a); Sleep(100); if (_kbhit()) ch = _getch();//获取按键 int num = 0; switch (ch) { case 72://上 for (int i = 0; i<4; i++) { memset(b, 0, sizeof(b)); //一列一列的输入b[]中进行操作(从左到右,从上到下) for (int j = 0; j<4; j++) { b[j] = a[j][i]; } judge(b); //b[]操作完成输回a[][]中 //其他操作类似 for (int j = 0; j<4; j++) { a[j][i] = b[j]; } } for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { if (a[i][j] == 0) num++; } } value(a); num--; if (num == 0) { cout << "游戏结束" << endl; _getch(); exit(0); } break; case 80://下 for (int i = 0; i<4; i++) { memset(b, 0, sizeof(b)); int t = 0; for (int j = 3; j >= 0; j--) { b[t++] = a[j][i]; } judge(b); t = 0; for (int j = 3; j >= 0; j--) { a[j][i] = b[t++]; } } for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { if (a[i][j] == 0) num++; } } value(a); num--; if (num == 0) { cout << "游戏结束" << endl; _getch(); exit(0); } break; case 75://左 for (int i = 0; i<4; i++) { memset(b, 0, sizeof(b)); for (int j = 0; j<4; j++) { b[j] = a[i][j]; } judge(b); for (int j = 0; j<4; j++) { a[i][j] = b[j]; } } for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { if (a[i][j] == 0) num++; } } value(a); num--; if (num == 0) { cout << "游戏结束" << endl; _getch(); exit(0); } break; case 77://右 for (int i = 0; i<4; i++) { memset(b, 0, sizeof(b)); int t = 0; for (int j = 3; j >= 0; j--) { b[t++] = a[i][j]; } judge(b); t = 0; for (int j = 3; j >= 0; j--) { a[i][j] = b[t++]; } } for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { if (a[i][j] == 0) num++; } } value(a); num--; //格子满,结束 if (num == 0) { cout << "游戏结束" << endl; _getch(); exit(0); } break; case 27: exit(0); break; } max = Find_max(a); //到达2048,结束 if (max == 2048) { cout << "游戏" << endl; _getch(); exit(0); } } _getch(); return 0; }