我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++编写实现飞机大战

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++编写实现飞机大战

本文实例为大家分享了C++编写实现飞机大战的具体代码,供大家参考,具体内容如下

前几天看大佬写了个神经网络训练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];
        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] = '#';
            }
            else
                map[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;
    else
        n += 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;
                    }
                    else
                        map[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;
    }
    else
        map[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;
}

效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++编写实现飞机大战

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言如何实现飞机大战

本文小编为大家详细介绍“C语言如何实现飞机大战”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现飞机大战”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体代码如下#include#i
2023-07-02

Python实现简单飞机大战

本文实例为大家分享了Python实现简单飞机大战的具体代码,供大家参考,具体内容如下 功能 玩家飞机可以移动,可以发射子弹,敌机随机产生,自由坠落。未添加击落敌机的功能。主要用来练习类的封装与继承。 源码# -*- coding=utf-8
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录