0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言零基础项目:打飞机游戏!300行源码分享+详细思路

C语言编程学习基地 来源:C语言编程学习基地 2023-01-11 09:31 次阅读

每天一个C语言小项目,提升你的编程能力!

今天用C语言来实现一个打飞机的游戏!准确的说应该叫《防空车打飞机》一辆车在下面,三种类型的飞机在上空随机速度飞过(不断出现),而且飞机飞过的时候会往下方扔炸弹,在游戏上方也设置了分数和车的生命值,如果你被炸到了那么就会生命值-1,打死一架飞机分数就会加一,飞机不一样得分也会不一样。

游戏说明:

在游戏中,你操控你的防空车尽可能的多击落飞机,躲避飞机扔的炸弹。

游戏结束后,你可以选择重新开始游戏。

简单了解游戏后我们就来试试吧!

本项目编译环境:Visual Studio 2019/2022,EasyX插件

代码展示:(直接上源码,大家可以看注释)

///////////////////////////////////
// 程序名称:防空车打飞机
// 操作方式:左 左走 右 右走 空格 发射子弹
#include 
#include 
#include 
#include 
#pragma comment (lib,"MSIMG32.lib")
#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000?1:0)
using namespace std;


// IMAGE
IMAGE buffer(500,400),background,player,missile,planes[3],planebomb;


// 玩家x坐标,玩家y坐标,装弹剩余时间,生命值,得分
int playerx=0,playery=286,firereload=5,strength=50,score=0;


// 玩家防空导弹
struct PLAYERMISL
{
    int x;
    int y;
};


// 飞机类型
struct BOMBPLANE
{
    int speed;  // 飞机速度
    int width;  // 飞机宽度
    int height; // 飞机高度
} bombplane[3]= {{15,85,22},{12,81,22},{8,105,50}};


// 炸弹
struct BOMB
{
    int x;
    int y;
};


// 飞机
struct PLANE
{
    int x;
    int y;
    int type;
    int reload;// 还有多少帧重新扔炸弹
};


vector misl;
vector plane;
vector bomb;




// 封装好的透明贴图函数
void putpicture(int x,int y,IMAGE img)
{
    HDC dstDC = GetImageHDC(&buffer);
    HDC srcDC = GetImageHDC(&img);
    TransparentBlt(dstDC, x, y, img.getwidth(), img.getheight(), srcDC, 0, 0, img.getwidth(), img.getheight(), RGB(40,112,162));
}




// 精确延时
void sleep(int ms)
{
    static clock_t oldclock = clock();      // 静态变量,记录上一次 tick
    oldclock += ms * CLOCKS_PER_SEC / 1000; // 更新 tick
    if (clock() > oldclock)                 // 如果已经超时,无需延时
    {
        oldclock = clock();
    }
    else
        while(clock() < oldclock)           // 延时
        {
            Sleep(1);    // 释放 CPU 控制权,降低 CPU 占用率
        }
}




// 矩形碰撞检测函数
bool collision(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2)
{
    if((abs((x1 + w1 / 2) - (x2 + w2/2)) < (w1 + w2) / 2)&&abs((y1 + h1 / 2) - (y2 + h2/2) )< (h1 + h2) / 2)
    {
        return true;
    }
    else
    {
        return false;
    }
}




// 创建一颗防空导弹
void createmisl()
{
    PLAYERMISL playermisl;
    playermisl.x=playerx+12;
    playermisl.y=playery-4;
    misl.push_back(playermisl);
}




// 创建一颗炸弹
void createbomb(PLANE p)
{
    BOMB b;
    b.x=p.x+bombplane[p.type].width/2-4;
    b.y=p.y+bombplane[p.type].height+2;
    bomb.push_back(b);
}




// 创建一架飞机
void createplane()
{
    PLANE newplane;
    newplane.x=500;
    newplane.y=rand()%181+20;
    newplane.type=rand()%3;
    newplane.reload=10;            // 炸弹发射间隔时间为10帧
    plane.push_back(newplane);
}




