青少年编程知识记录 codecoming

C++小游戏——flappy bird简单实现

上一篇小游戏中,我们简单实现了打砖块小游戏。这一篇中,我们根据前面的框架,简单实现flappy bird小游戏。

1.游戏框架



   2.实现下落的小鸟

#include <cstdio>  #include <cstdlib>  #include <conio.h>  #include <windows.h>    // 全局变量  int high,width; // 游戏画面大小  int bird_x,bird_y; // 小鸟的坐标  int bar1_y,bar1_xDown,bar1_xTop; // 障碍物    void gotoxy(int x,int y)//类似于清屏函数  {      HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);      COORD pos;      pos.X = x;      pos.Y = y;      SetConsoleCursorPosition(handle,pos);  }  //隐藏光标   void HideCursor(){   	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	}  void startup()  // 数据初始化  {  	high = 15;  	width = 20;  	bird_x = 0;  	bird_y = width/3;  }    void show()  // 显示画面  {  	gotoxy(0,0);  // 清屏	  	int i,j;  	  	for (i=0;i<high;i++)  	{  		for (j=0;j<width;j++)  		{  			if ((i==bird_x) && (j==bird_y))  				printf("♀");  //   输出小鸟  			else  				printf(" ");  //   输出空格  		}  		printf("\n");  	}  }	    void updateWithoutInput()  // 与用户输入无关的更新  {  	bird_x ++;  	Sleep(150);  }    void updateWithInput()  // 与用户输入有关的更新  {	  	char input;  	if(kbhit())  // 判断是否有输入  	{  		input = getch();  // 根据用户的不同输入来移动,不必输入回车  		if (input == ' ')    		{  			bird_x = bird_x - 2;  		}  		  	}  }    int main()  {  	startup();  // 数据初始化  	HideCursor(); //隐藏光标	  	while (1)  //  游戏循环执行  	{  		show();  // 显示画面  		updateWithoutInput();  // 与用户输入无关的更新  		updateWithInput();     // 与用户输入有关的更新  	}  	return 0;   }





2.同步显示小鸟和障碍物

#include <cstdio>  #include <cstdlib>  #include <conio.h>  #include <windows.h>  // 全局变量  int high,width; // 游戏画面大小  int bird_x,bird_y; // 小鸟的坐标  int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标    void gotoxy(int x,int y)//类似于清屏函数  {      HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);      COORD pos;      pos.X = x;      pos.Y = y;      SetConsoleCursorPosition(handle,pos);  }  //隐藏光标   void HideCursor(){   	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	}  void startup()  // 数据初始化  {  	high = 15;  	width = 20;  	bird_x = 0;  	bird_y = width/3;  	bar1_y = width/2;  	bar1_xDown = high/3;  	bar1_xTop = high/2;  }    void show()  // 显示画面  {  	gotoxy(0,0);  // 清屏  	int i,j;  	  	for (i=0;i<high;i++)  	{  		for (j=0;j<width;j++)  		{  			if ((i==bird_x) && (j==bird_y))  				printf("#");  //   输出小鸟  			else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )  				printf("||");  //   输出墙壁  			else  				printf(" ");  //   输出空格  		}  		printf("\n");  	}    }	    void updateWithoutInput()  // 与用户输入无关的更新  {  	bird_x ++;  	Sleep(150);  }    void updateWithInput()  // 与用户输入有关的更新  {	  	char input;  	if(kbhit())  // 判断是否有输入  	{  		input = getch();  // 根据用户的不同输入来移动,不必输入回车  		if (input == ' ')    		{  			bird_x = bird_x - 2;  		}    	}  }    int  main()  {  	startup();  // 数据初始化	  	HideCursor(); //隐藏光标  	while (1)  //  游戏循环执行  	{  		show();  // 显示画面  		updateWithoutInput();  // 与用户输入无关的更新  		updateWithInput();     // 与用户输入有关的更新  	}  	return 0;   }

效果:

3.障碍物向左移动

#include <cstdio>  #include <cstdlib>  #include <conio.h>  #include <windows.h>  // 全局变量  int high,width; // 游戏画面大小  int bird_x,bird_y; // 小鸟的坐标  int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标    void gotoxy(int x,int y)//类似于清屏函数  {      HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);      COORD pos;      pos.X = x;      pos.Y = y;      SetConsoleCursorPosition(handle,pos);  }  //隐藏光标   void HideCursor(){   	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	}    void startup()  // 数据初始化  {  	high = 20;  	width = 50;  	bird_x = high/2;  	bird_y = 1;  	bar1_y = width/2;  	bar1_xDown = high/3;  	bar1_xTop = high/2;  }    void show()  // 显示画面  {  	gotoxy(0,0);  // 清屏	  	int i,j;  	  	for (i=0;i<high;i++)  	{  		for (j=0;j<width;j++)  		{  			if ((i==bird_x) && (j==bird_y))  				printf("#");  //   输出小鸟  			else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )  				printf("||");  //   输出墙壁  			else  				printf(" ");  //   输出空格  		}  		printf("\n");  	}    }	    void updateWithoutInput()  // 与用户输入无关的更新  {  	bird_x ++;  	bar1_y --;  	Sleep(150);  }    void updateWithInput()  // 与用户输入有关的更新  {	  	char input;  	if(kbhit())  // 判断是否有输入  	{  		input = getch();  // 根据用户的不同输入来移动,不必输入回车  		if (input == ' ')    		{  			bird_x = bird_x - 2;  		}    	}  }    int main()  {  	startup();  // 数据初始化	  	HideCursor(); //隐藏光标  	while (1)  //  游戏循环执行  	{  		show();  // 显示画面  		updateWithoutInput();  // 与用户输入无关的更新  		updateWithInput();     // 与用户输入有关的更新  	}  	return 0;  }



