我罗斯方块第二次作业
我的任务
- 完成player类的编写
- player类的测试
我的计划
类的设计:
Player类作为一个玩家类,需要处理和玩家有关的所有信息,以及维护玩家的游戏页面map。关于玩家信息,需要设置玩家姓名、玩家目前分数、玩家是否失败等等的存入获取接口。Player类中含有两个Block类的实例化,分别存储现在的方块和下一个方块,需要设置方块旋转和生成新方块的接口。关于和游戏控制Game类的对接,需要提供方块左移、右移、下移以及碰撞检测等,还有方块消行以及增加行数接口。对于Interface类的的对接,需要维护map数组供调用,其次还需提供获取用于定位方块的posX和posY、现有方块blockNow和下一个方块blockNext的接口,获取这些信息后,Interface可完成对页面的渲染
测试设计:
考虑现阶段未对Game类进行编写,所以在测试上有不方便的地方,所以选取两个接口进行测试,即方块下落和底部增加行,由于方块随机生成,在没有操作按键的情况下无法完成对方块的消行等操作,相关的测试将留到下一次作业提交时进行阐述
编程日记
2020/5/11
今天讨论了分工问题,我分配到Player类的完成,对于Player类,之前思考过如何完成,但是真正着手去做还是有些没把握
2020/5/12
咕
2020/5/13
创建player.cpp文件,写了下比较简单的分数获取名字获取等,思考如何完成Player的功能
2020/5/14
阅读源码
2020/5/15
增加新方块生成的功能,以及Player的初始化等等,继续阅读源码,实例化Block类,引入blockNow和blockNext,思路开始清晰起来
2020/5/16
阅读源码,写了下方块左移右移下移的函数,需要用到检测方块碰撞的功能,但是就开始没有头绪,不知道怎么将一个4*4的数组和一个20*10 数组进行碰撞的判。先将碰撞扔到了一旁,百度了关于随机数的实现的方法,思考下如何随机出底部的一行,关于随机生成方块,起初考虑的是固定随机生成的个数,但是考虑游戏的乐趣和代码的简便上,还是选定随机方块数不确定的方案,这样不用考虑随机的数的生成不重复的问题
2020/5/17
阅读源码,加入方块的定位概念,用于标记方块左上角,这样可以完成碰撞检测,联立起两个数组,也方便Interface的渲染。完成碰撞检测的功能
2020/5/18
阅读源码,参照源码完成消行操作,这里思考将来可以添加难度设置功能,将难度设置的级别和消行后的积分增加挂钩,更加人性化,参考消行操作的方块下移,完成了底部随机增加一行中方块上移的功能,完善底部随机增加一行的代码编写。这里思考到因为本次作业没有计划对Game类的编写,所以没有办法去测试消行操作,但是这个单元测试也必然需要拖到整个项目差不多完成时才能进行测试,不是很好
2020/5/19
咕咕咕
2020/5/20
博客初步编写,测试,发现问题,修复bug(还挺多), 交流讨论自己的代码
2020/5/21
完善博客,测试,发现问题,百度···,解决问题,交流讨论,日记到今天就结束了,在这个阶段完成了基本上的Player类的编写以及一小部分测试,关于收获,也是很多,对于面向对象的认识又加深了,将一个大的项目分类成不同的模块,每个人只需维护好自己的部分,确定公共的对接标准,就可以达到分工完成的目的。其次,也方便了单元测试,只要自己功能上没有问题,那么对于整个程序就没有问题,不会影响他人。
我遇到的问题
-
关于map数组的私有:
描述:
对于二维数组的获取,无论是初始化还是获取等等都无法实现,所以最终将map数组设置成共有成员函数,但是这样破坏了类的封装性,外界可直接对map数组进行修改,导致不够安全。
解决方案:
目前仍未找到有效的最优解决方案
-
关于测试的编译问题
描述:
关于vscode的运行cpp代码只会对目前这个文件单独编译,直接运行会发生报错
解决方案:
直接在控制台使用
g++
命令进行编译,再通过./
命令运行优化方案:
还记得之前学习过的.bat脚本编程,所以将编译和运行的命令直接写在脚本中,点击运行即可,大大减轻了测试过程中的负担
-
关于多文件编译的问题
描述:
再最初多文件编译时,会出现报错:
解决方案:
在百度过后发现问题,自己在头文件和cpp文件中重复
#include "block.h"
这一代码,从而导致报错提醒中:多处Block定义。 -
关于随机数问题
描述:
在百度搜索之后,得到随机数模板:
#include <cstdlib> #include <ctime> srand((int)time(0)); target = rand()%N // N代表随机范围
但是将
srand((int)time(0));
和rand()
放在同一个函数中,会发生以下情况产生新的随机方块和增加函数之后,随机出的数字相同
解决方案:
但是如果单独将
srand((int)time(0));
写在测试代码中中,却可以产生随机效果:目前还没有找到资料或是想到为什么会发生这样的情况