zoukankan      html  css  js  c++  java
  • 我罗斯方块最终篇

    作业描述 详情
    这个作业属于哪个课程 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文件里面调试,调了很久之后实现了功能也可以运行,但是游戏体验并不好,比较卡。
      本来还想着用线程解决,奈何到目前我们组还没有一个能搞明白的,就放弃了。
      后来把他们分到几个文件以后一起编译,惊讶发现竟然不卡了。
      或许这就是分文件编译的魅力吧。
    • 我现在在写这篇博客的时候可以用激动的心、颤抖的手来描述了。
      我们组居然真的能做一个游戏出来,虽然感觉画质不是很好,但还是很兴奋。
    • 我在整合的初期真的是有点绝望,一堆报错,不过幸好最后还是整出来了,坚持就是胜利!
  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/2002ljy/p/13079583.html
Copyright © 2011-2022 走看看