跳转至

程序设计

《俄罗斯方块》程序开发报告

制作项目:《俄罗斯方块》

团队成员:王浩雄(组长) 袁 昊

Github仓库:链接

一、程序功能

我们团队开发了一款俄罗斯方块程序,具备以下功能:

  1. 游戏界面:提供一个简约风的游戏界面,以俄罗斯方块的经典外观为基础,配合灵动的游戏开始与结束动画、行满消除动画以及游戏音效,给玩家带来熟悉而愉悦的游戏体验。
  2. 操作控制:允许玩家通过高流畅度的键盘输入来控制方块的移动、旋转和下落,以完成消行和获得高分。
  3. 记分系统:实现记分功能,根据玩家的表现,及时更新并显示当前游戏轮数、得分、最高分和消除行数。另外,通过文件读写,本游戏的分数可被保存并在下一次启动游戏时重新加载,玩家也可一键清除历史得分记录。
  4. 难度变化:本游戏共设置12个难度等级。随着游戏的进行,方块的下落速度将逐渐增加,增加游戏的挑战性。

二、编写难点

在编写俄罗斯方块程序的过程中,我们遇到了一些挑战和难点:

  1. 图形库模块的学习:我们在编程中主要使用EasyX图形库来编写主要界面。图形库的内容对于我们两人都是全新的,必须从头开始学习。
  2. 方块的移动:需要设计算法来确保方块在游戏区域内的合法移动和旋转,并处理可能出现的碰撞和重叠情况。需要精确地检测方块与已堆积的方块或游戏区域边界的碰撞,以便及时触发消行操作。
  3. 键盘输入响应:本游戏对键盘输入的响应需要与方块的自然下落“同时进行”,而多行代码无法“同时执行”。我们进行反复试验,摸索出最流畅的游戏循环结构,使对键盘输入的读取延迟得以降低,大幅提升游戏体验。

三、程序界面

我们的俄罗斯方块程序采用了简洁而直观的界面设计,主要包括以下元素:

  1. 游戏区域:用于显示正在下落的方块和已经堆积的方块。
  2. 信息栏:显示游戏得分、最高分、难度等信息。
  3. 预览区:显示下一个即将出现的方块形状,帮助玩家做出下一步的决策。
  4. 控制按钮:通过键盘上的方向键和ASDW等常用游戏控制键来控制方块的移动和旋转,以及调整方块下落速度、暂停游戏、播放音乐、清除历史得分记录的快捷键。

四、主要函数

在我们的俄罗斯方块程序中,主要实现了以下几个函数:

  1. 界面打印函数:调用图形库绘制游戏的主界面、游戏开始界面、信息栏等。
  2. 动画函数:调用图形库绘制游戏开始与结束等环节的动画。
  3. 游戏主循环函数:进行游戏主循环,调用其它功能函数。
  4. 方块生成函数:将方块的图形刻画出来,并随机生成下一个方块,并在预览区显示,为提高可玩性,我们对随机的算法进行了处理。
  5. 方块移动函数:根据玩家的输入,控制方块的左右移动和加速下落。
  6. 方块变形函数:实现方块的旋转。
  7. 检测函数:检查是否有完整的一行方块,若有则消除并更新得分,若方块触及顶部则返回结束函数。
  8. 音乐函数:按键音、消行特效音、失败特效音、背景音乐的播放与暂停。
  9. 按键检测函数:根据按键的不同,返回不同的值
  10. 随机数生成函数:根据上课知识编写的完全随机函数,主要用于随机生成方块。
函数声明
void main_page(void);           //绘制主界面函数
void welcome_page(void);        //绘制欢迎界面区函数
void info_page(void);           //绘制信息栏函数
void pixel_page(void);          //绘制方块区函数
void start_animate(void);       //绘制游戏开始动画函数
void fail_animate(void);        //绘制游戏结束动画函数
void pause_animate(void);       //绘制游戏暂停动画函数
void kill_line_animate(int);    //绘制游戏消行动画函数
void draw_pixel(int,int,int);   //绘制单个方块函数
int key_check(void);            //按键检测函数,返回按键代码:无输入0,左1,右2,上3,下4,空格5,pause6,sound7,reset8,enter9
void game(void);                //游戏主函数
void game_reset(void);          //游戏重置函数
void new_shape(int a);          //生成新方块函数,传入新方块的形状代码
int change_shape(void);         //改变方块形状函数,成功返回1,失败返回0
int move(int i);                //移动方块函数,传入值:左移1,右移2,下移3,返回值:成功1,失败0
void game_check(void);          //检测方块满行、执行消行、检测游戏结束函数
int my_random(int max);         //生成随机数函数,传入随机数最大值,返回生成的随机数
void play_sound(const char* musicname); //播放音乐函数,传入音乐名,播放相应音乐

