首页 > 编程 > C++ > 正文

C++版本简易Flappy bird

2020-01-26 15:08:03
字体:
来源:转载
供稿:网友

大一,上学期学完了C,写了几个控制台游戏
这学期自学C++,由于学校课程第七周才有C++

边学边写了这个小游戏,SDL 图形库完成的图形绘画
时间匆忙,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为管道对数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; //设置初始位置  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();//初始化输出设备       }   int init()  {    SDL_Init( SDL_INIT_EVERYTHING );    TTF_Init();    main= SDL_SetVideoMode( 640, 478, 32, SDL_SWSURFACE );    SDL_WM_SetCaption("Flappy bird",NULL);//标题    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 )// 点击了SDL关闭按钮      {        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))  //结束游戏      {        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;         //获得鼠标坐标        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 )// 点击了SDL关闭按钮      {        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))  //结束游戏      {        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;         //获得鼠标坐标        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 )// 点击了SDL关闭按钮  {    exit(0);  }      if(game_judge()==12)return 0;     pri.bir(y);       //显示 每秒循环的次数     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();//初始化输出设备    pri.welcome();    game_loop();     }  return 0;} 

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表