我罗斯方块最终篇

作业描述 详情
这个作业属于哪个课程 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文件里面调试,调了很久之后实现了功能也可以运行,但是游戏体验并不好,比较卡。
    本来还想着用线程解决,奈何到目前我们组还没有一个能搞明白的,就放弃了。
    后来把他们分到几个文件以后一起编译,惊讶发现竟然不卡了。
    或许这就是分文件编译的魅力吧。
  • 我现在在写这篇博客的时候可以用激动的心、颤抖的手来描述了。
    我们组居然真的能做一个游戏出来,虽然感觉画质不是很好,但还是很兴奋。
  • 我在整合的初期真的是有点绝望,一堆报错,不过幸好最后还是整出来了,坚持就是胜利!
原文地址:https://www.cnblogs.com/2002ljy/p/13079583.html