资源下载地址:https://download.csdn.net/download/sheziqiong/85672935
一、设计目的
掌握定义函数,并熟练使用各函数
实现各函数模块的调用
学会将静态库导入工程,熟练使用库函数
掌握使用 graphics.hIMAG 的数据类型
学会调用 API
学会编写合适的算法来解决问题
二、设计内容
为了更好地掌握各数据类型、数据结构的使用以及 C 语言程序设计的思想,以 C 语言平日课堂知识为主,复刻了前几年在移动端很火的一款游戏 Flappy bird。
成品 Flappy bird 截图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7SOMp0V-1655441661996)(https://www.writebug.com/myres/static/uploads/2022/6/16/203ad6062561e69e25bffbcfda379d05.writebug)]
三、概要设计
3.1 功能模块图;
答:如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhxEx2i7-1655441661997)(https://www.writebug.com/myres/static/uploads/2022/6/16/a27339ec468cf4a3265340382d082f78.writebug)]
3.2 各个模块详细的功能描述。
Custom Function list 自定义函数
void print();
void begin();//载入music、背景、First stone
void printstone();
void bird();//控制鸟的下降和上升
void judgement();
void scoleprint();
void endorretry();
使用到的头文件、lib
<graphics.h>
<stdio.h>
<stdlib.h>
<conio.h>
<time.h>
<windows.h>
"mmsystem.h"
WINMM.lib (VC6.0 自带的静态库)
四、详细设计
答:
首先,需要安装 EasyX 图形库,将.exe 呈现出更好的图形界面,然后,利用 graphics.h 绘制图像。
正式动工前的准备:
熟悉 graphics 头文件中的各种库函数,比如
initgraph(,);界面初始化;
circle(;;);画圆;
RGB();颜色设置;
IMAGE 定义 IMAGE 对象,
closegraphics();关闭绘图界面等等。
还需要寻找一些库函数,识别键盘的敲击,比如 while(!kbhit())等等。
熟悉相关库函数后,开始本次 flappy bird 程序编写。
我的思路是这样:
背景图片的显示
加入小鸟图片
小鸟自由下落,按键后上升
加入静态的障碍物
障碍物向左移动
判断小鸟和障碍物的碰撞
障碍物移动出左边界后,在右边重新出现
加入记分模块
加入开始界面、结束界面
加入背景音乐
分阶段编写实现这十个模块。
首先,由于我需要设置图形界面,所以调用了 VC6.0 里头对窗口句柄属性操作的函数,实现对窗口句柄属性的修改,这里由于游戏简单,仅修改了窗口名字,下面贴代码:
// 获取窗口句柄
HWND hwnd = GetHWnd();
// 设置窗口标题文字
SetWindowText(hwnd, “大峰子的 Flappy bird!”);
而后便是游戏窗口的设置,这里为了尽最大限度地复刻移动端,给玩家带来熟悉的感觉,我初始化成了 350X600,大概是 6 寸的手机屏幕大小。这一步的实现是:initgraph(350,600);
之后,需明确游戏的两个对象,鸟,管道;
由于小鸟的属性本质是取其需打印位置的左上角坐标(X’,Y’),然后通过库函数 loadimage();putimage();将准备好的图片素材输出到该位置上,这样小鸟就呈现在了屏幕上,所以我们需要定义两个全局变量 bird_x、bird_y 去实现存储小鸟坐标的功能。
之前提到,本游戏主要是基于 C 语言 graphics.h 中各类绘图库函数实现的,所以要定义 IMAGE 对象,代码说话:
IMAGE background,bird1[4],bird2[4],scole1[10],scole2[10],stone_up1,stone_up2,
stone_down1,stone_down2,stone_up3,stone_up4,stone_down3,stone_down4;
以便于后面的 loadimage();putimage();这一系列操作。
随后,便是各个功能模块的技术实现了,我简述一下我的技术实现:
背景图片的显示。这个比较简单,定左上角为(0,0)点,只要使用函数 putimage(0,0,&文件地址);就能实现该模块。
加入小鸟图片。首先我们观察游戏会发现,该游戏中小鸟只会上下移动,并不会左右移动,造成小鸟向前飞的错觉是管道相对于小鸟的相对位移造成的,因此,我们只需要 putimage 到(150,300)即屏幕中央偏左的位置即可。另外,这里有一个小技术实现,就是三光栅操作,使得位图能透明显示。其原理是 XOR,即异步运算,掩码图 XOR 精灵图=能透明显示到背景图上的位图。
举个例子,
黑 XOR 黑=原颜色。
我的素材:
or
=
通过 XOR 运算将两张图像先后重叠打印,就能够实现图像的显示而不造成图像闪烁现象。
加入静态的障碍物管道。这个原理与 2 是一致的。不再过度阐述。
开始时播放背景音乐。这里需要调用媒体播放 API,双线程进行,不然就会造成“播放.wav 时控制台黑屏”的现象。这里用到的是头文件 windows.h 下的库函数 Playsound,下面贴代码:PlaySound(“000.wav”, NULL, SND_FILENAME | SND_ASYNC|SND_LOOP);
通过这段代码,实现多线程、循环播放。此外实现该功能需要添加 WINMM.lib 到 project 当中。
加入封面、结束界面。封面的加入较为简单,制作一个 350X600 的图片,在开始时 putimage,并利用 getch();实现停顿直至键盘输入。结束界面的“GAME OVER”图像,显示方法如 2.中描述的一样,不再过多阐述。
小鸟的自动下落,键盘输入空格 or 鼠标左键时上升。首先,自动下落可以通过循环解决,每一次循环都进行一次按键检测 if(kbhit()),若按下空格键 or 鼠标左键,bird_y 减小,小鸟图像打印时将上移,造成一种小鸟向上飞跃的感觉,若没有按按键,则 bird_y+=3,缓慢下降。
障碍物向左移动。这个操作是在自定义函数 printstone();中实现的。关键点在于游戏一开始时柱子的初始化、柱子的随机长度、及柱子移动到屏幕左边框后右侧柱子重新出现…这三种情况的技术实现。
五、测试数据及运行结果
5.1 正常测试数据和运行结果
要求提供 3 组正常测试数据和运行结果
5.2 异常测试数据及运行结果
要求提供 2 组异常测试数据和运行结果
六、调试情况,设计技巧及体会
6.1 改进方案
答:
对自己的设计进行评价,指出合理和不足之处,提出改进方案;
像素小鸟翅膀的扇动
①
②
③
改进办法:当 bird_y 上升/下降时,利用 IMAGE 数组控制输出不同类型的图案。
像素小鸟位移感严重,跳跃不顺畅
改进办法:按键检测到空格键 or 鼠标左键时,将 bird_y-=80 调整至 bird_y-=40,减小相对位移的长度。
柱子移动偏慢
改进办法:多设置一个难度模块,通过改变柱子移动速度达到难度的改变,例如定义全局变量 n,将 stone_x–修改为 stone_x=stone_x-n,然后通过 scanf(“%d”,&n);去控制每次循环时柱子向左移动的位移即可。
缺乏最高分模块。记录玩家最高分
改进办法:后续加入该模块。
资源下载地址:https://download.csdn.net/download/sheziqiong/85672935