【新手入门】SDL+C语言编写俄罗斯方块小游戏小经历

基础太差,现在重新学习了一遍C语言。因为训练要求,要学习SDL库的使用,编写个SDL+俄罗斯方块小游戏。转眼一周多,小白终于写出来了。以下是一些体会。感觉还是好好学习,多撸代码才是正道。

一、游戏规则

1.打开游戏,游戏开始,方块自由下落。

2.当按下左键,方块对环境进行判断,条件应许即进行左移;

3.按下右键,方块对环境进行判断,条件应许即进行左移;

4.按下下键,方块对环境判断,条件应许即加速下落;

4.满行消行+计分规则:当游戏区域矩阵中一行全有方块时,此行之上方块集体下移一个位置;且得分+20分。

5.游戏失败,当游戏中每行都有方块存在达到第18行(以上为方块禁止区)时,游戏失败;

6.游戏通关:但累计分数达到200分时,游戏通关。

7.游戏暂停/继续:当按下UP键时,游戏暂停,再次按下UP键时,游戏继续。

8.游戏短时暂停:当鼠标放在开关区域时,每次暂停3+3秒。

9.方块变形:当按下SPACE键时,方块对周边环境进行判断,条件应许即进行变形。

二、已实现游戏功能

1. 游戏规则功能:左移、右移、加速下降、短时暂停、暂停/继续、计分、满行消行;

2.背景音乐:全程背景音乐、满行消行音乐、方块到底音乐、游戏成功音乐、游戏失败音乐。(利用SDL_mixer.h)

3.计分动态显示;(利用字体库SDL_ttf.h)

4.图片显示:各背景图片、游戏成功显示图片、游戏失败显示图片(利用SDL_image.h)

5.效果如如下:

图1:游戏中

图2.游戏成功


图3. 游戏失败

三、遇到的主要问题及解决办法:

1. 得分动态显示模块:

利用ttf字体文件(font1.ttf),这个字体文件在ttf的库中是没有的,得另外下载、代码应用;显示得分,需先将整型数据储存到数组中(利用sprintf()函数)再输出即可。

2. 小游戏中声音播放多种声音混乱不清问题(上周报告已说明)

原因:主要是Mix_Music、Mix_LoadMUS()和Mix_Chunk、Mix_LoadWAV()的问题、播放一种声音用Mix_LoadMUS()即可,但是两种声音时可能会导致通道channel混乱问题导致声音混乱;

解决:将背景音乐用Mix_LoadMUS()加载和用Mix_PlayMusic播放;  其他动态声音用Mix_LoadWAV()加载和用Mix_PlayChannel播放,分开就好。

3.(主要/麻烦问题)变形函数设计的问题:变形冲突、不能变形也变形。可变形当不变形问题。

原因:7中方块共19种方块形态类似但位置不一样,因而变形条件也不一样。

思路:7大类方块变形的检测条件应不一样,应分开进行、独立检测,然后再进行变形。

解决办法:对7大类分块独立绘图,分析变形前后方块的位置条件关系,以此作为方块变形条件进行位置判断,再进行。如下图:

注:此处方块较多,位置分析较杂,可能存在记录手误,导致变形出现未知debug。

4.shapeshift()方块变身函数实现运行时,不能实现连续变身,只变身一次就返回的问题。

原因:可能是方块标号random的定义问题,random应为全局变量,不为全局变量时,内部函数没有修改函数外的random,因为只变身一次就返回原状。

解决:去掉random作为shapeshift()函数的接受参数,让random以全局变量的形式存在于每一处。

5.去除方块下移轨迹的问题:

原因,方块每次下落时图片的刷新,应去除方块图片的轨迹才能实现看起来下落的清晰效果。

思路:方块每次下落即是一次刷新,每次刷新前应用原来的方块形图片去除正在下落的方块形态后对刷新后的方块图片进行刷新。此处应与储存方块的思路连接起来。

解决办法:每次刷新前,用备份地图对游戏地图进行刷新,下落方块再对地图补充,以此实现。

6.(主要问题)每次一大块方块下落,在下落过程中、下落完成后、如此循环时:如何存储已下落方块、正在下落方块等的问题。

原因:若没有对地图进行刷新,可能出现连续方块、方块不能存储、方块重复、方块丢失、计数错误等问题。

思路:应对地图进行备份处理,设置两份地图,一份地图专门用来储存方块,刷新另一份地图用;另一份用来结合正在下落的方块表现在屏幕前。

思路来源:看了网上较多的经验分享和看法,借鉴别人。

解决办法:设置两份地图:储存用的备份地图和下落方块的表现地图。表现地图每次出来前用储存方块的备份地图进行刷新。

7.(主要问题):存储地图问题:如何识别正在下落方块、以下落停止的方块、围墙。

原因:方块的性质不同,没有对其进行区分可能会导致储存和显示问题。(开始设计游戏区域时没有将围墙区域划进游戏矩阵中,导致方块储存和移动监测一直找不到思路。)

思路:将围墙划进游戏区域中,方便左右移动方块等检测用。对方块性质进行不同标记。

解决方法:对不同性质的方块进行标记。游戏中:赋值情况:围墙=2;正在下落的方块=30;已下落停止的方块=31;每次显示地图时按Map[i][j]的值对其赋予相应的图片。

8.左移、右移问题:主要是方块周边位置的判断位置。

解决:利用方块的行和列Row[]和List[]来检测。

9.按键操作过快判断不及时问题:

解决:对方块下落条件加了延时,让地图的刷新变快,方块的下落变慢,从而有更多机会进行判断。

ééé存在问题:可能存在较多还未知bug。


猜你喜欢

转载自blog.csdn.net/qq_41969790/article/details/80686977