课 程 设 计
设计题目
《 Flappy Bird 》
学生姓名
学
号
专业班级
指导教师
年 月 日
目录
一. 课程设计选题及简介
1.选题缘由
2.游戏简介
二. 课程设计方案及算法
1.设计思路
2.关键点说明
三. 代码及实验测试结果
四. 难点和心得体会
设 计
题 目
Flappy Bird
成绩
一、课程设计选题及简介
1.选题缘由
这是一个十分简单的操作游戏游戏——Flappy Bird,我
之所以选择设计这个游戏,是因为在学 C++之前就接触过这
个游戏 C 语言版的,之后在学 C++这门课的时候又有同学跟
我说,你可以用 C++来编程,而且比 C 语言更精炼。于是我
便借此次课程设计来做这个游戏。
课
程
设
计
主
要
内
容
2.游戏简介
游戏很简单,Flappy——飞扬的,顾名思义,控制 Bird
飞翔。玩家只需要通过按“上箭头”来控制小鸟的位置,穿
越障碍物,不触碰障碍物即可。每穿过一个障碍分数 Score
便会加 1,穿过的障碍物越多,后面难度就会加大。
二、课程设计方案及算法
1.设计思路
关于这个游戏,主要分三个类,一个是与背景相关的 Bg
类,一个是和小鸟相关的 Birds 类,还有一个是关于位置的
Position,因为游戏主要涉及到的就是鸟、背景和位置这三个
因素。
首先,游戏需要一个背景,所以先设置一个类 Bg,用来
打印背景,在控制台上进行修改打印,打印边界和柱子(障
碍物);
然后是玩家需要控制的主体,鸟。在 Birds 类中设置函
数来控制鸟,设置按一下向上键鸟会上移几个单位,再设置
判断游戏是否结束的函数;
最后的 Position 类,负责输出坐标,利用 Windows 和 conio
函数,来对控制台进行操作。
把后两个类都设置为 Bg 类的友元类,这样互相调用会很
方便。
以上便是整个程序的大致思路。
2.关键点说明
首先需要说明的是对控制台的操作,这需要用到 Windows
的相关知识。即 Position 类的一个最主要的成员函数:
void Position::show(int x, int y) //(光标)移动到坐标(x,y)
{
COORD pos = { x - 1, y - 1 }; //定义 COORD 结构的实例 pos,初始化
参数用 x 和 y,即 pos.x=x; pos.y=y;
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
//获得输
出设备的句柄
//输出设备的设备号是 STD_OUTPUT_HANDLE
SetConsoleCursorPosition(Out, pos); //设置控制台光标位置
//参数 1:控制台句柄;参数 2:COORD 结构存放的坐标}
其次就是对判断游戏是否结束的函数的说明,鸟碰到柱子
便被判定游戏结束,同样,鸟下降到底端也会被判定游戏结束,
又由于柱子是向左移动,不断刷新,所以只有鸟碰到上端柱子
左侧、碰到下端柱子左侧、碰到上端柱子最下端和下端柱子最
上端的可能,具体即下面这个函数:
int Birds::CheckYN(Bg *q) //判定游戏是否结束
{ Bg *p=q;
int i=0;
while(++i<=5)
{
if(y>23) return 0; //鸟的纵坐标到底,游戏结束
if(x==p->x&&y<=p->y) return 0;//鸟撞到上方柱子的左侧,游戏
结束
if((x==p->x||x==p->x+1||x==p->x+2)&&y==p->y) return 0; // 鸟
撞到上方柱子最下端,游戏结束
if(x==p->x&&y>p->y+p->l_blank) return 0; //鸟撞到下方柱子左
侧,游戏结束
if((x==p->x||x==p->x+1||x==p->x+2)&&y==p->y+p->l_blank)
return 0; //鸟撞到下方柱子的最上端,游戏结束
p=p->next; //从第一个柱子检测到最后一个柱子}
return 1;
}
两处关键点简单的说明即上面那些,下面附上详细代码。
三、代码及实验测试结果
//控制台初始大小 80*25
//控制台坐标原点是最左上的点,自上而下、自左而右增加
#include
#include
#include //把日期和时间转换为字符串
#include //通过控制台进行输入输出
#include
#define PR_Box cout << "*"
#define PR_Gold cout << "*"
#define PR_Ag cout << "*"
#define PR_FBird cout << "Ф"
#define PR_DBird cout << "*"
#define PR_Land cout << "="
#define PR_Bg_X cout << "="
#define PR_Bg_Y cout << "*"
#define PR_Blank cout << " "
using namespace std;
int Grade = 1, Score = 0, Max_blank=9,Distance=18;
class Bg
{
private:
friend class Birds;
friend class Position;
int x;
int y;
int l_blank;
Bg *pri;
Bg *next;
public:
Bg();
void CreatBg(Bg* Bg1);
void PrtBg();
void InsertBg(Bg* p);
void Check_Bg(Bg *q);
void Prt_Bg(Bg *q);
};
class Birds
{
private:
int x;
int y;
int condition;
friend class Position;
public:
Birds();
void PrtBird() ;
void Loop_Bg(Bg *q);
int CheckYN(Bg *q);
void calc(int i);
};
class Position
{
private:
int x;
int y;
public:
Position(){x=0;y=0;}