效果:

4.判断小鸟是通过还是碰撞

#include <cstdio>  #include <cstdlib>  #include <conio.h>  #include <windows.h>  // 全局变量  int high,width; // 游戏画面大小  int bird_x,bird_y; // 小鸟的坐标  int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标  int score; // 得分,经过障碍物的个数    void gotoxy(int x,int y)//类似于清屏函数  {      HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);      COORD pos;      pos.X = x;      pos.Y = y;      SetConsoleCursorPosition(handle,pos);  }  //隐藏光标   void HideCursor(){   	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	}  void startup()  // 数据初始化  {  	high = 20;  	width = 50;  	bird_x = high/2;  	bird_y = 3;  	bar1_y = width/2;  	bar1_xDown = high/3;  	bar1_xTop = high/2;  	score = 0;  }    void show()  // 显示画面  {  	gotoxy(0,0);  // 清屏	  	int i,j;  	  	for (i=0;i<high;i++)  	{  		for (j=0;j<width;j++)  		{  			if ((i==bird_x) && (j==bird_y))  				printf("#");  //   输出小鸟  			else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )  				printf("||");  //   输出墙壁  			else  				printf(" ");  //   输出空格  		}  		printf("\n");  	}  	printf("得分:%d\n",score);  }	    void updateWithoutInput()  // 与用户输入无关的更新  {  	bird_x ++;  	bar1_y --;  	if (bird_y==bar1_y)  	{  		if ((bird_x>=bar1_xDown)&&(bird_x<=bar1_xTop))  			score++;  		else  		{  			printf("游戏失败\n");  			system("pause");  			exit(0);  		}  	}    	Sleep(150);  }    void updateWithInput()  // 与用户输入有关的更新  {	  	char input;  	if(kbhit())  // 判断是否有输入  	{  		input = getch();  // 根据用户的不同输入来移动,不必输入回车  		if (input == ' ')    		{  			bird_x = bird_x - 2;  		}    	}  }    int main()  {  	startup();  // 数据初始化  	HideCursor();	  	while (1)  //  游戏循环执行  	{  		show();  // 显示画面  		updateWithoutInput();  // 与用户输入无关的更新  		updateWithInput();     // 与用户输入有关的更新  	}  	return 0;  }

效果:



5.障碍物循环出现

#include <cstdio>  #include <cstdlib>  #include <conio.h>  #include <windows.h>  // 全局变量  int high,width; // 游戏画面大小  int bird_x,bird_y; // 小鸟的坐标  int bar1_y,bar1_xDown,bar1_xTop; // 障碍物1的相关坐标  int score; // 得分,经过障碍物的个数    void gotoxy(int x,int y)//类似于清屏函数  {      HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);      COORD pos;      pos.X = x;      pos.Y = y;      SetConsoleCursorPosition(handle,pos);  }  //隐藏光标   void HideCursor(){   	CONSOLE_CURSOR_INFO cursor_info={1,0}; //第二个值表示隐藏光标   	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	  }  void startup()  // 数据初始化  {  	high = 20;  	width = 20;  	bird_x = high/2;  	bird_y = 3;  	bar1_y = width;  	bar1_xDown = high/3;  	bar1_xTop = high/2;  	score = 0;  }    void show()  // 显示画面  {  	gotoxy(0,0);  // 清屏	  	int i,j;  	  	for (i=0;i<high;i++)  	{  		for (j=0;j<width;j++)  		{  			if ((i==bird_x) && (j==bird_y))  				printf("#");  //   输出小鸟  			else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )  				printf("||");  //   输出墙壁  			else  				printf(" ");  //   输出空格  		}  		printf("\n");  	}  	printf("得分:%d\n",score);  }	    void updateWithoutInput()  // 与用户输入无关的更新  {  	bird_x ++;  	bar1_y --;  	if (bird_y==bar1_y)  	{  		if ((bird_x>=bar1_xDown)&&(bird_x<=bar1_xTop))  			score++;  		else  		{  			printf("游戏失败\n");  			system("pause");  			exit(0);  		}  	}  	if (bar1_y<=0)  // 再新生成一个障碍物  	{  		bar1_y = width;  		int temp = rand()%int(high*0.8);  		bar1_xDown = temp - high/10;  		bar1_xTop = temp + high/10;  	}    	Sleep(150);  }    void updateWithInput()  // 与用户输入有关的更新  {	  	char input;  	if(kbhit())  // 判断是否有输入  	{  		input = getch();  // 根据用户的不同输入来移动,不必输入回车  		if (input == ' ')    		{  			bird_x = bird_x - 2;  		}    	}  }    int main()  {  	startup();  // 数据初始化	  	HideCursor();  	while (1)  //  游戏循环执行  	{  		show();  // 显示画面  		updateWithoutInput();  // 与用户输入无关的更新  		updateWithInput();     // 与用户输入有关的更新  	}  	return 0;  }



效果:

(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:趣味小程序 浏览: