前几天看大佬写了个神经网络训练AI玩飞机大战,我想,凭我现有知识能不能也写一个飞机大战,就进行了尝试,成果如下。

#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<windows.h>
using namespace std;
const int mapx = 40, mapy = 35, cost = 2, prise = 5;   //cost: cost of bullet,   prise: prise of killing a enemy.
class plane
{public:void start();private:void reset();void get_enemy(int &y);void print() const;void update_print();char map[mapx][mapy];/*      plane model:      /=|=\           */int plane_y, plane_x, score, cont;
};

到此我们设计了飞机的模型(我水平不够 整个游戏就用一个类了- -,这个类其实是整个游戏的类 不是飞机类)关于变量cont的说明我放在后面了 接下来我写了一个初始化函数,为类内变量初始化。

void plane::reset()
{for(int i = 0; i < mapx; i++){for(int j = 0; j < mapy; j++){if(!i || !j || j == mapy - 1){map[i][j] = '#';}elsemap[i][j] = ' ';}}plane_x = mapx - 1;plane_y = mapy/2 - 2;score = cont = 0;map[plane_x][plane_y] = '/';map[plane_x][plane_y + 1] = map[plane_x][plane_y + 3] = '=';map[plane_x][plane_y + 2] = '|';map[plane_x][plane_y + 4] = '\\';
}

然后我利用时间参数的随机数得到敌机的位置,这里其实有个问题,因为时间是按一定顺序均匀变化的,我们如果直接用时间作随机数种子的话,敌机的出现会非常均匀,因此我引入了一个cont变量,用来打乱我们均匀的时间参数的个位数。具体使用见后文。

void plane::get_enemy(int &y) const
{srand(int(time(0)));int n = rand();if(cont%2)n -= cont;elsen += cont;y = n % (mapy - 2) + 1;
}

这个函数就是随机生成敌机的位置,cont在此就起到打乱随机生成数的个位数的目的,每更新一次,cont++,为防止cont过大,我规定cont==10时,就将cont = 0,使其能在1到9变化,影响个位数。

void plane::print() const
{system("cls");for(int i = 0; i < mapx; i++){for(int j = 0; j < mapy; j++){cout<<map[i][j];}cout<<endl;}cout<<"Score : "<<score<<'.'<<endl<<"Pay "<<cost<<" scores to send '+' and get "<<prise<<" scores by killing enemies."<<endl;
}

这里是一个打印的函数,不赘述。

void plane::update_print()
{for(int i = 1; i < mapx; i++){for(int j = 1; j < mapy - 1; j++){if(map[i][j] == 'M'){if(i == mapx - 1)map[i][j] = ' ';else if(map[i + 1][j] == '+'){map[i][j] = map[i+1][j] = ' ';score += prise;}}else if(map[i][j] == '+'){map[i][j] = ' ';if(i != 1)map[i-1][j] = '+';}}}for(int i = mapx - 2; i > 0; i--){for(int j = 1; j < mapy - 1; j++){if(map[i][j] == 'M'){if(i != mapx - 1)if(map[i+1][j] == '+'){map[i + 1][j] = ' ';score += prise;}elsemap[i + 1][j] = 'M';map[i][j] = ' ';}}}int enemy_y;get_enemy(enemy_y);if(map[1][enemy_y] == '+'){map[1][enemy_y] = ' ';score += prise;}elsemap[1][enemy_y] = 'M';for(int i = 0; i < 5; i++){if(map[plane_x][plane_y + i] != 'M')map[plane_x][plane_y + i] = ' ';}bool jleft, jright, jup, jdown;jleft = jright = jup = jdown = false;if(GetAsyncKeyState(VK_LEFT) & 0x8000)if(plane_y != 1)jleft = true;if(GetAsyncKeyState(VK_RIGHT) & 0x8000)if(plane_y + 4 != mapy - 2)jright = true;if(GetAsyncKeyState(VK_UP) & 0x8000)if(plane_x != 1)jup = true;if(GetAsyncKeyState(VK_DOWN) & 0x8000)if(plane_x != mapx - 1)jdown = true;if(!(jleft && jright)){if(jleft)plane_y--;if(jright)plane_y++;}if(!(jup && jdown)){if(jup)plane_x--;if(jdown)plane_x++;}if(GetAsyncKeyState(VK_SPACE) & 0x8000){score -= cost;if(map[plane_x - 1][plane_y + 2] == ' ')map[plane_x - 1][plane_y + 2] = '+';else if(map[plane_x - 1][plane_y + 2] == 'M'){map[plane_x - 1][plane_y + 2] = ' ';score += prise;}}if(map[plane_x][plane_y]=='M'||map[plane_x][plane_y+1]=='M'||map[plane_x][plane_y+2]=='M'||map[plane_x][plane_y+3]=='M'||map[plane_x][plane_y+4]=='M'){system("cls");for(int i = 0; i < mapx; i++){cout<<"GAME OVER."<<endl;}cout<<"Your final scores are "<<score<<'.'<<endl;system("pause");exit(1);}map[plane_x][plane_y] = '/';map[plane_x][plane_y + 1] = map[plane_x][plane_y + 3] = '=';map[plane_x][plane_y + 2] = '|';map[plane_x][plane_y + 4] = '\\';cont++;if(cont == 10)cont = 0;print();
}

