每晚两个C词汇小工程项目,提高你的程式设计潜能!
那时用C词汇来同时实现过过瘾直升机的格斗游戏!精确的说假如叫《反坦克车打直升机》两辆车在上面,四种类别的直升机在飞临乱数速率飞到(急速再次出现),所以直升机飞到的这时候朝著下方扔手榴弹,在格斗游戏下方也增设了平均分和车的生命值,假如你被炸到了所以就会生命值-1,射杀两架直升机平均分就会加一,直升机不那样罚球也会不那样。
格斗游戏表明:
在格斗游戏中,你驾驭你的反坦克车尽量的多击毁直升机,避开直升机扔的手榴弹。
格斗游戏完结后,你能优先选择再次已经开始格斗游戏。
下列是格斗游戏截屏:
单纯介绍格斗游戏后他们就来试一试吧!
本工程项目校对自然环境:Visual Studio 2019/2022,EasyX应用程序
标识符展现:(间接上源标识符,他们能看注解)
/////////////////////////////////// // 程序名称:反坦克车打直升机 // 操作方式:左 左走 右 右走 空格 发射子弹 #include <graphics.h> #include <vector> #include <ctime> #include <cmath> #pragma comment (lib,“MSIMG32.lib”) #defineKEY_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}}; // 手榴弹 structBOMB {int x; int y; }; // 直升机 struct PLANE { int x; int y; int type; int reload;// 还有多少帧再次扔手榴弹}; vector<PLAYERMISL> misl; vector<PLANE> plane; vector<BOMB> bomb;// 封装好的透明贴图函数 void putpicture(intx,inty,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; } } // 创建一颗反坦克导弹 voidcreatemisl() { 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); } // 创建两架直升机 voidcreateplane() { PLANE newplane; newplane.x=500; newplane.y=rand()%181+20; newplane.type=rand()%3; newplane.reload=10; // 手榴弹发射间隔时间为10帧 plane.push_back(newplane); } // 加载图片资源 voidloadres() { 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); } } // 每帧绘图 voidrender() {char info[25]; SetWorkingImage(&buffer); // 先在缓冲区绘图 putimage(0,0,&background); putpicture(playerx,playery,player);// 显示反坦克车vector<PLAYERMISL>::iterator it1; vector<PLANE>::iterator it2; vector<BOMB>::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); // 把缓冲区绘图内容一次性绘制上去,这样能消除闪烁 } intWINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { srand(time(NULL)); loadres(); initgraph(500,400); setbkmode(TRANSPARENT); vector<PLAYERMISL>::iterator it1; vector<PLANE>::iterator it2; vector<BOMB>::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; }他们赶紧去动手试一试吧!
此外,我也给他们撷取我收集的其他资源,从最零此基础已经开始的教程到C词汇C++工程项目案例,帮助他们在学习C词汇的道路上披荆斩棘!
程式设计学习书籍撷取:
程式设计学习视频撷取:
整理撷取(多年学习的源标识符、工程项目实战视频、工程项目笔记,此基础入门教程)最重要的是你能在群里面交流提问程式设计问题哦!
对于C/C++感兴趣能关注小编在后台私信我:【程式设计交流】一起来学习哦!能领取一些C/C++的工程项目学习视频资料哦!已