C++版本簡(jiǎn)易Flappy bird
大一,上學(xué)期學(xué)完了C,寫了幾個(gè)控制臺(tái)游戲
這學(xué)期自學(xué)C++,由于學(xué)校課程第七周才有C++
邊學(xué)邊寫了這個(gè)小游戲,SDL 圖形庫(kù)完成的圖形繪畫
時(shí)間匆忙,BUG也有,代碼效率比較低
和原作品還是很大的差別, 源代碼在附件游戲文件夾中
演示圖
#include <stdlib.h> #include<windows.h> #include <time.h> #include<conio.h> #include <iostream> #include <mmsystem.h> #include "SDL\SDL_image.h" #include "SDL\SDL_ttf.h" #include "SDL\SDL.h" using namespace std; #pragma comment(lib, "winmm.lib") #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") int iii=0; int score =0; int y=0; int posi[3][2]= {{640,-300},{940,-300},{1240,-300}}; int i=0,n=3; //n為管道對(duì)數(shù) SDL_Color textColor_1 = { 37, 134, 108 };//綠色 //SDL_Color textColor_2 = { 112, 112, 35 }; SDL_Color textColor_2 = { 255, 255, 255 }; //白色 SDL_Color textColor_3 = { 0, 88, 132 }; //白色 class Event { public: SDL_Event event; Uint8 *keystates; Event() { keystates=SDL_GetKeyState( NULL ); } }; Event thing; class Data { public: int bird_y; int score; int posi[20][2]; SDL_Rect bird_1; SDL_Rect bird_2; SDL_Rect bg; SDL_Rect welcome; SDL_Rect pipe_up; SDL_Rect pipe_down; SDL_Rect bird_cls; SDL_Rect foot; SDL_Surface* load_imag(char *s) { SDL_Surface* temp; temp=IMG_Load(s); bg.x=0; bg.y=0; bg.w=640; bg.h=480; welcome.x=681; welcome.y=0; welcome.w=640; welcome.h=480; bird_1.x=17; bird_1.y=508; bird_1.w=52; bird_1.h=34; bird_2.x=461; bird_2.y=531; bird_2.w=52; bird_2.h=33; bird_cls.w=52; bird_cls.h=33; bird_cls.x=0; bird_cls.y=0; pipe_up.x=1361; pipe_up.y=11; pipe_up.w=103; pipe_up.h=410; pipe_down.x=1487; pipe_down.y=14; pipe_down.w=103; pipe_down.h=443; foot.x=0; foot.y=404; foot.w=640; foot.h=80; return temp;//SDL_DisplayFormat( temp ); } TTF_Font* load_font() { SDL_Init( SDL_INIT_EVERYTHING ); TTF_Init(); return TTF_OpenFont( "main_1.dat", 36 ); } }; Data data; class Pri { public: SDL_Surface* out; //輸出 SDL_Surface* main ; //主窗口 TTF_Font *font; SDL_Rect a; //設(shè)置初始位置 SDL_Surface*bird; SDL_Rect xy; SDL_Surface*font_1; SDL_Surface*font_2; SDL_Surface*font_11; SDL_Surface*font_22; Pri() { TTF_Font *font = NULL; init();//初始化輸出設(shè)備 } int init() { SDL_Init( SDL_INIT_EVERYTHING ); TTF_Init(); main= SDL_SetVideoMode( 640, 478, 32, SDL_SWSURFACE ); SDL_WM_SetCaption("Flappy bird",NULL);//標(biāo)題 font=data.load_font(); out=data.load_imag("main_2.dat"); y=150; posi[0][0]=640; posi[0][1]=-300; posi[1][0]=940; posi[1][1]=-300; posi[2][0]=1240; posi[2][1]=-300; return 1; } int pipe() { } int bir(int y)//x=150 {int ii; i+=1; xy.x=150; xy.y=y; if(i<14) { xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bg,main,NULL); for(ii=0;ii<n;ii++) { xy.x=posi[ii][0]; xy.y=posi[ii][1]; SDL_BlitSurface(out,&data.pipe_down,main,&xy); xy.x=posi[ii][0]; xy.y=posi[ii][1]+600; SDL_BlitSurface(out,&data.pipe_up,main,&xy); } xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bird_1,main,&xy); xy.x=0; xy.y=404; SDL_BlitSurface(out,&data.foot,main,&xy); } else { xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bg,main,NULL); for(ii=0;ii<n;ii++) { xy.x=posi[ii][0]; xy.y=posi[ii][1]; SDL_BlitSurface(out,&data.pipe_down,main,&xy); xy.x=posi[ii][0]; xy.y=posi[ii][1]+600; SDL_BlitSurface(out,&data.pipe_up,main,&xy); } xy.x=150; xy.y=y; SDL_BlitSurface(out,&data.bird_2,main,&xy); xy.x=0; xy.y=404; SDL_BlitSurface(out,&data.foot,main,&xy); if(i>28)i=0; } return 0; } int bg() { SDL_BlitSurface(out,&data.bg,main,&xy); return 0; } int over() { int x=0,y=0,i=0; xy.x=250; xy.y=150; font_1=TTF_RenderText_Solid( font, "Game over !", textColor_3); SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); xy.x=350; xy.y=200; font_1=TTF_RenderText_Solid( font, "Retry game", textColor_1 ); font_11=TTF_RenderText_Solid( font, "Retry game", textColor_2 ); SDL_BlitSurface( font_1 , NULL, main, &xy); xy.x=350; xy.y=280; font_2=TTF_RenderText_Solid( font, " Exit game", textColor_1 ); font_22=TTF_RenderText_Solid( font, " Exit game", textColor_2 ); SDL_BlitSurface( font_2 , NULL, main, &xy); /* xy.x=10; xy.y=440; //野指針 SDL_BlitSurface( TTF_RenderText_Solid( font, "Esc:exit game Space:to jump hekun ", textColor_1 ) , NULL, main, &xy); SDL_Flip( main ); //更新窗口 */ while(SDL_PollEvent( &thing.event ), 1) { i+=2; Sleep(1); if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 點(diǎn)擊了SDL關(guān)閉按鈕 { exit(0); } if((x>350&&x<540)&&(y<240)&&(y>200)) { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT ) { SDL_FreeSurface(font_1); SDL_FreeSurface(font_11); SDL_FreeSurface(font_22); SDL_FreeSurface(font_2); WinExec("Flappy bird.exe",NULL); exit(0); return 11; } } else { } if((x>350&&x<540)&&(y<320)&&(y>280)) //結(jié)束游戲 { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT )exit(0); } if(thing. event.type == SDL_MOUSEMOTION ) { x=thing.event.motion.x; y=thing.event.motion.y; //獲得鼠標(biāo)坐標(biāo) if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<240)&&(thing.event.motion.y>200)) { xy.x=350; xy.y=200; SDL_BlitSurface( font_11, NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=200; SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); } if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<320)&&(thing.event.motion.y>280)) { xy.x=350; xy.y=280; SDL_BlitSurface( font_22 , NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=280; SDL_BlitSurface( font_2 , NULL, main, &xy); SDL_Flip(main); } } } return 0; } int welcome() { int x=0,y=0,i=0; SDL_BlitSurface(out,&data.welcome,main,NULL); bird=out; xy.x=350; xy.y=200; font_1=TTF_RenderText_Solid( font, "Start game", textColor_1 ); font_11=TTF_RenderText_Solid( font, "Start game", textColor_2 ); SDL_BlitSurface( font_1 , NULL, main, &xy); xy.x=350; xy.y=280; font_2=TTF_RenderText_Solid( font, " Exit game", textColor_1 ); font_22=TTF_RenderText_Solid( font, " Exit game", textColor_2 ); SDL_BlitSurface( font_2 , NULL, main, &xy); xy.x=10; xy.y=440; //野指針 SDL_BlitSurface( TTF_RenderText_Solid( font, "Esc:exit game Space:to jump hekun ", textColor_1 ) , NULL, main, &xy); SDL_Flip( main ); //更新窗口 while(SDL_PollEvent( &thing.event ), 1) { i+=2; Sleep(1); if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 點(diǎn)擊了SDL關(guān)閉按鈕 { exit(0); } if((x>350&&x<540)&&(y<240)&&(y>200)) { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT ) { SDL_FreeSurface(font_1); SDL_FreeSurface(font_11); SDL_FreeSurface(font_22); SDL_FreeSurface(font_2); return 0; } } else { } if((x>350&&x<540)&&(y<320)&&(y>280)) //結(jié)束游戲 { if(thing. event.type == SDL_MOUSEBUTTONDOWN) if(thing.event.button.button== SDL_BUTTON_LEFT )exit(0); } if(thing. event.type == SDL_MOUSEMOTION ) { x=thing.event.motion.x; y=thing.event.motion.y; //獲得鼠標(biāo)坐標(biāo) if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<240)&&(thing.event.motion.y>200)) { xy.x=350; xy.y=200; SDL_BlitSurface( font_11, NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=200; SDL_BlitSurface( font_1 , NULL, main, &xy); SDL_Flip(main); } if((thing.event.motion.x>350&&thing.event .motion .x<540)&&(thing.event.motion.y<320)&&(thing.event.motion.y>280)) { xy.x=350; xy.y=280; SDL_BlitSurface( font_22 , NULL, main, &xy); SDL_Flip(main); } else { xy.x=350; xy.y=280; SDL_BlitSurface( font_2 , NULL, main, &xy); SDL_Flip(main); } } if(i==400) { xy.x=150; xy.y=250; SDL_BlitSurface(bird,&data.bird_1,main,&xy); SDL_Flip(main); } if(i==800) { xy.x=150; xy.y=250; SDL_BlitSurface(bird,&data.bird_2,main,&xy); i=0; SDL_Flip(main); } } return 0; } }; Pri pri; int game_judge() {int i=0; if(y>370||y<-10) { if(pri.over()==11)return 12; } for(i=0;i<3;i++) { if(posi[i][0]<202 &&posi[i][0]>50) { if(y<posi[i][1]+ 420 ||y>posi[i][1]+570) {if(pri.over()==11)return 12;} } } return 0; } int game_loop() { y=150,i=0; int ii=0,iii=0; SDL_Surface *font; pri.bg(); char s[50]; Uint32 start = 0; sprintf(s," FPS:%d\t\t\t\t\t\t\t\tScore:%d",1000/(SDL_GetTicks()-start),score); int q=0; while(SDL_PollEvent( &thing.event ), 1) { start = SDL_GetTicks(); i++; Sleep(1); SDL_Flip(pri.main); y+=4; if(y>430)y=100; if(thing.event.button.state==SDL_PRESSED)y-=20; if( thing.keystates[ SDLK_SPACE] )y-=20; if( thing.keystates[ SDLK_ESCAPE] )exit(0); if( thing.event.type == SDL_QUIT )// 點(diǎn)擊了SDL關(guān)閉按鈕 { exit(0); } if(game_judge()==12)return 0; pri.bir(y); //顯示 每秒循環(huán)的次數(shù) ii++; if(ii>20) { sprintf(s," FPS:%d\t\t\t\t\t\t\t\tScore:%d",1000/(SDL_GetTicks()-start)+rand()%5,score); ii=0; } font=TTF_RenderText_Solid( pri.font, s, textColor_2 ); SDL_BlitSurface(font , NULL,pri. main, NULL); SDL_Flip(pri.main); SDL_FreeSurface(font); posi[0][0]-=2; posi[1][0]-=2; posi[2][0]-=2; if(posi[0][0]<=(-110)) {posi[0][0]=posi[2][0]+300;posi[0][1]=-(rand()%180)-220;} if(posi[1][0]<=(-110)) {posi[1][0]=posi[0][0]+300;posi[1][1]=-(rand()%180)-220;} if(posi[2][0]<=(-110)) {posi[2][0]=posi[1][0]+300;posi[2][1]=-(rand()%180)-220;} iii++; if(iii>50) for(iii=0;iii<3;iii++) { if(posi[iii][0]<50); score++; iii=0; break; } } return 0; } int main(int argc, char* argv[]) { while(1) { pri.init();//初始化輸出設(shè)備 pri.welcome(); game_loop(); } return 0; }
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- C語(yǔ)言實(shí)現(xiàn)flappy bird游戲
- Qt實(shí)現(xiàn)Flappy Bird游戲
- python實(shí)現(xiàn)flappy bird游戲
- java實(shí)現(xiàn)Flappy Bird游戲源代碼
- Java實(shí)現(xiàn)Flappy Bird游戲源碼
- java實(shí)現(xiàn)flappy Bird小游戲
- C語(yǔ)言實(shí)現(xiàn)Flappy Bird小游戲
- C語(yǔ)言簡(jiǎn)易版flappy bird小游戲
- 純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a
- Unity實(shí)現(xiàn)Flappy Bird游戲開發(fā)實(shí)戰(zhàn)
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法
這篇文章主要介紹了VisualStudio Community2019在安裝的過(guò)程中無(wú)法進(jìn)入安裝界面的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03使用C++和代理IP實(shí)現(xiàn)天氣預(yù)報(bào)的采集
在當(dāng)今的互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)信息的獲取變得日益重要,天氣預(yù)報(bào)信息作為日常生活的重要參考,其獲取方式也隨著技術(shù)的發(fā)展而不斷變化,在本文中,我們將探討如何使用C++和代理IP來(lái)采集天氣預(yù)報(bào)信息,文中通過(guò)代碼講解的非常詳細(xì),需要的朋友可以參考下2023-12-12C語(yǔ)言 動(dòng)態(tài)內(nèi)存開辟常見問(wèn)題解決與分析流程
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存2022-03-03