#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
void start();
void qingchu();
void restart();
void chexiao();
void random();
void print();
void up(int tp[]);
void down(int tp[]);
void left(int tp[]);
void right(int tp[]);
void which_key();
void magic(int c);
void judge();
int cube[16] = { 0 };
int main(void)
{
srand((unsigned)time(0));
which_key();
system("pause");
return 0;
}
void which_key()// 接受用户输入的字符执行对应的功能。
{
start ();
do
{
int haha = _getch();
switch(haha)
{
case ‘1‘: qingchu(); break; // 清除数组中的2。
case ‘2‘: restart(); break;
case ‘3‘: chexiao(); break; //此功能正在开发中。
case ‘w‘:
case ‘a‘:
case ‘s‘:
case ‘d‘: magic(haha); break;
case ‘q‘: exit(1);
}
}while (1);
}
void start() //开始游戏,产生两个随机的2或4。
{
random();
random();
print();
}
void restart() // 这个应该是最简单的了,只需要把数组赋值为0,然后调用start函数即可。
{
int i;
for (i = 0; i < 16; cube[i] = 0,i++);
start();
}
void chexiao() //此功能正在开发中。
{
;
}
void qingchu()
{
int i, j = 0;
for (i = 0; i < 16; i++)
if (cube[i] == 2) cube[i] = 0;
for (i = 0; i < 16; i++)
if (cube[i] == 0) j = j + 1;
if (j == 16) start(); // 如果矩阵中只有2,那么执行清除后相当于重新开始游戏。
else print(); // 如果执行了转换那么就输出转换后的矩阵。
}
void random() //在空白的地方随机产生2或者4;
{
int temp[16] = { 0 }, i, j = 0; //思路是创建一个临时的数组保存那些数值为0的元素的下标,
for (i = 0; i < 16; i++) //然后用随机函数读取其中的一个下标,随机赋值为2或4。(2的概率为0.1。)
if (cube[i] == 0) temp[j++] = i;
if (j == 0) judge();
else
{
i = rand() % j;
if (rand() % 100 >= 10) cube[temp[i]]= 2;
else cube[temp[i]] = 4;
}
}
void print() //打印操作后的二维数组;
{
int i;
system("cls");
puts("|* - * - * - * - * - * 2 0 4 8 * - * - * - * - * - *|");
puts("|\t 清除(1) 重新开始(2) 撤销(3)\t |");
puts("|* - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *|");
puts("游戏操作说明:\n \x01 上下左右移动对应键盘上的W、S、A、D。\n \
\x01 退出请按 Q 键。\n \x01 请把输入法转换到英文状态再进行游戏!\n");
printf("-----------------------------");
for (i = 0; i < 16; i++)
{
if (i == 0) printf("\n|");
if (i % 4 == 0 && i != 0) printf("\n-----------------------------\n|");
if (cube[i] == 0) printf(" %-4c |", ‘ ‘);
else printf(" %-4d |", cube[i]);
}
printf("\n-----------------------------\n");
}
void up(int tp[])
{
int a[4][4], i, j, k = 0, temp[4] = { 0 };
int copy[16];
for (i = 0; i < 16; copy[i] = tp[i], i++); //以上两行代码是用来判断执行up操作后是否添加随机数。
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
a[i][j] = tp[k++]; //将一维数组转换换成二维数组。
for (j = 0; j < 4; j++)
{
k = 0;
for (i = 0; i < 4; i++)
if (a[i][j] != 0) temp[k++] = a[i][j]; //把一列中不为0的元素按顺序赋值到临时数组中。
for (k = 0; k < 3; k++)
{
if (temp[k] == 0) break;
if (temp[k] == temp[k + 1])
{
if (k == 0) { temp[0] += temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 1) { temp[1] += temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 2) { temp[2] += temp[3]; temp[3] = 0; }
}
} //此for循环把临时数组中的员元素相加并移动0至数组尾部。
k = 0;
for (i = 0; i < 4; a[i][j] = temp[k++], i++); //把临时数组中的元素赋值到原来的一列中。
for (k = 0; k < 4; temp[k] = 0, k++); //把临时数组重新赋值为0。
}
k = 0;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
tp[k++] = a[i][j] ; //把二维数组转换成原来的一维数组。
for (i = 0; i < 16; i++)
{
if (copy[i] != tp[i]) break;
}
if (i != 16) random(); //判断是否添加随机数。判断的依据是如果执行up操作后数组没有变化的话就不添加随机数,否则添加随机数。
}
void down(int tp[])
{
int a[4][4], i, j, k = 0, temp[4] = { 0 };
int copy[16];
for (i = 0; i < 16; copy[i] = tp[i], i++);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
a[i][j] = tp[k++];
for (j = 0; j < 4; j++)
{
k = 0;
for (i = 3; i >=0 ; i--)
if (a[i][j] != 0) temp[k++] = a[i][j];
for (k = 0; k < 3; k++)
{
if (temp[k] == 0) break;
if (temp[k] == temp[k + 1])
{
if (k == 0) { temp[0] += temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 1) { temp[1] += temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 2) { temp[2] += temp[3]; temp[3] = 0; }
}
}
k = 0;
for (i = 3; i >=0 ; a[i][j] = temp[k++], i--);
for (k = 0; k < 4; temp[k] = 0, k++);
}
k = 0;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
tp[k++] = a[i][j];
for (i = 0; i < 16; i++)
{
if (copy[i] != tp[i]) break;
}
if (i != 16) random();
}
void left(int tp[])
{
int a[4][4], i, j, k = 0, temp[4] = { 0 };
int copy[16];
for (i = 0; i < 16; copy[i] = tp[i], i++);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
a[i][j] = tp[k++];
for (i = 0; i < 4; i++)
{
k = 0;
for (j = 0; j <4; j++)
if (a[i][j] != 0) temp[k++] = a[i][j];
for (k = 0; k < 3; k++)
{
if (temp[k] == 0) break;
if (temp[k] == temp[k + 1])
{
if (k == 0) { temp[0] += temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 1) { temp[1] += temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 2) { temp[2] += temp[3]; temp[3] = 0; }
}
}
k = 0;
for (j = 0; j < 4; a[i][j] = temp[k++], j++);
for (k = 0; k < 4; temp[k] = 0, k++);
}
k = 0;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
tp[k++] = a[i][j];
for (i = 0; i < 16; i++)
{
if (copy[i] != tp[i]) break;
}
if (i != 16) random();
}
void right(int tp[])
{
int a[4][4], i, j, k = 0, temp[4] = { 0 };
int copy[16];
for (i = 0; i < 16; copy[i] = tp[i], i++);
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
a[i][j] = tp[k++];
for (i = 0; i < 4; i++)
{
k = 0;
for (j = 3; j >= 0; j--)
if (a[i][j] != 0) temp[k++] = a[i][j];
for (k = 0; k < 3; k++)
{
if (temp[k] == 0) break;
if (temp[k] == temp[k + 1])
{
if (k == 0) { temp[0] += temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 1) { temp[1] += temp[2]; temp[2] = temp[3]; temp[3] = 0; }
if (k == 2) { temp[2] += temp[3]; temp[3] = 0; }
}
}
k = 0;
for (j = 3; j >= 0; a[i][j] = temp[k++], j--);
for (k = 0; k < 4; temp[k] = 0, k++);
}
k = 0;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
tp[k++] = a[i][j];
for (i = 0; i < 16; i++)
{
if (copy[i] != tp[i]) break;
}
if (i != 16) random();
}
void magic(int c)
{
if (c == 119) up(cube);
if (c == 115) down(cube);
if (c == 97) left(cube);
if (c == 100) right(cube); //根据输入的字符判断执行的操作。
print();
int i, j = 0;
for (i = 0; i < 16; i++)
{
if (cube[i] == 2048)
{
printf("恭喜你,你的智商已达到2048!!击败全球99.99%%的用户!\n\t请按任意键继续。。。");
getchar();
} // 判断数组中的元素是否有2048,如果有则打印相关内容。
if (cube[i] != 0) j++;
}
if(j == 16) judge(); //如果数组中的元素都不为零的话,就判断是否可以继续游戏。
}
void judge()
{
int i, j = 0;
for (i = 0; i < 16; i++)
{
if (cube[i] == cube[i + 1] && i != 3 && i != 7 && i != 11) j = 1; // 相邻的元素相等且不为3,7,11时,可以进行。
if (cube[i] == cube[i + 4] && i < 12) j = 1; // 下标相差为4的元素相等,且最大最大下标小于16时,可以进行游戏。
}
if (j == 0) printf("别费力气了,已经 GAME OVER 了!!\n\t请按有效键重新开始或退出!");
}
本文出自 “12135147” 博客,谢绝转载!
原文地址:http://12145147.blog.51cto.com/12135147/1904280