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 namesp
            ace std; // IMAGE IMAGE buffer(500,400),background,player,missile,planes[3],planebomb; // 玩家x坐标,玩家y坐标,装弹剩余时间,生命值,得分 int playerx=0,playery=286,firerelo
            ad=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 put
               picture(int x,int y,IMAGE img) { H
               DCdstDC = 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) { stat
               icclock_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
               
                ::i
                terator it1; vector
                
                 ::iterator it2; vector
                 
                  ::iterat
                  orit3; 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); // 显示炸弹 } sprin
                  tf(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; }
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        

大家赶紧去动手试试吧!

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

    关注

    2

    文章

    714

    浏览量

    26191
  • C语言
    +关注

    关注

    180

    文章

    7565

    浏览量

    133424
  • 编程
    +关注

    关注

    88

    文章

    3498

    浏览量

    93116
  • 源码
    +关注

    关注

    8

    文章

    624

    浏览量

    28903

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    C语言游戏源码分享

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

    打飞机游戏机电路原理

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

    C语言零基础入门教学资料汇总下载

    C 语言 零基础入门教学资料汇总下载
    发表于05-29 10:41 132次下载

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

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

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

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

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

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

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

    《黑白棋》也叫翻转棋或者奥赛罗,其 游戏过程是相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。虽然规则简单,但是变化复杂,是典型的易学难精,奥妙无穷,不信您就试试看吧!
    的头像 发表于12-29 11:12 831次阅读

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

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

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

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

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

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

    C语言项目:矿井逃生游戏(密室)!详细思路+源码分享

    密室逃脱相信大部分都玩过了吧?本 游戏就是一种用 C 语言写的类似的 游戏,因为用手电筒照明找路,所以有点像矿工的样子,还是叫它矿井逃生吧!(以下是 游戏
    的头像 发表于01-07 09:41 1205次阅读