C++实现2048小游戏(转载)
2048小游戏
话不多说,直接上代码
#include<iostream>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
class Game_2048
{public:Game_2048();~Game_2048();void introduction();bool judgeOver(); //判断游戏是否结束void reSize();void printBoard(); //打印函数void getRand(); //随机在棋盘上生成2,4;void slide(); //滑动
private:int m=4, n=4;char op; //用户操作vector< vector<int> > board; //棋盘vector<int> row;bool judgeInsert(int x,int y);bool judgeSlide(); //判断是否能滑动,(未写完)void copyBoard(vector< vector<int> > &newBoard,vector< vector<int> > &board);void inputOp();char getOp(); //返回操作符bool judgeLeftSlide(bool mark=true);void leftSlide(); //左滑动bool judgeRightSlide(bool mark = true);void rightSlide();bool judgeUpSlide(bool mark = true);void upSlide();bool judgeDownSlide(bool mark = true);void downSlide();void reStart();void enlarge(); //将值扩大二倍
};int main()
{Game_2048 NB;NB.introduction();NB.getRand();NB.printBoard();while (!NB.judgeOver()){NB.slide();NB.getRand();NB.printBoard();} cout << "游戏结束!!!\n";system("pause");return 0;}void Game_2048::introduction()
{cout << "这是一个2048游戏,规则如下:\n";cout << "上划:W;\n下滑:S;\n左划:A;\n右划:D;\n退出:Q;\n重新开始:R;\n请输入下次操作,\n";
}void Game_2048::slide()
{inputOp();switch (getOp()){case 'a':case 'A':if (judgeLeftSlide())doleftSlide();while (judgeLeftSlide(false));else{cout << "无法左滑动,请重试!!!\n";slide();}break;case 'd':case 'D':if (judgeRightSlide())dorightSlide();while (judgeRightSlide(false)); else{cout << "无法右滑动,请重试!!!\n";slide();}break;case 'w':case 'W':if(judgeUpSlide())doupSlide();while (judgeUpSlide(false));else{cout << "无法上滑动,请重试!!!\n";slide();}break;case 's':case 'S':if(judgeDownSlide())do downSlide();while (judgeDownSlide(false));else{cout << "无法下滑动,请重试!!!\n";slide();}break;case 'p':case 'P':enlarge();break;case 'q':case 'Q':exit(0);break;case 'r':case 'R':reStart();break;default:cout << "输入错误,作为惩罚,随机生成一个数!\n";break;}
}void Game_2048::reStart()
{for (int i = 0; i < m; i++)for (int j = 0; j < n; j++) {board[i][j] = 0;}
}void Game_2048::enlarge()
{for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){board[i][j] *= 2;}
}char Game_2048::getOp()
{return op;
}void Game_2048::upSlide()
{for (int j = 0; j < n; j++)for (int i = m - 1; i > 0; i--) { //n-1!!if (board[i][j] != 0 && board[i - 1][j] == 0) //移动{board[i - 1][j] = board[i][j];board[i][j] = 0;}}for (int j = 0; j < n; j++)for (int i = m - 1; i > 0; i--) {if (board[i][j] != 0 && board[i-1][j] == board[i][j]) //覆盖{board[i-1][j] += board[i][j];board[i][j] = 0;}}
}bool Game_2048::judgeUpSlide(bool mark)
{if (mark){for (int i = 0; i < m; i++)for (int j = n - 1; j > 0; j--){if (board[i][j] == 0)return true;}}for (int j = 0; j < n; j++)for (int i = m - 1; i > 0; i--) { //n-1!!if (board[i][j] != 0 && board[i - 1][j] == 0) //移动return true;if (board[i][j] != 0 && board[i - 1][j] == board[i][j]) //覆盖return true;}return false;
}bool Game_2048::judgeDownSlide(bool mark)
{if (mark) {for (int i = 0; i < m; i++)for (int j = n - 1; j > 0; j--){if (board[i][j] == 0)return true;}}for (int j = 0; j < n; j++)for (int i = 0; i < m - 1; i++) { //n-1!!if (board[i][j] != 0 && board[i + 1][j] == 0) //移动return true;if (board[i][j] != 0 && board[i + 1][j] == board[i][j]) //覆盖return true;}return false;
}void Game_2048::downSlide()
{for (int j = 0; j < n; j++)for (int i = 0; i < m - 1; i++) { if (board[i][j] != 0 && board[i + 1][j] == 0) //移动{board[i + 1][j] = board[i][j];board[i][j] = 0;}}for (int j = 0; j < n; j++)for (int i = 0; i < m - 1; i++) {if (board[i][j] != 0 && board[i + 1][j] == board[i][j]) //覆盖{board[i + 1][j] += board[i][j];board[i][j] = 0;}}
}void Game_2048::rightSlide()
{for (int i = 0; i < m; i++)for (int j = 0; j < n - 1; j++) { //n-1!!if (board[i][j] != 0 && board[i][j + 1] == 0) //移动{board[i][j + 1] = board[i][j];board[i][j] = 0;}}for (int i = 0; i < m; i++)for (int j = 0; j < n - 1; j++) {if (board[i][j] != 0 && board[i][j + 1] == board[i][j]) //覆盖{board[i][j + 1] += board[i][j];board[i][j] = 0;}}
}bool Game_2048::judgeRightSlide(bool mark )
{if (mark) {for (int i = 0; i < m; i++)for (int j = n - 1; j > 0; j--){if (board[i][j] == 0)return true;}}for (int i = 0; i < m; i++)for (int j = 0; j < n - 1; j++) { //n-1!!if (board[i][j] != 0 && board[i][j + 1] == board[i][j]) //覆盖return true;if (board[i][j] != 0 && board[i][j + 1] == 0)return true;}return false;
}void Game_2048::leftSlide()
{for (int i = 0; i < m; i++)for (int j = 1; j < n; j++) { //n-1!!if (board[i][j] != 0 && board[i][j - 1] == 0) //移动{board[i][j - 1] = board[i][j];board[i][j] = 0;}}for (int i = 0; i < m; i++)for (int j = 1; j < n; j++) {if (board[i][j] != 0 && board[i][j - 1] == board[i][j]) //覆盖{board[i][j - 1] += board[i][j];board[i][j] = 0;}}
}bool Game_2048::judgeLeftSlide(bool mark)
{if (mark) {for (int i = 0; i < m; i++)for (int j = n - 1; j > 0; j--){if (board[i][j] == 0)return true;}}for (int i = 0; i < m; i++)for (int j = n - 1; j > 0; j--) { //n-1!!if (board[i][j] != 0 && board[i][j - 1] == 0) //移动return true;if (board[i][j] != 0 && board[i][j - 1] == board[i][j]) //覆盖return true;}return false;
}bool Game_2048::judgeOver()
{if (op == 'q' || op == 'Q')return true;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++) {if (board[i][j] == 2048){printBoard();cout << "有数字达到了2048,恭喜!!!\n";return true;} }for (int i = 0; i < m; i++)for (int j = 0; j < n; j++) {if (board[i][j] == 0)return false;}if (judgeSlide())return false;else{cout << "无法再滑动\n";return true;}}bool Game_2048::judgeSlide()
{vector< vector<int> > copyBoard; //棋盘vector<int> copyRow;for (int i = 0; i < n; i++) {copyRow.push_back(0);}for (int i = 0; i < m; i++) {copyBoard.push_back(copyRow);}copyBoard = board;upSlide();downSlide();leftSlide();rightSlide();for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){if (board[i][j] == 0) {board = copyBoard;return true;} }return false;
}void Game_2048::copyBoard(vector< vector<int> >& newBoard, vector< vector<int> >& board)
{for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)newBoard[i][j] = board[i][j];
}bool Game_2048::judgeInsert(int x,int y)
{if (board[x][y] == 0)return true;elsereturn false;
}
void Game_2048::getRand()
{srand(time(0));int x, y,val;do{x = rand() % m;y = rand() % n;} while (!judgeInsert(x,y));val = (rand() % 2 + 1)*2;board[x][y] = val;}void Game_2048::inputOp()
{cin >> op;
}
void Game_2048::reSize()
{cout << "请输入棋盘大小m*n\n";cin >> m >> n;Game_2048();
}Game_2048::~Game_2048()
{}Game_2048::Game_2048()
{for (int i = 0; i < n; i++){row.push_back(0);}for (int i = 0; i < m; i++){board.push_back(row);}
}
void Game_2048::printBoard()
{cout << "\n--------------\n";for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {cout << board[i][j];if (j < n-1){cout << "—";}if (j == n-1 && i < m-1){cout << endl;int count = 0;while (count++ < n-1){cout << "| ";}cout << "|" << endl;}}}cout << "\n--------------\n" ;
}
C++实现2048小游戏(转载)相关推荐
- C语言编写2048小游戏
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...
- 使用JS实现2048小游戏
JS实现2048小游戏源码 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器.) &l ...
- 2019.8.8 2048小游戏
本次为2048的小游戏制作,运用了之前的HTML+CSS以及现在的Jascript部分知识 目的是巩固之前所学内容,掌握现在的新知识,以及对面向对象能有进一步的理解 下面为html,css和JS三大页 ...
- Python学习—2048小游戏等4个小练习
Python学习-2048小游戏等4个小练习 转载于:https://www.cnblogs.com/ChangAn223/p/10627777.html
- 关于2048小游戏的开发感想
最近通过python实现2048小游戏的开发,在开发过程中遇到了一些问题,发现了自己的不足之处,特此进行简单的反思. 一.状态机: 状态机是表示有限个状态以及这些状态之间转移和动作等行为的数学模型,状 ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?
前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...
- 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...
最新文章
- 遍历百万级Redis的键值的大结局
- Nat. Commun. | AI语言工具揭示分子运动
- freeswitch模块之event_socket
- MySQL 5.7.22 二进制安装
- LeetCode-剑指 Offer 52. 两个链表的第一个公共节点
- 详解css样式处理的优先级
- iverilog命令选项解释
- 基于Spring Boot的Logback日志轮转配置
- 自学python买什么书比较好-python入门学习哪个书比较好(python视频教程知乎)
- python装饰器是什么意思_对Python装饰器的理解
- LINUX开源监控平台Nagios(主机监控配置)
- linux 位置参数数组,荐Linux中的shell编程Ⅱ——位置参数、数组、date和cal
- spark 算子使用类变量_SparkCore的常用算子
- Android Export时错误提示:Conversion to Dalvik format failed with error 1
- 金山打字通——绿色安全无捆绑下载
- EV 鼠标被消费者誉为世界“第八大奇迹”内幕
- 文墨绘学【书法双师】
- sql server中如何修改视图中的数据?
- 【愚公系列】2022年10月 微信小程序-电商项目-微信支付小程序确认支付结果和退款功能实现(node)
- 温度传感器Pt100 热电阻的原理