C/C++训练项目一:2048
2048是一款有趣的益智小游戏,风靡一时的2048小游戏,玩家需要在格子中通过数字叠加的方法将最初的数字2凑成数字2048.
#include<iostream>
#include<ctime>
#include<vector>
#include<windows.h>
using namespace std;const int ROW = 4;
const int COL = 4;
int pix[ROW][COL]={0};//上下左右
int const UP = 1;
int const DOWN = 2;
int const LEFT = 3;
int const RIGHT = 4; //游戏所处的状态
int const GAME_OVER = 1;
int const GAME_WIN = 2;
int const GAME_CONTINUE = 3; enum Num{Num_2 = 2,Num_4 = 4,Num_8 = 8,Num_16 = 16,Num_32 = 32,Num_64 = 64,Num_128 = 128,Num_256 = 256,Num_512 = 512,Num_1024 = 1024,Num_2048 = 2048,};
void Print(void)
{system("cls");cout<<"************* 2048 控制台程序**************"<<endl<<endl;cout<<"*********** by HUSTer 2018-2-7*************"<<endl<<endl;cout<<endl<<endl;for(int i=0; i< ROW; i++){cout << "---------------------------------"<< endl; for(int j=0; j<COL; j++){if(pix[i][j] == 0){cout<< "| \t" ;}else{cout<<"| " << pix[i][j] <<"\t";}}cout<< "|" <<endl;}cout << "---------------------------------"<< endl; }bool CreatNumber()
{int RandNum = rand() % 3;int r = 0;vector<int> index; //记录空白格for(int i=0; i < ROW; i++)for(int j=0; j < COL; j++){if(!pix[i][j]){index.push_back(i*4+j); //记录空白格的索引}}if(index.empty()){return false;}else{ //找到空白点Num CreatNum;r = rand() % index.size();if(RandNum == 0){CreatNum = Num_4; //1/3概率是4}else{CreatNum = Num_2; //2/3概率是2}pix[index[r]/4][index[r]%4] = CreatNum; //给空白处一个数据}return true;
}int Input()
{//读取上下左右四个方向键 int upArrow = 0; int downArrow = 0; int leftArrow = 0; int rightArrow = 0; int direction = 0; while (true) { upArrow = GetAsyncKeyState(VK_UP); downArrow = GetAsyncKeyState(VK_DOWN); leftArrow = GetAsyncKeyState(VK_LEFT); rightArrow = GetAsyncKeyState(VK_RIGHT); if(upArrow) { direction = UP; break; } else if(downArrow) { direction = DOWN; break; } else if(leftArrow) { direction = LEFT; break; } else if(rightArrow) { direction = RIGHT; break; } Sleep(100); } return direction;
}void Process(int dir)
{switch(dir) //根据按键指示进行处理{ //感觉还有进一步提升的空间case UP:for(int i=1; i < ROW; i++)for(int j=1; j < ROW; j++)for(int k=0; k < COL; k++){if(pix[j-1][k] == pix[j][k]){pix[j-1][k]*=2;pix[j][k] = 0; }else{if( pix[j-1][k] == 0){pix[j-1][k] = pix[j][k];pix[j][k] = 0 ;}} }break;case DOWN:for(int i=ROW-1; i > 0; i--)for(int j=ROW-1; j >0; j--)for(int k=0; k < COL; k++){if(pix[j][k] == pix[j-1][k]){pix[j][k]*=2;pix[j-1][k] = 0; }else{if( pix[j][k] == 0){pix[j][k] = pix[j-1][k];pix[j-1][k] = 0 ;}} }break;case LEFT:for(int i=1; i < COL; i++)for(int j=1; j < COL; j++)for(int k=0; k < ROW; k++){if(pix[k][j-1] == pix[k][j]){pix[k][j-1]*=2;pix[k][j] = 0; }else{if( pix[k][j-1] == 0){pix[k][j-1] = pix[k][j];pix[k][j] = 0 ;}} }break;case RIGHT:for(int i=COL-1; i > 0; i--)for(int j=COL-1; j >0; j--)for(int k=0; k < ROW; k++){if(pix[k][j] == pix[k][j-1]){pix[k][j]*=2;pix[k][j-1] = 0; }else{if( pix[k][j] == 0){pix[k][j] = pix[k][j-1];pix[k][j-1] = 0 ;}} }break; default:break; }}
int Judge()
{//赢得游戏 for(int i = 0; i < ROW; ++i) { for(int j = 0; j < COL; ++j) { if(pix[i][j] == 2048) { return GAME_WIN; break; } } } //横向检查 for(int i = 0 ; i < ROW; ++i) { for(int j = 0; j < COL - 1; ++j) { if(!pix[i][j] || (pix[i][j] == pix[i][j+1])) { return GAME_CONTINUE; break; } } } //纵向检查 for(int j = 0; j< COL; ++j) { for(int i = 0; i < ROW -1; ++i) { if(!pix[i][j] || (pix[i][j] == pix[i+1][j])) { return GAME_CONTINUE; break; } } } //不符合上述两种状况,游戏结束 return GAME_OVER; }
int main()
{ int Direction = 0;int Gamstate = 0;srand((unsigned int)time(0)); CreatNumber();CreatNumber(); Print(); //打印控制面板while(1){Gamstate = Judge(); if( Gamstate == GAME_CONTINUE){Direction = Input(); Process(Direction); if(CreatNumber() == 0){Gamstate = GAME_OVER; }Print(); Sleep(100); }else if(Gamstate == GAME_WIN){Print(); cout << "Congratulation "<<"You Win!" << endl; break; }if(Gamstate == GAME_OVER){Print(); cout <<"Sorry "<<"You lose the chance!" << endl; break; }}return 0;
}
演示图例:
C/C++训练项目一:2048相关推荐
- python有趣代码-一个有意思的 Python 训练项目集
逛 GitHub 的时候,发现了一个很酷的 Python 训练项目集.一共有 25 个题目,基本涵盖了用 Python 实现的各种功能. 上一周没有复习 C++ 和网络通信全部用来玩这几个题了.题目地 ...
- 幼儿体能五项技能测试软件,幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]
<幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]>由会员分享,可在线阅读,更多相关<幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类](3页珍藏版)>请在人人文库网 ...
- 【C++项目】2048益智小游戏
这是笔者用作练习C++的一个小项目,框架思路和程序上很大程度借鉴了牛客网-项目实战-2048小游戏,并在此基础上进行了功能上的拓展,增加了记录历史最高成绩和当前玩家得分两个功能.下面进行介绍 码云:h ...
- c语言课程结束小项目:2048小游戏
<C语言程序设计基础>学习完毕,完成第一个项目:2048小游戏. //思考:编程时,要先想整个框架还是先想每个函数的算法. //思考:每一个函数要不要传参数(即数组) //思考:每一个函数 ...
- SpringBoot+微信小程序训练项目
SpringBoot+微信小程序训练项目 必备软件 后端(SpringBoot) 服务器端安装 MySQL实现登录 JWT 鉴权 entity.vo.pojo.dto 前端(小程序) html js ...
- 008 | 基于自闭症儿童康复干预的体育游戏方案设计与实证探究 | 大学生创新训练项目申请书 | 极致技术工厂
研究目的 大多数自闭症儿童尚未掌握生活自理能力,无法进行生活自理,给家庭造成极大压力.本团队研究发现通过体育游戏与生活自理结合,在体育游戏的课程中矫正自闭症儿童刻板行为,促进自闭症儿童更好地与外界接触 ...
- python练手项目:2048实现与总结
python练手项目:利用curses界面对2048的实现与总结 涉及的知识点 基本实现 UI展示 curses的初始化方法:wrapper curses的屏幕展示语句:addscr curses正式 ...
- 001 | “版绘童印”——疫情时代下版画在儿童插画中应用研究 | 大学生创新训练项目申请书 | 极致技术工厂
本项目以新冠疫情防控为主题,版画插画为表达形式,针对乡村儿童疫情防控教育,创作疫情为主题的儿童插画.集儿童插画.版画,儿童防疫教育为一体.在当下信息交流便利的平台,及时推广相关信息,增加广度和知名度. ...
- 016 | 乡村振兴战略下农村宅基地有偿退出现状 | 大学生创新训练项目申请书 | 极致技术工厂
(一)研究目的 随着国家城市化进程的加快,城市和农村的具体情况都发生了巨大变化,大量的问题随之产生,在农村经济中,宅基地的有偿退出矛盾尤为突出.在当前的时代发展背景下,我国农村宅基地有偿退出存在着较多 ...
最新文章
- java 比较对象内容是否相同的_Java 比较对象中的内容是否一致
- .Net 操作MSMQ
- oracle日期相减工作日_Oracle 计算两个日期间隔的天数、月数和年数
- [转载]关于申请国外博后的一点经验和想法
- c/c++的全局变量
- 数据库中触发器、事务
- VMware中的三种网络模式-----NAT模式
- 特斯拉Model 3本周平均日产约900辆 7000辆周产量有望
- LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
- js学习(六)- js对象创建
- window下的git工具msysgit的使用
- 2022年黑马程序员火爆全网的自学Java必刷教程(价值2w+的教程免费分享)
- 成都信息工程大学上岸软件工程专硕经验分享
- 手机无线电驾驶与马歇尔·麦克卢汉的哲学
- 计算机专业人士研究生论文,计算机专业研究生论文致谢
- ^_^Hostname openapi.alipaydev.com not verified:
- 用scrapy进行网页抓取
- java单词排序_java中实现将输入的单词按首字母排序
- 完美用Nlite添加ACHI SATA驱动至XP镜像
- 被 GitHub 「临时邮箱」项目拉黑,Firefox Relay 引热议;业内首个开源容器安全平台发布;Deepin 20.4 发布 | 开源日报
热门文章
- GCD 信号量控制并发 (dispatch_semaphore)
- T-SQL基础--TOP
- sql查询重复记录、删除重复记录方法大全
- 刺客信条起源计算机内存不足,刺客信条起源需要什么配置能玩?最低/推荐配置需求介绍...
- softmax回归的从零开始实现-09-p4
- context c语言作用,理解 Go context
- 短时间让大家对C++ STL有所学习
- Unicode16 与 UTF-8编码之间的转换
- QUIC/UDT/SRT
- JavaScript——模块化的历史进程梳理