大致可以运行,可能会出现BUG,有待考察.
#include
#include
#include
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include
#include
#include
#include
using namespace std;
int ending = 0;//ending 为1则游戏胜利 为0则游戏失败
int score = 0;//score 用于计分 分数为每次做和后的值之和
class game {
//game类用于显示棋盘
public:
const static int N = 4;//指定棋盘的大小
int r, c;//指定行列的变量
int data[N][N] = {
};//初始的数组 可以手动初始化便于测试
int t;//迭代变量
void mapcreate() {
//打印棋盘 setw用于设置间隔
for (r = 0; r != N; r++) {
for (c = 0; c != N; c++) {
cout << setw(5) << setiosflags(ios::left) << data[r][c];
}
cout << endl << endl;//使行列之间距离均匀
}
}//展示棋盘的函数
void new24() {
int num1, num2, num3;
while (1) {
num1 = rand() % N; //产生两个整数(小于N)的随机数(算上0)用来确定随机行列
num2 = rand() % N;
num3 = rand() % 2; //产生一个整数0或1 若是1则随机生成2 若是2则随机生成4
if (num3 == 0 && data[num1][num2] == 0) {
data[num1][num2] = 2;
break;
}
else if (num3 == 1 && data[num1][num2] == 0) {
data[num1][num2] = 4;
break;
}
else {
t = 0;
for (r = 0; r != N; r++) {
for (c = 0; c != N; c++) {
if (data[r][c] != 0) t++;
}
}
if (t == N * N) break;//如果所有格子都有数就会退出循环 不生成随机数2 4
}
}
}//这一步要完成:如果随机的某格原来的值是0 则让它上面生成2 或 4
void clear() {
system("CLS");//清屏
}
void direction() {
int ch = _getch();//先获取方向键
if (ch == 224)
ch = _getch();//得到左75 下80 右77 上72
switch (ch) {
//在四种不同情况下采取不同的操作
case 75: left(); break;
case 80: down(); break;
case 77: right(); break;
case 72: up(); break;
}
}
void left() {
for (r = 0; r != N; r++) {
//按先行后列的顺序进行检测
for (c = 0, t = c + 1; c != N; c++) {
//移动到行列的顶侧
while (1) {
if (data[r][c] == 0 && data[r][t] != 0) {
Swap(data[r][c], data[r][t]);
t = c + 1;
break;
}
if (t == N - 1) {
t = c + 1;
break;
}
t++;
}
}
}//第一次移动结束
for (r = 0; r != N; r++) {
//按先行后列的顺序进行检测
for (c = 0, t = c + 1; c != N; c++) {
//进行检测值并相加的操作
while (1) {
if (data[r][c] == data[r][c + 1]) {
data[r][c] *= 2;
data[r][c + 1] = 0;
score += data[r][c];
break;
}
if (t == N - 1) {
t = c + 1;
break;
}
t++;
}
}
}//相加结束
for (r = 0; r != N; r++) {
//按先行后列的顺序进行检测 进行第二次移动
for (c = 0, t = c + 1; c != N; c++) {
//移动到行列的顶侧
while (1) {
if (data[r][c] == 0 && data[r][t] != 0) {
Swap(data[r][c], data[r][t]);
t = c + 1;
break;
}
if (t == N - 1) {
t = c + 1;
break;
}
t++;
}
}
}//第二次移动结束
}
void right() {
for (r = 0; r != N; r++) {
for (c = 3, t = c - 1; c >= 0; c--) {
while (1) {
if (data[r][c] == 0 && data[r][t] != 0) {
Swap(data[r][c], data[r][t]);
t = c - 1;
break;
}
if (t == 0) {
t = c - 1;
break;
}
t--;
}
}
}
for (r = 0; r != N; r++) {
for (c = 3, t = c - 1; c >= 0; c--) {
while (1) {
if (data[r][c] == data[r][c - 1]) {
data[r][c] *= 2;
data[r][c - 1] = 0;
score += data[r][c];
break;
}
if (t == 0) {
t = c - 1;
break;
}
t--;
}
}
}
for (r = 0; r != N; r++) {
for (c = 3, t = c - 1; c >= 0; c--) {
while (1) {
if (data[r][c] == 0 && data[r][t] != 0) {
Swap(data[r][c], data[r][t]);
t = c - 1;
break;
}
if (t == 0) {
t = c - 1;
break;
}
t--;
}
}
}
}
void up() {
for (c = 0; c != N; c++) {
for (r = 0, t = r + 1; r != N; r++) {
while (1) {
if (data[r][c] == 0 && data[t][c] != 0) {
Swap(data[r][c], data[t][c]);
t = r + 1;
break;
}
if (t == N - 1) {
t = r + 1;
break;
}
t++;
}
}
}
for (c = 0; c != N; c++) {
for (r = 0, t = r + 1; r != N; r++) {
while (1) {
if (data[r][c] == data[r + 1][c]) {
data[r][c] *= 2;
data[r + 1][c] = 0;
score += data[r][c];
break;
}
if (t == N - 1) {
t = r + 1;
break;
}
t++;
}
}
}
for (c = 0; c != N; c++) {
for (r = 0, t = r + 1; r != N; r++) {
while (1) {
if (data[r][c] == 0 && data[t][c] != 0) {
Swap(data[r][c], data[t][c]);
t = r + 1;
break;
}
if (t == N - 1) {
t = r + 1;
break;
}
t++;
}
}
}
}
void down() {
for (c = 0; c != N; c++) {
for (r = 3, t = r - 1; r >= 0; r--) {
while (1) {
if (data[r][c] == 0 && data[t][c] != 0) {
Swap(data[r][c], data[t][c]);
t = r - 1;
break;
}
if (t == 0) {
t = r - 1;
break;
}
t--;
}
}
}
for (c = 0; c != N; c++) {
for (r = 3, t = r - 1; r >= 0; r--) {
while (1) {
if (data[r][c] == data[r - 1][c]) {
data[r][c] *= 2;
data[r - 1][c] = 0;
score += data[r][c];
break;
}
if (t == 0) {
t = r - 1;
break;
}
t--;
}
}
}
for (c = 0; c != N; c++) {
for (r = 3, t = r - 1; r >= 0; r--) {
while (1) {
if (data[r][c] == 0 && data[t][c] != 0) {
Swap(data[r][c], data[t][c]);
t = r - 1;
break;
}
if (t == 0) {
t = r - 1;
break;
}
t--;
}
}
}
}//四个方向函数用于进行四个方向的操作以及相加 left有注释 其它三个对照left修改即可
void Swap(int& x, int& y) {
//交换函数 便于排序
int z(x);
x = y;
y = z;
}
double judge() {
//判断游戏是否结束的函数 如果游戏结束 输出0 游戏不结束则输出1 这两个结果用在游戏进行的while循环里
for (r = 0; r != N; r++) {
//若出现2048则游戏胜利 ending = 1 返回0
for (c = 0; c != N; c++) {
if (data[r][c] == 2048) {
ending = 1;
return 0;
}
}
}
for (c = 0; c != N; c++) {
//分别检测每列的元素是否能够继续相加
for (r = 0; r != N; r++) {
if (data[r][c] == 0 || data[r][c] == data[r + 1][c]) {
return 1;
}
}
}
for (r = 0; r != N; r++) {
//分别检测每行的元素是否能够继续相加
for (c = 0; c != N; c++) {
if (data[r][c] == 0 || data[r][c] == data[r][c + 1]) {
return 1;
}
}
}
return 0;//如果能继续相加则刚刚已输出1 都不能相加则输出0 使循环结束
}//judge 结束
};//game类的结束
int main() {
srand((unsigned int)time(NULL)); //选择当前时间为随机数种子 便于2 4的随机生成
game map;//创建对象map
while (map.judge()) {
//进行游戏的循环
map.clear();//清屏指令 用于清掉上一次循环的地图
map.new24(); //生成 2 4
map.mapcreate();//展示地图
cout << "通过使用↑←↓→四个方向键进行操作" << endl;
cout << "你的当前分数是:" << score << endl;
map.direction(); //获取方向键并进行操作
map.clear();
map.mapcreate();//清屏并展示地图 展现操作后的地图
}
if (ending == 0) {
//判断游戏胜利还是失败
map.clear();
map.mapcreate();
cout << "You lose!" << endl;
}
else {
map.clear();
map.mapcreate();
cout << "You win!" << endl;
}
cout << "你的最终分数是:" << score << endl;//给出最终的分数
return 0;
}