五、编写历程

我们的《俄罗斯方块》游戏立项于2023年11月6日,于当日编写完成V1.0版本;11月8日完成结组,于当日编写完成V1.1版本,并于11月10日完成首个由团队合作完成的V2.0版本。

V1.0版本界面简陋,支持方块的随机生成、自动下落与重叠检测,但不支持任何键盘输入操作,V1.1版本简单优化了界面体验,支持自定义游戏区域大小,并开始支持通过键盘输入左移右移方块,但不支持方块的旋转。

图片

V1.0版本游戏界面

图片

V1.1版本游戏界面

V2.0版本首次实现了全部俄罗斯方块的基本操作,并新增游戏难度调节、记分板、游戏关卡、主题设置功能。V2.0版本设计了完善且直观的欢迎页面,大幅提升游戏体验。

图片

图片

V2.0版本欢迎界面和游戏界面

12月8日,《俄罗斯方块》V2.5版本编写完成。V2.5版本与V2.0版本相比,在游戏界面上无明显差异,但在细节之处进行了多项重大升级:

  1. 大幅删减冗余代码,合并功能重复的函数,使代码由900行压缩至450行。
  2. 原版本的画面采用清屏重绘的方法实现更新,导致在性能较低的VMWare Workstation虚拟机进行测试时,频繁出现频闪与卡顿问题。经过改进,采用移动光标,部分重绘的方法解决了此项问题。
  3. 原版本键盘输入十分卡顿,影响游戏体验。经过反复试验,我们摸索出最流畅的游戏循环结构,使对键盘输入的读取延迟得以降低,大幅提升游戏体验。
  4. 方块变为彩色。
  5. 支持通过文件读写保存游戏的分数。

图片

V2.5版本游戏界面

12月21日,《俄罗斯方块》V3.0版本编写完成。该版本取代以往版本的控制台界面,首次调用图形库绘制游戏界面。

图片

图片

V3.0版本欢迎界面和游戏界面

12月25日,《俄罗斯方块》V3.1版本编写完成。作为呈递展示的最终版本,该版本新增游戏背景音乐与多种游戏音效,新增游戏启动动画与消行动画,在游戏体验上做到了我团队能达到的极致。该版本交由寝室同学试完时,受到了热烈的欢迎。附上一位同学试玩的得分照片,该同学试玩半小时有余,从图中可看到得分为24740分,清除了192行方块,证明了本游戏的可玩性与流畅性。

图片

六、代码原创程度

  1. 本游戏的代码原创程度较高,关于方块操作的核心代码以及其它绝大多数代码都由本小组成员独立完成。
  2. 播放音乐函数的部分代码借鉴了网络信息。
  3. 游戏主界面的创意、颜色选取与部分动画综合借鉴了网络上的多款类似游戏,但其代码实现均由本小组成员独立完成。
  4. 本小组成员依据参考书籍、官方文档学习并完成的代码,被归为原创代码。此部分内容包括自主学习的二维数组知识、指针知识(项目开始较早,当时课堂还未学习这些知识)、EasyX图形库函数、Windows API等。

七、心得体会

通过开发俄罗斯方块程序,我们获得了宝贵的经验和体会:

  1. 团队合作:开发过程中,我们充分利用团队成员的优势,分工合作,提高了工作效率。其中王浩雄同学是项目的发起人,完成了思路构想、界面设计和主体程序的编写,袁昊同学起到重要的辅助作用,对主体程序的精简与修改提出多条重要意见,负责一部分辅助函数的编写,负责对程序重难点代码进行注释。
  2. 逻辑设计:良好的算法设计和程序逻辑对于实现复杂游戏功能至关重要,我们在这方面取得了很大的进展。
  3. 用户体验:友好的界面设计和流畅的操作体验是吸引玩家的关键,我们注重细节,不断测试,不断改进,力求提供出色的用户体验。
  4. 总结:通过编写俄罗斯方块程序,我们不仅提升了编程技能,还加深了对游戏开发和用户体验的理解。我们相信,这个程序将为玩家带来欢乐和挑战,并为我们团队的努力付出带来认可。