课设作业:2048

大致可以运行,可能会出现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;
}


你可能感兴趣的:(课设作业:2048)