背景

记得小时候经常和爷爷在水泥地上,随手抓来两颗石子,一边口里念叨“小货兵摆大炮”,一边在地上划下横竖各6条道,然后在从旁边的土地上捡一些小石子和两个大石块,小石子代表小兵,大石块代表大炮。


游戏规则

  1. 小兵每次可移动一步,方向为前后左右。
  2. 大炮每次可移动一步,方向为前后左右。当大炮与小兵中间有一个空位,大炮可以选择吃掉小兵。
  3. 大炮与小兵的移动范围不能超过棋盘边界。

胜利规则

  1. 当大炮无法移动时,小兵获胜,即小兵把大炮逼到游戏边界处。
  2. 当小兵被大炮全部干掉时,大炮获胜。

代码实现

  1. Bing.h:代表小兵

    #ifndef BING_H_
    #define BING_H_
    #include <iostream>
    enum class Dir{Up = 0,Down,Left,Right
    };
    class Bing
    {private:int x;int y;int length;int width;public:Bing(int _x,int _y);bool Move(Dir dir);std::pair<int,int> getPosition();~Bing();
    };#endif
    
  2. Pao.h:炮

    #ifndef PAO_H_
    #define PAO_H_
    #include "Bing.h"
    class Pao:public Bing
    {private:public:Pao(int _x,int _y);~Pao();
    };
    #endif
    
  3. Game.h:游戏类

        #include "Bing.h"#include "Pao.h"#include <vector>class Game{private:int length;int width;int bingRows;int paoNum;int **sence;std::vector<Bing*> bings;std::vector<Bing*> delBings;std::vector<Pao*> paos;public:Game();void updateSence();void show();bool isBingsWin();bool isPaosWin();bool MovePao();bool MoveBing();void run();~Game();};
    
  4. Game.cpp游戏类的实现

    #include <iostream>
    #include "Game.h"using namespace std;Game::Game()
    {length = 6;width = 6;bingRows = 3;paoNum = 2;sence = new int*[length];for(int i=0;i<length;++i){sence[i] = new int[width];}for(int i=0;i<bingRows;++i){for(int j=0;j<width;++j){Bing* bing = new Bing(i,j);bings.push_back(bing);}}int row = bingRows-1+2;int col = width/2-1;for(int i=0;i<paoNum;++i){Pao* pao = new Pao(row,col+i);paos.push_back(pao);}}void Game::updateSence(){for(int i=0;i<length;++i){for(int j=0;j<width;++j){sence[i][j] = 0;}}for(int i=0;i<bings.size();++i){for(auto bing:bings){auto pos = bing->getPosition();sence[pos.first][pos.second] = 1;}}for(auto pao:paos){auto pos = pao->getPosition();sence[pos.first][pos.second] = 2;}
    }void Game::show(){updateSence();for(int i=0;i<length;++i){for(int j=0;j<width;++j){if(sence[i][j] == 1){printf("* ");}else if(sence[i][j] == 2){printf("+ ");}else{printf("  ");}}printf("\n");}
    }bool Game::isBingsWin(){bool flag = true;for(auto pao:paos){auto pos = pao->getPosition();auto up = std::make_pair(pos.first-1,pos.second);if(up.first>=0&&up.first<length&&up.second>=0&&up.second<width){if(sence[up.first][up.second] == 0){flag = false;}}up = std::make_pair(pos.first+1,pos.second);if(up.first>=0&&up.first<length&&up.second>=0&&up.second<width){if(sence[up.first][up.second] == 0){flag = false;}}up = std::make_pair(pos.first,pos.second-1);if(up.first>=0&&up.first<length&&up.second>=0&&up.second<width){if(sence[up.first][up.second] == 0){flag = false;}}up = std::make_pair(pos.first,pos.second+1);if(up.first>=0&&up.first<length&&up.second>=0&&up.second<width){if(sence[up.first][up.second] == 0){flag = false;}}}return flag;
    }bool Game::isPaosWin(){ if(bings.size()<4){return true;}return false;
    }bool Game::MovePao(){Pao* pao;printf("请选择你要移动的炮(1/2):");int x;cin>>x;if(x != 1 && x != 2){printf("你选择的炮无效,请重新选择!\n");return false;}pao = paos[x-1];auto pos = pao->getPosition();printf("请选择你要进行的操作(移动:1 / 吃兵:2):");cin>>x;if(x != 1 && x != 2){printf("你选择的操作无效,请重新选择!\n");return false;}if(x == 1){printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");char ch;bool flag = false;cin>>ch;if(ch == 'w' || ch == 's' ||ch == 'a' ||ch == 'd'){switch (ch){case 'w':if(pos.first > 0 && sence[pos.first-1][pos.second] == 0){pao->Move(Dir::Up);flag = true;}break;case 's':if(pos.first < length-1 && sence[pos.first+1][pos.second] == 0){pao->Move(Dir::Down);flag = true;}break;case 'a':if(pos.second > 0 && sence[pos.first][pos.second-1] == 0){pao->Move(Dir::Left);flag = true;}break;case 'd':if(pos.second < width-1 && sence[pos.first][pos.second+1] == 0){pao->Move(Dir::Right);flag = true;}break;default:break;}}if(flag){return true;}else{printf("你选择的方向无效,请重新选择!\n");return false;}}else if(x == 2){printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");char ch;bool flag = false;cin>>ch;if(ch == 'w' || ch == 's' ||ch == 'a' ||ch == 'd'){switch (ch){case 'w':if(pos.first > 1 && sence[pos.first-2][pos.second] == 1 && sence[pos.first-1][pos.second] == 0){pao->Move(Dir::Up);pao->Move(Dir::Up);pos = pao->getPosition();auto begin = bings.begin();while (begin != bings.end()){if(pos == (*begin)->getPosition()){delBings.push_back(*begin);bings.erase(begin);break;}begin++;}flag = true;}break;case 's':if(pos.first < length-2 && sence[pos.first+2][pos.second] == 1 && sence[pos.first+1][pos.second] == 0){pao->Move(Dir::Down);pao->Move(Dir::Down);pos = pao->getPosition();auto begin = bings.begin();while (begin != bings.end()){if(pos == (*begin)->getPosition()){delBings.push_back(*begin);bings.erase(begin);break;}begin++;}flag = true;}break;case 'a':if(pos.second > 1 && sence[pos.first][pos.second-2] == 1 && sence[pos.first][pos.second-1] == 0){pao->Move(Dir::Left);pao->Move(Dir::Left);pos = pao->getPosition();auto begin = bings.begin();while (begin != bings.end()){if(pos == (*begin)->getPosition()){delBings.push_back(*begin);bings.erase(begin);break;}begin++;}flag = true;}break;case 'd':if(pos.second < width-2 && sence[pos.first][pos.second+2] == 1 && sence[pos.first][pos.second+1] == 0){pao->Move(Dir::Right);pao->Move(Dir::Right);pos = pao->getPosition();auto begin = bings.begin();while (begin != bings.end()){if(pos == (*begin)->getPosition()){delBings.push_back(*begin);bings.erase(begin);break;}begin++;}flag = true;}break;default:break;}}if(flag){return true;}else{printf("你选择的方向无效,请重新选择!\n");return false;}}}bool Game::MoveBing(){printf("请选择你要移动的兵的位置(x,y):");int x,y;cin>>x>>y;if(x>0&&x<=length&&y>0&&y<=width&&sence[x-1][y-1]==1){}else{printf("你选择的位置无效,请重新选择!\n");return false;}std::pair<int,int> pos(x-1,y-1);Bing* b;for(auto bing:bings){if(pos == bing->getPosition()){b = bing;break;}}printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");char ch;cin>>ch;bool flag = false;switch (ch){case 'w':if(pos.first>0&&sence[pos.first-1][pos.second] == 0){b->Move(Dir::Up);flag = true;}break;case 's':if(pos.first<length-1&&sence[pos.first+1][pos.second] == 0){b->Move(Dir::Down);flag = true;}break;case 'a':if(pos.second>0&&sence[pos.first][pos.second-1] == 0){b->Move(Dir::Left);flag = true;}break;case 'd':if(pos.second<width-1&&sence[pos.first][pos.second+1] == 0){b->Move(Dir::Right);flag = true;}break;default:break;}if(!flag){printf("你选择的方向无效,请重新选择!\n");}return flag;
    }void Game::run(){while(true){system("clear");show();if(isBingsWin()){printf("小兵获胜!\n");break;}while (!MovePao()){}system("clear");show();if(isPaosWin()){printf("大炮获胜!\n");break;}while (!MoveBing()){}}
    }Game::~Game()
    {for(auto bing:bings){delete bing;}for(auto bing:delBings){delete bing;}for(auto pao:paos){delete pao;}
    }
    
  5. main.cpp

    #include <iostream>#include "Game.h"using namespace std;int main(){Game* g = new Game();g->run(); g->~Game();return 0;
    }
    

