首页 > 其他分享 >课程设计飞机大战————代码大全

课程设计飞机大战————代码大全

时间:2023-06-26 10:14:57浏览次数:37  
标签:enemy 课程设计 img int 大战 player live bull 大全

#include<graphics.h>//easyx图形库
#include<iostream>
#include<conio.h>
using namespace std;
IMAGE bk;//指向背景图
IMAGE img_player[2];//指向飞机
IMAGE img_bullet[2];//指向子弹
IMAGE img_enemy[2][2];//指向敌机
int thecount = 0;
int thatcount = 0;
enum theWindows//存储窗口的属性
{
    WIDTH = 640,//宽度
    HEIGHT = 700,//高度
    BULLET_NUM = 15,//子弹数量
    ENEMY_NUM=10,//敌机数量
    BIG,//大飞机
    SMALL//小飞机
};
class Plane {
public:
    int x;//横坐标
    int y;//纵坐标
    bool live;//判断飞机是否存活
    int width;
    int height;
    int hp;
    int type;
}player,bull[BULLET_NUM],enemy[ENEMY_NUM];
void loadImage()//加载图片
{
    //这里因为unicode字符集会报错,所以我把字符集改成了多字节字符集
    //加载背景
    loadimage(&bk, "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/background.jpg");
    //加载玩家
    loadimage(&img_player[1], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/role.png");//黑底彩图
    loadimage(&img_player[0], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/role_1.png");//白底黑图
    //加载子弹
    loadimage(&img_bullet[1], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/bullet.png");//黑底彩图
    loadimage(&img_bullet[0], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/bullet_1.png");//白底黑图
    //加载敌机
    loadimage(&img_enemy[0][1], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/enemy.png");//黑底彩图
    loadimage(&img_enemy[0][0], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/enemy_1.png");//白底黑图
    loadimage(&img_enemy[1][1], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/enemy2.png");//黑底彩图
    loadimage(&img_enemy[1][0], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/enemy2_1.png");//白底黑图
}
bool Timer(int ms, int id)//计时器
{
    static DWORD time1[10];
    if (clock() - time1[id] > ms)
    {
        time1[id] = clock();
        return true;
    }
    return false;
}
void button(int x,int y,int w,int h)
{
    setfillcolor(BROWN);
    fillroundrect(x,y,x+w,y+h,10,10);
    outtextxy(x, y, "button");
}
void enemyType(int i)//敌机类型以及数据初始化
{
    static unsigned times;
    times = time(NULL);
    srand(times);//把种子随机
    if (rand() % 10 > 5)
    {
        enemy[i].type = BIG;
        enemy[i].hp = 3;
        enemy[i].width = 200;
        enemy[i].height = 200;
    }
    else {
        enemy[i].type = SMALL;
        enemy[i].hp = 1;
        enemy[i].width = 100;
        enemy[i].height = 73;
    }
}
void CreateEnemy()//敌机激活
{
    for (int i = 0; i < ENEMY_NUM; i++)
    {
        if (!enemy[i].live)
        {
            enemyType(i);
            enemy[i].x = rand() % (WIDTH-60);
            enemy[i].y = -enemy[i].height;
            enemy[i].live = true;
            break;
        }
    }
}
void EnemyMove(int speed) //敌机移动
{
    for (int i = 0; i < ENEMY_NUM; i++)
    {
        if (enemy[i].live)
        {
            enemy[i].y += speed;
            if (enemy[i].y > HEIGHT)
            {
                enemy[i].live = false;
                player.hp--;
                thecount++;
            }
        }
    }
}
void CreateBullet()//子弹激活
{
    for (int i = 0; i < BULLET_NUM; i++)
    {
        if (!bull[i].live)
        {
            bull[i].x = player.x+45;
            bull[i].y = player.y;
            bull[i].live = true;
            break;
        }
    }
}
void BulletMove(int speed)//子弹运动
{
    for (int i = 0; i < BULLET_NUM; i++)
    {
        if (bull[i].live)
        {
            bull[i].y -= speed;
            if (bull[i].y < -5)//子弹超出地图边界则自毁
            {
                bull[i].live = false;
            }
        }
    }
}
void GameInit()//游戏初始化
{
    loadImage();//加载图片
    setbkmode(TRANSPARENT);//去除字体背景色
    settextcolor(BLACK);//统一字体颜色黑色
    /*
    * 初始化飞机
    */
    player.x = WIDTH / 2;
    player.y = HEIGHT - 76;
    player.hp = 5;
    player.live = true;
    /*
    * 初始化子弹
    */
    for (int i = 0; i < BULLET_NUM; i++)
    {
        bull[i].x = 0;
        bull[i].y = 0;
        bull[i].live = false;
    }
    /*
    * 初始化敌机
    */
    for (int i = 0; i < ENEMY_NUM; i++)
    {
        enemy[i].live = false;
    }
}
void GameDraw()//绘制游戏
{
    loadImage();
    putimage(0, 0, &bk);//布置背景
    char playerHP[10],playerLose[10],playerShoot[10];
    sprintf_s(playerHP,"%d",player.hp);
    sprintf_s(playerLose, "%d", thecount);
    sprintf_s(playerShoot, "%d", thatcount);
    outtextxy(0, 0, "生命值:");
    outtextxy(60, 0, playerHP);
    outtextxy(0, 20, "遗落数:");
    outtextxy(60, 20,playerLose);
    outtextxy(0, 40, "击落数:");
    outtextxy(60, 40, playerShoot);
    //布置飞机
    putimage(player.x, player.y, &img_player[0],SRCAND);
    putimage(player.x, player.y, &img_player[1],SRCPAINT);
    //布置子弹
    for (int i = 0; i < BULLET_NUM; i++)
    {
        if (bull[i].live)
        {
            putimage(bull[i].x, bull[i].y, &img_bullet[0], SRCAND);
            putimage(bull[i].x, bull[i].y, &img_bullet[1], SRCPAINT);
        }
    }
    //布置敌机
    for (int i = 0; i < ENEMY_NUM; i++)
    {
        if (enemy[i].live)
        {
            if (enemy[i].type == SMALL)
            {
                putimage(enemy[i].x, enemy[i].y, &img_enemy[0][0], SRCAND);
                putimage(enemy[i].x, enemy[i].y, &img_enemy[0][1], SRCPAINT);
            }
            else
            {
                putimage(enemy[i].x, enemy[i].y, &img_enemy[1][0], SRCAND);
                putimage(enemy[i].x, enemy[i].y, &img_enemy[1][1], SRCPAINT);
            }
        }
    }
}
//角色移动,获取键盘消息,上下左右
void PlayerControl(int speed)
{
#if 0
if (_kbhit())//用于解决阻塞问题
{
    char key = _getch();
    //1._getch() 阻塞函数,和scanf一样,如果没有输入就会卡主程序,一直等待输入,并且这个函数不是C语言标准函数,需要包含头文件<conio.h>
    switch (key)
    {
    case 'w':
    case 'W':
        player.y -= speed;
        break;
    case 's':
    case 'S':
        player.y += speed;
        break;
    case 'a':
    case 'A':
        player.x -= speed;
        break;
    case 'd':
    case 'D':
        player.x += speed;
        break;
    }
}
#elif 1
    //使用windows函数获取键盘输入GetAsyncKeyState,非常丝滑,不是阻塞函数
    if (GetAsyncKeyState(VK_UP))
    {
        if (player.y > 0)//如果超出上边界,则不能向上移动
        {
            player.y -= speed;
        }
    }
    if (GetAsyncKeyState(VK_DOWN))
    {
        if (player.y < HEIGHT -75)//如果超出下边界,则不能向下移动
        {
            player.y += speed;
        }
    }
    if (GetAsyncKeyState(VK_LEFT))//如果超出左边界,则不能向左移动
    {
        if (player.x > -50)
        {
            player.x -= speed;
        }
    }
    if (GetAsyncKeyState(VK_RIGHT))//如果超出右边界,则不能向右移动
    {
        if (player.x < WIDTH -50)
        {
            player.x += speed;
        }
    }
#endif
    if (Timer(500, 0) && GetAsyncKeyState(VK_SPACE))//若按下空格则发射子弹
    {
        CreateBullet();
    }
}

void playGame()//游戏机制
{
    for (int i = 0; i < ENEMY_NUM; i++)
    {
        if (!enemy[i].live)
        {
            continue;
        }
        for (int j = 0; j < BULLET_NUM; j++)
        {
            if (!bull[j].live)
            {
                continue;
            }
            if (bull[j].x>enemy[i].x&&bull[j].x<enemy[i].x+enemy[i].width&& bull[j].y>enemy[i].y && bull[j].y < enemy[i].y + enemy[i].height)
            {
                bull[j].live = false;
                enemy[i].hp--;
            }
        }
        if (player.x > enemy[i].x && player.x<enemy[i].x + enemy[i].width && player.y>enemy[i].y && player.y < enemy[i].y + enemy[i].height)//碰撞
        {
            enemy[i].live = false;
            player.hp--;
        }
        if (enemy[i].hp <= 0)
        {
            enemy[i].live = false;
            thatcount++;
        }
        if (player.hp <= 0)
        {
            player.live = false;
        }
    }
}
int main()
{
    //创建一个窗口,之前都是控制台的窗口,现在要有一个可视化图形窗口这里我使用的是easyx图形库
    initgraph(WIDTH, HEIGHT,SHOWCONSOLE);
    GameInit();
    //双缓冲绘图
    BeginBatchDraw();
    while (true)
    {
        GameDraw();
        FlushBatchDraw();
        PlayerControl(5);
        BulletMove(3);
        if (Timer(1500, 1))
        {
            CreateEnemy();
        }
        EnemyMove(2);
        playGame();
        if (!player.live)
        {
            break; 
        }
    }
    EndBatchDraw();
    cout << "击落数:"<<thatcount<<endl;
    cout << "遗漏数:" << thecount << endl;
    char c;
    cin >> c;
    return 0;
}

注:图形库用的easyx,编译器用的VS2022,素材都是自己扣的

其中“黑底彩图”类似这种

白底黑图是类似这种

因为需要用到透明拼贴我都是用PS扣的素材

源码中

loadimage(&img_enemy[0][1], "C:/Users/pz001/Desktop/陈俊杰/飞机大战/images/enemy.png");//黑底彩图
字符串中的是路径,用于寻找图片,大家需要自己重新编译

标签:enemy,课程设计,img,int,大战,player,live,bull,大全
From: https://www.cnblogs.com/nashacjj/p/17504596.html

相关文章

  • Python+mysql+tkinter+matplotlib的可视化学生成绩管理系统课程设计
    使用模块要求:tkinter、numpy、openpyxl、matplotlib、pymysql、re、time;其中matplotlib用于绘制统计图开发工具:pycharm专业版、python3.7、mysql8.0需要咨询、源码、定做、QQ扫码加:https://img-mid.csdnimg.cn/release/static/image/mid/ask/153137086786150.jpg点击此处链接......
  • springboot+vue基于Web的社区医院管理服务系统,附源码+数据库+论文+PPT,适合课程设计、
    1、项目介绍在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区医院信息管理功能的选择。社区医院管理服务系统......
  • C/C++C/C++语言课程设计参考题目[2023-06-25]
    C/C++C/C++语言课程设计参考题目[2023-06-25]《高级程序设计技术综合课程设计》C/C++语言课程设计参考题目目录信息管理类 1工资管理系统 1职工工资信息管理系统 2职工工资管理系统 2院职工工资管理系统 3公司职工工资管理系统 3工资纳税计算系统 3校际运动会管理系统......
  • 干货分享|DevExpress v23.1帮助文档下载大全
    获取DevExpressv23.1版本下载好消息!DevExpress v23.1帮助文档下载列表大全来啦,小编已经为大家悉心整理好了!包含.NET系列所有重要控件的帮助文档,目前仅提供CHM版本。文章底部扫描关注微信公众号,回复关键字获取帮助文档下载提取码哦!!.NET:版本CHM格式WinFormsControls......
  • Android面试题合集大全(2023最新版),1600+面试题附答案详解,字节大佬力推
    接触Android已经3年,在工作中遇到疑难问题总是在网上(csdn大牛博客,stackoverflow等)搜索答案,各位大牛大神总是把自己的经验分享出来,帮助我们这些需要帮助的人,由此表示衷心感谢!然而现在自己细想了一下,自己也是时候把遇到的问题并把解决方案分享出来,希望能帮助到有需要的人。现在小公司......
  • 如何运用dos命令进入C盘?Dos常用命令大全
    1、在开始界面找到运行,快捷键Win+R,输入命令cmd,点击确定2、现在我们已经进入以下界面3、在Administrator>后面输入c:dir列文件名deltree删除目录树cls清屏cd改变当前录copy拷贝文件diskcopy复制磁盘del删除文件format格式化磁盘more分屏显示type显示文件内容rd删......
  • 基于springboot+vue的漫画之家管理系统,附源码+数据库+论文+PPT,适合课程设计、毕业设计
    1、项目介绍随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,“漫画之家”系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计......
  • proteus8.7下载-proteus最新版下载-电路仿真软件 软件大全
    ProteusPro下载特色1、适用于Windows10的官方支持2、增强的BOM报告和取放输出格式。3、为DXF输出的各种兼容性的改进。5、系统范围的更新,以支持高DPI显示器。[下载地址]:后台私信我proteus8.4电脑版软件特色智能的器件搜索通过模糊搜索可以快速定位所需要的器件丰富的器件库拥有超......
  • proteus下载-proteus8.7破解版下载「仿真软件」软件大全
    Proteus是英国LabCenterElectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教......
  • PhpStorm 2021.3软件下载及安装教程 绿色破解版 软件大全
    PhpStorm是一款由phpstorm的最新PHP开发软件,使用为用户提供了最全面最强大的开发解决方案。它的功能非常的卡u按,基本上大家需要用到的这里都有,全面满足需求,现在的PHPSTORM在2019年的首个版本已经发布,新版本带来了重大的更新,可以更快的进行调试,通过使用PhpStorm和Xdebug直接在这两个......