// 加载图片资源
void loadres()
{
    loadimage(&background,"IMAGE","BG");
    loadimage(&player,"IMAGE","PLAYER");
    loadimage(&planebomb,"IMAGE","BOMB");
    loadimage(&missile,"IMAGE","MISL");
    char filename[10];
    for(int i=0; i<3; i++)
    {
        sprintf(filename,"PLANE%d",i);
        loadimage(&planes[i],"IMAGE",filename);
    }
}




// 每帧绘图
void render()
{
    char info[25];
    SetWorkingImage(&buffer);                           // 先在缓冲区绘图
    putimage(0,0,&background);
    putpicture(playerx,playery,player);                 // 显示防空车
    vector::iterator it1;
    vector::iterator it2;
    vector::iterator it3;
    for(it1=misl.begin(); it1!=misl.end(); it1++)
    {
        putpicture(it1->x,it1->y,missile);    // 显示防空导弹
    }
    for(it2=plane.begin(); it2!=plane.end(); it2++)
    {
        putpicture(it2->x,it2->y,planes[it2->type]);    // 显示飞机
    }
    for(it3=bomb.begin(); it3!=bomb.end(); it3++)
    {
        putpicture(it3->x,it3->y,planebomb);    // 显示炸弹
    }
    sprintf(info,"生命值:%d 得分:%d",strength,score);
    outtextxy(0,0,info);                                // 显示游戏数据
    SetWorkingImage();
    putimage(0,0,&buffer);                              // 把缓冲区绘图内容一次性绘制上去,这样能消除闪烁
}




int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    srand(time(NULL));
    loadres();
    initgraph(500,400);
    setbkmode(TRANSPARENT);
    vector::iterator it1;
    vector::iterator it2;
    vector::iterator it3;


gamestart:
    bool eraseyes=false;
    while(true)
    {
        if(strength<1)
        {
            break;
        }
        if(plane.size()<3)
        {
            createplane();
        }
        for(it1=misl.begin(); it1!=misl.end();)
        {
            it1->y-=10;
            if(it1->y<0)
            {
                it1=misl.erase(it1);
            }
            else
            {
                ++it1;
            }
        }
        for(it2=plane.begin(); it2!=plane.end();)
        {
            it2->x-=bombplane[it2->type].speed;
            if(it2->x+bombplane[it2->type].width<0)
            {
                plane.erase(it2);
            }
            else
            {
                if(it2->reload==0)
                {
                    it2->reload=10;
                    createbomb(*it2);
                }
                else
                {
                    it2->reload-=1;
                }
                ++it2;
            }
        }
        for(it2=plane.begin(); it2!=plane.end();)
        {
            for(it1=misl.begin(); it1!=misl.end();)
            {
                if(collision(it1->x,it1->y,5,7,it2->x,it2->y,bombplane[it2->type].width,bombplane[it2->type].height))
                {
                    misl.erase(it1);
                    plane.erase(it2);
                    eraseyes=true;
                    score+=1;
                }
                else
                {
                    ++it1;
                }
            }
            if(eraseyes==false)
            {
                it2++;
            }
            else
            {
                eraseyes=false;
            }
        }
        for(it3=bomb.begin(); it3!=bomb.end();)
        {
            it3->y+=5;
            if(it3->y>400)
            {
                it3=bomb.erase(it3);
            }
            else
            {
                ++it3;
            }
        }
        for(it3=bomb.begin(); it3!=bomb.end();)
        {
            if(collision(it3->x,it3->y,5,7,playerx,playery,58,49))
            {
                bomb.erase(it3);
                strength-=1;
            }
            else
            {
                ++it3;
            }
        }
        if(KEY_DOWN(VK_LEFT)&&playerx>=10)
        {
            playerx-=10;
        }
        if(KEY_DOWN(VK_RIGHT)&&playerx<=384)
        {
            playerx+=10;
        }
        if(KEY_DOWN(VK_SPACE)&&firereload==0)
        {
            createmisl();
            firereload=5;
        }
        if(firereload>=1)
        {
            firereload-=1;
        }
        render();
        sleep(33);
    }


    char result[50];
    sprintf(result,"本次得分:%d分,请再接再厉。是否重新开始游戏?",score);
    if(MessageBox(GetHWnd(),result,"游戏结束",MB_YESNO)==IDYES)
    {
        playerx=0;
        playery=286;
        strength=50;
        score=0;
        firereload=5;
        misl.clear();
        plane.clear();
        bomb.clear();
        goto gamestart;
    }


    return 0;
}

