作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020面向对象程序设计 |
这个作业要求在哪里 | 我罗斯方块最终篇 |
这个作业的目标 | - 代码的 git 仓库链接 - 运行截图/运行视频 - 代码要点 - 收获与心得 - 依然存在的问题。 |
作业正文 | 我罗斯方块最终篇 |
Github地址 | 我罗斯方块 |
其他参考文献 | |
小组成员 | 031903146 罗佳昱 031903144 李雨情 111900811 林杞垒 |
话不多说先上运行视频
- 要下载下来看
- 由于我一个人玩双人模式,手会不协调,录视频老是失败,所以录了两个视频分别测试了两个玩家的功能
玩家一
玩家二
-
玩家一失败
-
玩家二失败
代码要点
- 画方块直接用图形
■
- 所有方块旋转是有一个中心的
游戏界面
- 游戏界面方面的内容在
Tetris
类中
利用颜色设置函数和光标控制函数合作画出界面
颜色设置函数
void SetColor(int);//控制颜色
光标控制函数
void SetPos(int i, int j)//控制光标位置,列,行
方块形状变化
利用数组记录各个形状的方块的对应点坐标,并且用define
为每个形状标记对应ID
方块变形
利用标记的ID,很容易就实现了变形
方块下落
- 设置循环
- 利用画方块和擦除方块函数配合实现下落的效果
void Draw(int x, int y, int num);//画方块
void ReDraw(int x, int y, int num);//擦除方块
- 在每次下落一格之前都用判断函数判断是否可以继续下落
virtual bool Judge(int x, int y, int num) = 0;//判断函数
- 如果下一次下落之后不能在下落,即碰到方块了,进入更新界面函数,画最后一次的方块,以及改方块的颜色和在画布上标记该处已经有方块。
void Updata(int p1, int p2, int idw, int play);// 更新界面
- 键盘读取
键盘读取是配在方块下落这个大函数中,每次下落一格之前读取一下键盘响应。
方块消行
先把游戏区域内的所有方块清空,再将画布的标记整体下移,再根据画布的标记重新绘制方块,从而实现方块消行。
int ClearLine(int p1, int p2, int idw); //消除行
增加垃圾行
依然是先把游戏区域内的所有方块清空,再将画布的标记整体上移。
再利用
srand((unsigned)time(NULL)); //根据不同时间生成不同的种子
int x = (rand() % (9)) + 1;//随机产生生成行的方块数
产生随机数(这里是可以生成重复随机数的),确定要增加的垃圾行有多少个方块
再利用
vector<int> GenerateDiffNumber(int min, int max, int num);//产生不重复的随机数
随机生成不重复的随机数确定要将方块放置的坐标(这里的随机数不能重复),并在画布上标记
void addline();//增加垃圾行
最后根据画布重新画出方块,从而实现增行
一些变化
- 在学了继承和多态之后,创了
Block
作为两个方块类的基类,缩短了代码量 - 玩家类最后我选择跟方块类合体了,玩家类只有一个读取键盘响应函数,且与方块类联系紧密,设置
Mino1 Mino2
作为玩家一和玩家二。
功能实现情况
- 题设要求基本全部实现,具体可以看视频
- 至于计算分数,我们组讨论了一下,认为双人模式比的是谁先输,跟分数无关,最后选择删除了计算分数部分的代码。
更多具体代码实现在GitHub仓库:我罗斯方块
存在的问题
- 在游戏方面或许有隐藏问题,不过目前还没发现有什么问题
- easyx的渲染方法还是不会搞,这也是从一开始动工就折磨我很久的问题,害,只能先这样吧
收获与心得
- 在整合期,我把他们放在了一个cpp文件里面调试,调了很久之后实现了功能也可以运行,但是游戏体验并不好,比较卡。
本来还想着用线程解决,奈何到目前我们组还没有一个能搞明白的,就放弃了。
后来把他们分到几个文件以后一起编译,惊讶发现竟然不卡了。
或许这就是分文件编译的魅力吧。 - 我现在在写这篇博客的时候可以用激动的心、颤抖的手来描述了。
我们组居然真的能做一个游戏出来,虽然感觉画质不是很好,但还是很兴奋。 - 我在整合的初期真的是有点绝望,一堆报错,不过幸好最后还是整出来了,坚持就是胜利!