C++版本简易Flappy bird_C 语言

大一,上学期学完了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;
}
 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, Flappy
Bird
c语言flappy bird、c语言版flappy bird、flappy bird、flappy bird 源码、flappy bird恐怖故事,以便于您获取更多的相关知识。

时间: 2024-12-30 02:48:32

C++版本简易Flappy bird_C 语言的相关文章

C语言开发简易版扫雷小游戏_C 语言

前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

易语言基础教程之制作简易浏览器_易语言

方法/步骤 首先打开易语言: 点击--工具--支持库配置--全选--确认 之后点击属性--拉宽 之后点击标题输入测试浏览器 拉一个编辑框和按钮最后一个超文本浏览框(自己找) 之后双击按钮输入代码: .版本 2 .支持库 HtmlView .子程序 _按钮1_被单击 超文本浏览框1.地址 = 编辑框1.内容 按F5测试,好的行了 注意事项 编辑框要输入网址,不能输入其他的OK. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜

c语言 简易加减计算器

问题描述 c语言 简易加减计算器 设计一个能计算加减法的简单计算器 从键盘输入数字和运算符 输入等于号时结束计算并输出结果 输出例如下 $ ./a.out 10 + 15 - 5 = 20 下面是我自己编的 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char num1[80],num2[80]; char a; int j,k,s=0; gets(num1); j=a

JSTL 入门:表达式语言

js JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式化.XML 操作以及数据库访问.在 developerWorks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素.您还将了解如何通过从表示层删除源代码来简化软件维护.最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使

phpMyAdmin2.6以上版本数据乱码问题

数据|问题     在phpMyAdmin2.6以上版本因为支持多语言集,弄得我们使用phpMyAdmin管理数据库的时候,查询出来的中文都是乱码,但是在我们的PHP程序调用时却没有这些问题. 看来是phpMyAdmin2.6的配置有问题了,为了解决这个问题,我上google上搜索了相关资料,这类的问题很多,但没一个可以解决的,真是没办法,看来只有自己动手解决了. 最终花了半天的时间,总算找到了一个比较折衷的方法来解决. 去phpMyAdmin2.6的根目录下,打开以下这个文件:    libr

JSTL 入门: 表达式语言

js JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式化.XML 操作以及数据库访问.在 developerWorks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素.您还将了解如何通过从表示层删除源代码来简化软件维护.最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使

Visual Basic.NET 中的语言新变化

visual 简介 要快速创建企业级的Web应用程序,开发人员必须依赖于可伸缩性.强壮性和可重用性等商业逻辑.在过去的几年中,面向对象的程序设计成为符合这些要求的系统的首要方法.使用面向对象的编程语言有助于使大规模的系统更易于理解.更易于调试.升级更迅速. 为了使Visual Basic开发人员能够从面向对象设计中受益并简化企业级Web应用程序的开发,Visual Basic的下一个版本­--Visual Basic.NET将支持包括实现继承在内的全部面向对象的语言特性.有了这些语言特性,Vis

网站制作ASP语言的特点与功能

ASP(Active Server Page的缩写) 意思是"活动服务器网页".ASP是微软公司开发,用于代替CGI脚本程序的一种应用. 它可以与数据库和其它程序进行交互,是一种简单,方便的编程工具.ASP的网页文件的格式为.asp,现常用于各种动态网站中. ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或web应用程序. ASP的特点与功能 从软件技术层面看,ASP有以下特点: 1. 无需编译 ASP脚本集成于HTML当中,容易生成,无需编译或链接即可直接解释执行. 2

ios 多语言支持

xcode4中添加多国语言支持已经与前期的版本方式不太相同,这里进行简要的介绍. 一,在你的工程中找到Supporting Files,在其上右键,找到如下 所示的蓝色高亮项,单击. 注意,你已经看到了我生成的多个语言支持文件,你在没有添加以前这里是没有的!!!!.   二,如下,选择ios目录下的资源文件,找到string文件选择. 三,将新建的文件命名为Localizable,这个是一定的,不能命名为其他的名称.这里要注意.完成后打开inspector,选中Localizable.strin