大家赶紧去动手试试吧!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 游戏
    +关注

    关注

    2

    文章

    697

    浏览量

    26041
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128790
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92407
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28589

原文标题:C语言零基础项目:打飞机游戏!300行源码分享+详细思路

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言零基项目:涂格子(点灯)游戏详细思路+源码分享

    点灯游戏是一个十分有趣的智力游戏:有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯时他的上下左右(若存在的话)状态全部改变,现在要求你在限定的时间内以最少地步数,将全部的灯点亮。
    发表于 12-16 09:47 692次阅读

    C语言零基项目:贪吃蛇!详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    发表于 12-19 11:04 442次阅读

    基于FRDM-KL25Z开发板的仿微信打飞机游戏

    打飞机游戏就诞生了。实际运行效果不是很理想,控制不是很到位。当然作为电控工程师,一个自己都不满意的东西是不允许存在的,于是我又将触摸滑条控制改为 “重力感应”控制(FRDM-KL25Z上正好带了重力
    发表于 12-31 12:08

    零基础如何入门c语言

    零基础如何入门c语言工作中,接触过很多想到学习c语言而又没有一点计算机基础的人。经常有人问”我没有一点基础,该怎么入门
    发表于 02-13 14:49

    想做一款打飞机游戏

    想将次游戏作为我的毕业设计,求难度评估!要求:飞机上下左右运动,能发射“导弹”,能统计分数,能死亡。画面要求大致美观万一我做不成要有人帮我啊
    发表于 03-13 11:05

    12864飞机大战游戏

    我想用12864液晶屏,STC12C5A60S2,C语言写一个飞机大战游戏,新手上路(我之前做过1602电子钟),没有什么头绪,希望有大佬指
    发表于 04-28 20:18

    零基础怎样学习C语言呢?

    零基础学c语言如何开始
    发表于 05-15 10:23

    C语言游戏源码分享

    C语言游戏源码24点火柴人俄罗斯等等等35个游戏源码网盘分享链接:https://pan.ba
    发表于 04-12 17:11

    打飞机游戏机电路原理

    打飞机游戏机电路原理
    发表于 09-25 23:19 1291次阅读
    炮<b class='flag-5'>打飞机</b><b class='flag-5'>游戏</b>机电路原理

    C语言零基项目:打字母游戏详细思路+源码分享

    今天就用C语言写了这么个打字母的小程序,就是以前学习机上那种字母往下掉,然后按相应键字母消失的游戏
    发表于 12-15 15:02 456次阅读

    C语言零基项目:迷宫游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-21 10:08 628次阅读

    C语言零基项目:生命游戏详细思路+源码分享

    生命游戏不需要任何玩家,它是一个二维矩形世界,这个世界中的每个方格居住着一个活细胞或为空。
    的头像 发表于 12-22 11:17 663次阅读

    C语言零基项目:自制军棋游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-29 17:14 7684次阅读

    C语言零基项目:对对碰(消除类)游戏详细思路+源码分享

    游戏中消除的对象为各种各样的头像,包括树、小车、草莓和酒瓶等一些头像。玩家通关移动这些头像位置凑够一定数量的相同图标即可消除。
    的头像 发表于 01-03 11:13 459次阅读

    C语言零基项目:吃豆人小游戏详细思路+源码分享

    《吃豆游戏》是一款休闲小游戏,和贪吃蛇,球球大作战吃食物都是有差不多的游戏逻辑。
    的头像 发表于 01-03 11:38 988次阅读