ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

课设作业:2048

2021-01-01 15:33:37  阅读:175  来源: 互联网

标签:课设 ++ 作业 2048 break int while c++ data


大致可以运行,可能会出现BUG,有待考察.

#include <iostream>
#include <ctime>
#include <cstdlib>
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include <conio.h>
#include <stdlib.h>
#include <iomanip>
#include <vector>
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,break,int,while,c++,data
来源: https://blog.csdn.net/Fizzncx/article/details/112060801

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有