这个函数我其实感觉自己写的太大了,应该进一步分装,这确实是个不足之处。具体操作就是每轮对飞机的移动,还有子弹和敌机的前进以及判断子弹是否达到敌机和我们的飞机是否撞到敌机。其中我用到了windows.h文件中的GetAsyncKeyState函数,其参数为键盘某个键的VK值(可查表),返回一个16个位的数(因操作系统不同而不同,我的计算机是返回16位)。若该键在上次判断到此次判断之间被按下过,则0号位为1,反之为0;若该键正在被按下,则15号位为1,反之为0.将返回值与0x8000作“与&”操作,则第一位的数字决定了我们&操作的结果。因为XXXX XXXX XXXX XXXX & 1000 0000 0000 0000 == X000 0000 0000 0000.从而操控我们的飞机。

void plane::start()
{reset();while(1){Sleep(50);update_print();}
}

开始函数,用以从类外部访问类内的private函数,并且组织起循环。
然后 用主函数运行即可。

int main()
{plane plane_game;plane_game.start();return 0;
}

效果如下:

小白尝试c++编写飞机大战相关推荐

  1. 用Java编写飞机大战游戏

    飞机大战(Plane War)是一款非常受欢迎的小游戏,它通过增加玩家的难度和挑战性,促使玩家不断提高自己的操作能力和反应速度,并在升级过程中逐步拓展游戏世界的规模和内容.本文将介绍如何使用Java编 ...

  2. 游戏角色坐标的保存间隔_使用C++编写飞机大战游戏【手把手教程】

    友情地提示本文较长,建议保存,慢慢学学.可以直接观看视频教程. C++干大事系列之游戏篇:Qt飞机大战​yun.itheima.com 1.项目简介 飞机大战是我们大家所熟知的一款小游戏,本教程就是教 ...

  3. JS原生编写飞机大战小蜜蜂游戏

    javascript设计模式之单体模式--飞机大战小蜜蜂游戏 单体是一个用来划分命名空间并将一批相关的属性和方法组织在一起的对象,如果他可以被实例化,那么他只能被实例化一次. 单体模式是javascr ...

  4. 转载:python中的pygame编写飞机大战(一)游戏框架搭建

    作者:还在琢磨  来源:CSDN  原文:https://blog.csdn.net/mbl114/article/details/78074742  版权声明:本文为博主原创文章,转载请附上博文链接 ...

  5. 转载:python中的pygame编写飞机大战(三) 子弹类的实现

    作者:还在琢磨  来源:CSDN  原文:https://blog.csdn.net/mbl114/article/details/78075095  版权声明:本文为博主原创文章,转载请附上博文链接 ...

  6. canvas编写飞机大战

    整体分析 1.定义游戏状态 (1)游戏欢迎状态 START (2)游戏加载状态 LOADING (3)游戏运行状态 RUNNING (4)游戏暂停状态 PAUSE (5)游戏结束状态 GAMEOVER ...

  7. 小伙教你用C++编写飞机大战,编程学习,有源代码哦

    很好玩的一款飞行射击游戏,运行后才知道原来是模仿的雷电游戏,这里游戏是向大家讲述飞行游戏类游戏的编程原理,因此游戏本身只相当于雷电初级的难度,贵在学习,包中包含作者的开发文档,完整源代码资料及EXE执 ...

  8. Java多线程编写简易飞机大战(一)

    ** Java多线程编写简易飞机大战(一) ** 利用多线程编写飞机大战,主要有3个关键: ①继承Thread类,重写run方法: ②线程工作代码在run方法中写: ③启动时,调用线程对象的start ...

  9. ES6飞机大战篇-封装全局定时器

    最近在编写飞机大战,开发到一半想到 是否可以选择暂停游戏 常见的清理就是用 clearTimerout 或者 clearInterval 那么 如果数量多了 就会出现有些定时器没有清理的问题 为了避免 ...

最新文章

  1. PX4多机ros仿真报错
  2. android exchange服务,带有“ Service com.android.exchange.ExchangeService
  3. c++ 优先队列_std::priority_queue(优先队列)
  4. 【Android 进程保活】oom_adj 值 ( 简介 | 查询进程 PID | 根据进程 PID 查询 oom_adj 值 )
  5. python中使用for循环,while循环,一条命令打印99乘法表
  6. 《快速软件开发——有效控制与完成进度计划》
  7. ios 不同的数据类型转化为json类型
  8. 深度学习 训练吃显卡_在深度学习中喂饱GPU
  9. JavaScript的对象
  10. 控制台ui_设计下一代控制台UI
  11. 山西最值得一去的5座古镇,你都去过吗?
  12. 集合、深浅拷贝、文件操作(读、写、追加)函数初识(参数)
  13. Meta宣布将关闭面部识别系统 删除超10亿用户面部扫描数据
  14. 国家网信办:掌握超过100万用户个人信息运营者赴国外上市需申报审查
  15. 不断被刷新的未来——读文档有感
  16. VMware安装VyOS
  17. linux卸载rpm包的命令,Linux RPM包安装、卸载和升级(rpm命令)
  18. 大数据分析如何跟踪迁移模式
  19. npm login报错:npm notice Beginning October 4, 2021, all connections to the npm registry.......
  20. 【测试】抓包获取浏览器UA,并使用Chrome 调试工具模拟手机

热门文章

  1. 更改DDWRT的默认配置基本步骤
  2. ALSA --- amixer控制声卡驱动实现Line-in功能
  3. 胖子和瘦子谁更怕冷?
  4. Unity Shader - 羽化效果
  5. Android自定义view之围棋动画
  6. Codeforces 711B- Chris and Magic Square
  7. 直播代码Flutter 实现虎牙/斗鱼 弹幕效果
  8. Pwn2Own 2022 温哥华大赛Master of Pwn 诞生
  9. 数据屏蔽:静态与动态
  10. Python 条件语句if的语法、注意事项、代码示例