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相关推荐

  1. python有趣代码-一个有意思的 Python 训练项目集

    逛 GitHub 的时候,发现了一个很酷的 Python 训练项目集.一共有 25 个题目,基本涵盖了用 Python 实现的各种功能. 上一周没有复习 C++ 和网络通信全部用来玩这几个题了.题目地 ...

  2. 幼儿体能五项技能测试软件,幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]

    <幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]>由会员分享,可在线阅读,更多相关<幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类](3页珍藏版)>请在人人文库网 ...

  3. 【C++项目】2048益智小游戏

    这是笔者用作练习C++的一个小项目,框架思路和程序上很大程度借鉴了牛客网-项目实战-2048小游戏,并在此基础上进行了功能上的拓展,增加了记录历史最高成绩和当前玩家得分两个功能.下面进行介绍 码云:h ...

  4. c语言课程结束小项目:2048小游戏

    <C语言程序设计基础>学习完毕,完成第一个项目:2048小游戏. //思考:编程时,要先想整个框架还是先想每个函数的算法. //思考:每一个函数要不要传参数(即数组) //思考:每一个函数 ...

  5. SpringBoot+微信小程序训练项目

    SpringBoot+微信小程序训练项目 必备软件 后端(SpringBoot) 服务器端安装 MySQL实现登录 JWT 鉴权 entity.vo.pojo.dto 前端(小程序) html js ...

  6. 008 | 基于自闭症儿童康复干预的体育游戏方案设计与实证探究 | 大学生创新训练项目申请书 | 极致技术工厂

    研究目的 大多数自闭症儿童尚未掌握生活自理能力,无法进行生活自理,给家庭造成极大压力.本团队研究发现通过体育游戏与生活自理结合,在体育游戏的课程中矫正自闭症儿童刻板行为,促进自闭症儿童更好地与外界接触 ...

  7. python练手项目:2048实现与总结

    python练手项目:利用curses界面对2048的实现与总结 涉及的知识点 基本实现 UI展示 curses的初始化方法:wrapper curses的屏幕展示语句:addscr curses正式 ...

  8. 001 | “版绘童印”——疫情时代下版画在儿童插画中应用研究 | 大学生创新训练项目申请书 | 极致技术工厂

    本项目以新冠疫情防控为主题,版画插画为表达形式,针对乡村儿童疫情防控教育,创作疫情为主题的儿童插画.集儿童插画.版画,儿童防疫教育为一体.在当下信息交流便利的平台,及时推广相关信息,增加广度和知名度. ...

  9. 016 | 乡村振兴战略下农村宅基地有偿退出现状 | 大学生创新训练项目申请书 | 极致技术工厂

    (一)研究目的 随着国家城市化进程的加快,城市和农村的具体情况都发生了巨大变化,大量的问题随之产生,在农村经济中,宅基地的有偿退出矛盾尤为突出.在当前的时代发展背景下,我国农村宅基地有偿退出存在着较多 ...

最新文章

  1. java 比较对象内容是否相同的_Java 比较对象中的内容是否一致
  2. .Net 操作MSMQ
  3. oracle日期相减工作日_Oracle 计算两个日期间隔的天数、月数和年数
  4. [转载]关于申请国外博后的一点经验和想法
  5. c/c++的全局变量
  6. 数据库中触发器、事务
  7. VMware中的三种网络模式-----NAT模式
  8. 特斯拉Model 3本周平均日产约900辆 7000辆周产量有望
  9. LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
  10. js学习(六)- js对象创建
  11. window下的git工具msysgit的使用
  12. 2022年黑马程序员火爆全网的自学Java必刷教程(价值2w+的教程免费分享)
  13. 成都信息工程大学上岸软件工程专硕经验分享
  14. 手机无线电驾驶与马歇尔·麦克卢汉的哲学
  15. 计算机专业人士研究生论文,计算机专业研究生论文致谢
  16. ^_^Hostname openapi.alipaydev.com not verified:
  17. 用scrapy进行网页抓取
  18. java单词排序_java中实现将输入的单词按首字母排序
  19. 完美用Nlite添加ACHI SATA驱动至XP镜像
  20. 被 GitHub 「临时邮箱」项目拉黑,Firefox Relay 引热议;业内首个开源容器安全平台发布;Deepin 20.4 发布 | 开源日报

热门文章

  1. GCD 信号量控制并发 (dispatch_semaphore)
  2. T-SQL基础--TOP
  3. sql查询重复记录、删除重复记录方法大全
  4. 刺客信条起源计算机内存不足,刺客信条起源需要什么配置能玩?最低/推荐配置需求介绍...
  5. softmax回归的从零开始实现-09-p4
  6. context c语言作用,理解 Go context
  7. 短时间让大家对C++ STL有所学习
  8. Unicode16 与 UTF-8编码之间的转换
  9. QUIC/UDT/SRT
  10. JavaScript——模块化的历史进程梳理