当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » C/C++  » 游戏开发
梦想游戏人

C++版本简易Flappy bird

梦想游戏人 发布于 2014年03月27日 13时, 20评/5786阅
分享到: 
收藏 +0
2
/*******************************************************************************
Flappy bird
author :hekun   2014-3-26
大一,上学期学完了C,写了几个控制台游戏
这学期自学C++,由于学校课程第七周才有C++

边学边写了这个小游戏,SDL 图形库完成的图形绘画
时间匆忙,BUG也有,代码效率比较低 
和原作品还是很大的差别, 源代码在附件游戏文件夹中
*********************************************************************************/
标签: <无>

代码片段(3) [全屏查看所有代码]

1. [图片] 43475.png    

2. [图片] 453245.png    

3. [代码][C/C++]代码     跳至 [3] [全屏预览]

/*******************************************************************************

Flappy bird
author :hekun   2014-3-26

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


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(20)

  • 1楼:Romen 发表于 2014-03-27 14:36 回复此评论
    嗯,不错。很羡慕LZ有这样的毅力。。每次都想做点什么练练手,但一空闲就游戏取代之。。。。
  • 2楼:子矜 发表于 2014-03-27 14:38 回复此评论
    sdl做的 不错不错 建议实施sdl2
  • 3楼:wangaowell 发表于 2014-03-27 16:10 回复此评论
    很佩服楼主,刚刚上大学就开始学习语言了。这让当年在大学玩了四年的我情何以康啊!
  • 4楼:梦想游戏人 发表于 2014-03-27 16:12 回复此评论

    引用来自“wangaowell”的评论

    很佩服楼主,刚刚上大学就开始学习语言了。这让当年在大学玩了四年的我情何以康啊!
    0.0 是大一上学期是C 下学期是C++ , 学校课程就是这样安排的 - -!
  • 5楼:梦想游戏人 发表于 2014-03-27 16:12 回复此评论

    引用来自“子矜”的评论

    sdl做的 不错不错 建议实施sdl2
    SDL 2 教程太少 文档看不懂,手里只有SDL的中文文档
  • 6楼:梦想游戏人 发表于 2014-03-27 16:13 回复此评论

    引用来自“Romen”的评论

    嗯,不错。很羡慕LZ有这样的毅力。。每次都想做点什么练练手,但一空闲就游戏取代之。。。。
    谢谢 ^_^
  • 7楼:一天一世纪 发表于 2014-03-27 17:28 回复此评论
    回复下。哪有附件呢
  • 8楼:梦想游戏人 发表于 2014-03-27 17:29 回复此评论

    引用来自“一天一世纪”的评论

    回复下。哪有附件呢
    大于4M 上传不了
  • 9楼:wehero233 发表于 2014-03-29 21:01 回复此评论
    把sdl那个文件穿个我一下行不,我想运行一下这个文件看看效果
  • 10楼:wehero233 发表于 2014-03-29 21:02 回复此评论
    发到这个邮箱里532426048@qq.com    谢了
  • 11楼:梦想游戏人 发表于 2014-03-29 21:04 回复此评论

    引用来自“wehero233”的评论

    把sdl那个文件穿个我一下行不,我想运行一下这个文件看看效果

    www.hekunn.com有下载方式

  • 12楼:Zero__One 发表于 2014-04-02 11:59 回复此评论
    不错呀.  
  • 13楼:萨斯辈的呼唤 发表于 2014-04-03 10:16 回复此评论
    哎,表示空有一颗玩游戏的心。不过楼主做得效果图看起来不错的样子
  • 14楼:HoLyBird 发表于 2014-04-03 13:56 回复此评论
    楼主可以试试cocos2d-x游戏引擎,是用C++写的,可以在各个操作系统、安卓、IOS上移植
  • 15楼:北化413 发表于 2014-04-05 22:29 回复此评论
    你是不是专业学软件开发的啊?我也是大一学C,大二学C++,不过我们是给单片机这一类的编程,太浅……
  • 16楼:梦想游戏人 发表于 2014-04-10 22:04 回复此评论

    引用来自“北化413”的评论

    你是不是专业学软件开发的啊?我也是大一学C,大二学C++,不过我们是给单片机这一类的编程,太浅……

    我们还没学C++ 现在大一 软件工程

  • 17楼:惟帅迷风 发表于 2014-05-06 10:12 回复此评论
    不错啊 刚学就会编游戏 很有前途啊
  • 18楼:蔡雨萌 发表于 2015-03-08 13:59 回复此评论

    引用来自“坤坤坤_”的评论

    引用来自“wangaowell”的评论

    很佩服楼主,刚刚上大学就开始学习语言了。这让当年在大学玩了四年的我情何以康啊!
    0.0 是大一上学期是C 下学期是C++ , 学校课程就是这样安排的 - -!
    LZ好强悍。。我现在大一。。学完C 一个控制台游戏都写不出来
  • 19楼:蔡雨萌 发表于 2015-03-08 14:00 回复此评论

    引用来自“北化413”的评论

    你是不是专业学软件开发的啊?我也是大一学C,大二学C++,不过我们是给单片机这一类的编程,太浅……

    引用来自“坤坤坤_”的评论

    我们还没学C++ 现在大一 软件工程

    LZ大一就有软件工程??????
  • 20楼:杨亚哲Brn 发表于 2016-06-14 22:51 回复此评论
    我下载试试 LZ
开源从代码分享开始 分享代码
梦想游戏人的其它代码 全部(2)...