实现效果

  1. 游戏开始界面,炮先行

  2. 当炮吃掉一个小兵后的游戏场景

  3. 小兵移动的方式


后记

这个小游戏做完后,和朋友试玩了一下,发现有个bug,然后修正了。又试玩了一局,I win!
下一个小游戏做连连看吧!


(想要源码的,可以私信我!)

C++之《小货兵摆大炮》相关推荐

  1. 小王的摆烂日记之6月工作总结

    数引系统基本已经完了,注意一下以后写算法一定要先写伪代码,别摆烂 卡尔曼滤波掌握的还可以,之后可以看一下惯导与GNSS数据融合的代码 之后的相关工作,DD的红外目标识别与追踪 先做调研!!!!

  2. 《小投入快收入》—— 创业经

    喜糖包装店 目前市场上的喜糖包装往往千篇一律,或者糖好吃包装不够漂亮,或者包装好看糖的口味和品种一般.时下开个喜糖包装店肯定有市场. 开喜糖包装店经营提醒:开动脑筋,把喜糖的范围扩大.比如:洞房之喜. ...

  3. 苹果App Clips入场,中心化+开放生态或许是小程序的未来

    文|曾响铃 来源|科技向令说(xiangling0815) 12年前,苹果通过App Store改变了行业. 12年后,苹果在最近的WWDC2020上宣布,将在App Store新增"App ...

  4. 新手怎么开水果店,新手开小水果店要了解什么

    这里是水果店同行老板圈子,第561次分享,持续分享干货,帮助新手入门. 1.开水果店一定要选好店址 像生活区,医院旁边,菜市场口这些都是非常非常好的地方,具体选什么地方,还需要亲自考察,另外选在没有一 ...

  5. 修改so_货代、海运操作、船务操作还分不清?船公司SO文件看不懂?

    货代是货物代理(freight forwarding agent)的简称,是指经营受他人委托,为其提供代办运输手续,代提.代发.代运货物服务的业务. 货物代理,有些是中间商就是自己没有船或者飞机的或者 ...

  6. 《小强与小明》——正在疯传的伟大的故事

    1.小强每天在村里晃悠,爹妈看着发愁,心想这孩子将来怎么办呀:小明每日都苦读诗书,父母喜在心里,村里人都认定他必有出息. 2.那年,小强和小明都是十九岁,小强跟着村里的外出打工,来到了高速公路的工地, ...

  7. BAT、360、今日头条的小程序大战 谁会是最后的赢家?

    在当下这个时间节点,属于APP的互联网时代已经过去,小程序正是增长拐点. 自微信在2017年1月正式上线小程序以来,微信小程序应用数量超过了一百万,覆盖200多个细分的行业,日活用户达到两个亿,服务超 ...

  8. 货代的具体工作是什么?

    货代的工作挺杂的,不过主要职责就是起一个联系沟通的作用. 在客户委托来了后,向船公司要舱位,订舱,船公司给你配船通知,你再将船期,船名等情况告知客户; 如场地装箱的把船名,B/L NO填入委托,伟给场 ...

  9. 船东提单和货代提单差距这么大?

    [船东提单和货代提单差距这么大?] 船东提单即指船公司签发的海运提单(Master B/L,又叫主单,海单,简称M单),可以签发给直接货主(此时货代不出提单),也可签发给货代(此时,货代出货代提单给直 ...

最新文章

  1. Paddle Lite端侧部署
  2. shell编程--case判断
  3. java生成和读取keystore_Java程序员必知:mybaties运行流程
  4. python【力扣LeetCode算法题库】206-反转链表
  5. oracle 触发器 merge,如何从触发器中解决Oracle变异错误
  6. JSP+JavaBean+Servlet工作原理实例…
  7. [deviceone开发]-毛玻璃效果示例
  8. [ZJOI2014] 星系调查(树上差分 + 数学推式子)
  9. 如何用相机拍出天空漂亮的云朵
  10. mysql如何连接jdk,JDBC 简单的Mysql连接
  11. Flash网页游戏辅助工具制作简析
  12. 佐罗一键新机数据导出导入文件夹
  13. OTSU算法/大津法/最大类间方差法 python实现
  14. Google正确搜索方法
  15. c语言strlen转义字符,转义字符 sizeof strlen
  16. 权御天下计算机音乐数字乐谱,权御天下-洛天依-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  17. 百度云链接使用迅雷下载时提示有误的问题解决
  18. 外贸:Facebook养号攻略
  19. JS设置请在微信客户端打开链接提示页面
  20. centos6.5卸载图形界面

热门文章

  1. DICOM:DICOM3.0网络通信协议(三)
  2. 模拟演讲者视图_PPT中设置演讲者视图的方法
  3. 中国移动互联,谁能三分天下
  4. 全球与中国椰子提取物市场深度研究分析报告
  5. 教师节主题PPT模板
  6. 回顾蹒跚学步的我(上)
  7. Windows Media Player播放视频导致程序闪退
  8. PDF编辑器怎么用?PDF编辑器的使用方法
  9. 黑科技--- 电影日历/表情搜索/抖音网页版/去水印/网易云游戏平台
  10. 判断文件是否存在,不存在就创建