简易的2048
来源:互联网 发布:社交网络mp4 编辑:程序博客网 时间:2024/05/21 03:56
一个命令行版本的2048。支持自定义游戏矩阵的长和宽。同时也是我中学生电脑制作大赛的参赛作品。
#include<cstdio>#include<iostream>#include<windows.h>#include<ctime>#include<cstdlib>using namespace std;void readInput(int* l, int* h);void gameStart(int l, int h);class GameTable {private: int t[10][10]; int length, height; int score; bool cleanLeft(bool status) { bool sta = false; if(status) { for(int i = 0 ; i < height ; i++) { for(int j = 0 ; j < length ; j++) { if(t[i][j]) { int tmp = j - 1; while(!t[i][tmp] && tmp >= 0) { tmp--; } tmp++; if(tmp != j) { t[i][tmp] = t[i][j]; t[i][j] = 0; sta = true; } } } } } return sta; } bool cleanRight(bool status) { bool sta = false; if(status) { for(int i = 0 ; i < height ; i++) { for(int j = length - 1 ; j >= 0 ; j--) { if(t[i][j]) { int tmp = j + 1; while(!t[i][tmp] && tmp <= length - 1) { tmp++; } tmp--; if(tmp != j) { t[i][tmp] = t[i][j]; t[i][j] = 0; sta = true; } } } } } return sta; } bool cleanUp(bool status) { bool sta = false; if(status) { for(int i = 0 ; i < length ; i++) { for(int j = 0 ; j < height ; j++) { if(t[j][i]) { int tmp = j - 1; while(!t[tmp][i] && tmp >= 0) { tmp--; } tmp++; if(tmp != j) { t[tmp][i] = t[j][i]; t[j][i] = 0; sta = true; } } } } } return sta; } bool cleanDown(bool status) { bool sta = false; if(status) { for(int i = 0 ; i < length ; i++) { for(int j = height - 1 ; j >= 0 ; j--) { if(t[j][i]) { int tmp = j + 1; while(!t[tmp][i] && tmp <= height - 1) { tmp++; } tmp--; if(tmp != j) { t[tmp][i] = t[j][i]; t[j][i] = 0; sta = true; } } } } } return sta; } int max(int x, int y) { return x > y ? x : y; } int min(int x, int y) { return x < y ? x : y; }public: GameTable(int l, int h) { memset(t, 0, sizeof(t)); length = l; height = h; score = 0; } bool moveLeft(void) { bool status = false; if(cleanLeft(true) == true) { status = true; } for(int i = 0 ; i < height ; i++) { for(int j = length - 1 ; j > 0 ; j--) { if(t[i][j] == t[i][j - 1] && t[i][j] != 0) { status = true; t[i][j] = 0; t[i][j - 1] *= 2; score += t[i][j - 1]; j--; } } } cleanLeft(status); return status; } bool moveRight(void) { bool status = false; if(cleanRight(true) == true) { status = true; } for(int i = 0 ; i < height ; i++) { for(int j = 0 ; j < length - 1 ; j++) { if(t[i][j] == t[i][j + 1] && t[i][j] != 0) { status = true; t[i][j] = 0; t[i][j + 1] *= 2; score += t[i][j + 1]; j++; } } } cleanRight(status); return status; } bool moveUp(void) { bool status = false; if(cleanUp(true) == true) { status = true; } for(int i = 0 ; i < length ; i++) { for(int j = height - 1 ; j > 0 ; j--) { if(t[j][i] == t[j - 1][i] && t[j][i] != 0) { status = true; t[j][i] = 0; t[j - 1][i] *= 2; score += t[j - 1][i]; j--; } } } cleanUp(status); return status; } bool moveDown(void) { bool status = false; if(cleanDown(true) == true) { status = true; } for(int i = 0 ; i < length ; i++) { for(int j = 0 ; j < height - 1 ; j++) { if(t[j][i] == t[j + 1][i] && t[j][i] != 0) { status = true; t[j][i] = 0; t[j + 1][i] *= 2; score += t[j + 1][i]; j++; } } } cleanDown(status); return status; } bool gameStatus(void) { bool status = false; for(int i = 0 ; i < height ; i++) { for(int j = 0 ; j < length ; j++) { if(t[i][j] == 0) { status = true; break; } } if(status) { break; } } for(int i = 1 ; i < height - 1 ; i++) { for(int j = 1 ; j < length - 1 ; j++) { int tmp = t[i][j]; if(t[i][j + 1] == tmp || t[i][j - 1] == tmp || t[i - 1][j] == tmp || t[i + 1][j] == tmp) { status = true; break; } } if(status) { break; } } if(t[0][0] == t[0][1] || t[0][0] == t[1][0]) { status = true; } if(t[0][length - 1] == t[0][length - 2] || t[0][length - 1] == t[1][length - 1]) { status = true; } if(t[height - 1][0] == t[height - 1][1] || t[height - 1][0] == t[height - 2][0]) { status = true; } if(t[height - 1][length - 1] == t[height - 2][length - 1] || t[height - 1][length - 1] == t[height - 1][length - 2]) { status = true; } return status; } void printTable(void) { for(int i = 0 ; i < height ; i++) { for(int j = 0 ; j < length ; j++) { printf("%d\t", t[i][j]); } printf("\n"); } printf("Score:%d\n", score); } void addNum(void) { int l = rand() % length; int h = rand() % height; while(t[h][l]) { l = rand() % length; h = rand() % height; } int num = rand() % 2; if(num == 0) { t[h][l] = 2; } else { t[h][l] = 4; } }};int main() { int l, h; srand((unsigned)time(NULL)); bool sta = true; while(sta) { readInput(&l, &h); gameStart(l, h); printf("Would you like to play again?(Y/N):"); char s = getchar(); fflush(stdin); while(!(s == 'n' || s == 'N' || s == 'y' || s == 'Y')) { printf("Input error! Please input again:"); s = getchar(); fflush(stdin); } if(s == 'N' || s == 'n') { printf("Thanks for playing! Please press enter to exit."); sta = false; getchar(); } else { printf("\n\n"); } }}void readInput(int* l, int* h) { printf("Please input the length and height(separated by a comma)(3 <= length <= 10 and 3 <= height <= 10):"); scanf("%d,%d", l, h); printf("%d %d", *l, *h); while(!(*l <= 10 && *h <= 10 && *l >= 3 && *h >= 3)) { printf("Input error! Please input again:"); scanf("%d,%d", l, h); }}void gameStart(int l, int h) { GameTable *gt = new GameTable(l, h); char op; gt -> addNum(); while(gt -> gameStatus()) { system("cls"); gt -> printTable(); fflush(stdin); scanf("%c", &op); bool sta; switch(op) { case 'w': sta = gt -> moveUp(); break; case 's': sta = gt -> moveDown(); break; case 'a': sta = gt -> moveLeft(); break; case 'd': sta = gt -> moveRight(); break; default: printf("Error! Please input again:"); scanf("%d", &op); } if(sta) { gt -> addNum(); } } system("cls"); gt -> printTable(); printf("\n\nGame Over!!\n\n"); delete gt;}
0 0
- 简易的2048
- 一个简易的2048游戏
- 小游戏——2048的简易实现
- cookie的简易使用
- ofbiz的简易安装
- 简易的vi使用法
- MSChart的简易使用
- 简易的照片浏览器
- 简易的TTS程序
- C的简易计算器
- 简易的生活
- 简易聊天室的制作
- 简易的灰度处理
- 简易的计算器
- RMI的简易使用方法
- MSChart的简易使用
- 简易电话薄的项目
- 简易的字形装载
- ssh+extjs4 用户、角色、权限模块的实现
- 九章算法8:Data Structure
- 参考了网上代码之后自己编写整数和真分数的四则运算,求指导(虽然我知道没人看。。。)
- 如何有效是哟Project(2)--进度计划的执行与监控
- 面试题(1)
- 简易的2048
- Graph Cut(图割算法)
- 嵌入式Linux学习笔记 NAND Flash控制器
- RecyclerView使用详解(一)
- 【USACO题库】2.3.2 Cow Pedigrees奶牛家谱 题解
- 第六届CCF 第三题 画图
- Ubuntu命令学习(二)
- IT行业导览-引言
- Problem H