基于C语言设计的像素小鸟小游戏

资源下载地址: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

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125331589
今日推荐