我罗斯方块第二次作业(Block类)
负责任务
- 完善Block类的相关函数及变量;
- 对Block类的函数功能进行调试;
- github项目地址。
开发日记
2020.5.11
今天和朋友们讨论了如何分工的工作,我负责的部分是Block类的完善与调试。而在上几周我们第一次讨论我罗斯游戏设计的时候,已经基本列出了Block类需要具有的功能以及需要具有的数据成员,所以我就在接下来的这几天时间里,查阅相关资料与代码,进行对Block类的完善。
2020.5.12
今天着手于对Block类中19种方块(包括七大类,几种旋转状态)的初始化,这里我们借助构造函数Block();来进行对各种方块的初始化。参考网上的代码后,决定定义19种4×4二维数组,然后对数组赋初值,需要显示方块的地方标注“1”,其余为“0”,测试输出如图贴出七种基本类型(这里注意,输出时遇到‘0’输出“(空格)(空格)”。遇到‘1’ 输出“ ■”。)

2020.5.14
今天在构造函数Block();中增添了对私有数据成员 Choose_BlockType_form[10]进行初始化的功能,此数组是用来记录每种方块分别有哪几种选择状态的。
2020.5.15
今天开始对随机生成方块的函数Block::RandBlock()进行代码的书写。主要的思路是利用switch语句然后借助产生的随机数,再根据不同的情况进入不同的case中对block数组(存储当前方块)利用for循环进行赋值。这期间遇到了几个问题,在讨论下顺利解决了,具体问题见下方“遇到的问题”部分。
2020.5.16
今天看了一下搜到的博客中的代码(参考博客附在总作业上),重点看了他们是怎么对方块进行旋转的,这也是我折腾最久的部分。
2020.5.17
大家在讨论中提到了将方块输出时利用控制台操作改变输出方块的颜色,这里调用了在windows.h头文件中的SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);函数对方块输出颜色进行了改变,后来想想可以让输出的方块颜色随机,并做了调整,运行结果图如下:

2020.5.19
今天开始着手于对方块旋转功能函数的书写。关键问题在于当随机生成方块的时候,我们要如何知道在block’数组中存的是哪一类型的方块?这个让我想了半天,最后决定再设两个变量,分别储存block数组中方块的类型以及旋转状态,并在随机生成方块的同时,对这两个变量进行标记。然后在旋转函数中借助switch语句先判断类型,然后利用if语句对不同的旋转状态进行不同的操作。运行结果如下:

注:我们采用的是逆时针旋转方向
2020.5.20
今天大家就上传到github上的代码进行再次调试发现了一个问题就是原先我是采用直接rand()函数产生随机方块,但是发现此时多次调用函数时产生的方块都是一样的。后面查找别人写的俄罗斯方块的代码,发现有一个特别的头文件time.h,需要调用里面的srand((int)time(0)); 对当前时间产生不同的随机数,这样最终也修复了这个bug。然后在别人测试后,还发现了一个问题,当我把这个函数放在随机方块的函数里时产生的都是同一种方块,当我把这个函数放在测试代码的main函数中时,却产生了不同的方块,这个问题待考究。。。
2020.5.21
今天开始准备写博客,然后在看了自己的代码与同学进行讨论,发现了代码需要优化的几个地方:
1.在构造函数中对19中方块进行初始化,如果我们需要调用多个对象,就需要多次进行初始化,这样做的话很费时间和内存,待优化;
2.在随机函数以及旋转函数中多次利用for循环对block数组进行赋值,是代码行数过多,可以编写一个函数来执行这些功能使代码更简略;
3.对于Block类中color函数的作用,在思考是否放在interface类中执行。
遇到的问题
1. RandBlock()与 TurnBlock()函数代码过于冗长
待解决: 写一个函数替代for循环赋值功能;
2. 利用switch分支有些麻烦,可否利用参考代码中: 旋转算法,让7种基础形状变换出剩余的21种。但是这样做需要把代码中很多地方进行修改。
待考虑:(解决办法)blocks[base][space_z + 1].space[i][j] = tem[4 - j - 1][i]; 控制一边坐标不变,另一边为4 - i - 1,然后再行列互换,这样可以保证四次旋转不同,如果仅仅行列互换,将会导致只有两种旋转状态。
3.在考虑初始化方块部分要不要只初始化七种基本类型方块
待考虑:这样做的话RandBlock()函数中switch语句的case情况会从18减化至8,方便很多,TurnBlock()函数中也只需对block数组中所存储的数据进行行列互换就可以了。
4.Xcode问题与解决
在合作过程中由于系统不同产生了比如中文注释会乱码,以及IDE中不存在头文件windows.h以及time.h,而后需要利用虚拟机进行完成。
5.rand()产生随机数和srand((unsigned)time(NULL))初始化随机数
此问题已解决,具体可见开发日记中阐述。
6.测试时多次调用 rand()生成方块一样,即产生随机数问题,具体可见余佳硕同学的博客
这是我们一起讨论的问题,而后我在写博客的时候再测试了一下,发现一个问题当把srand((int)time(0));放在函数里时我们多次调用会产生相同的结果,这就等同于我在测试函数中利用for循环多次调用此上述函数得到相同的结果。
测试代码如下:
int main(){
Block b;
for(int j=1;j<=19;j++){
srand((int)time(0)); //多次调用
b.RandBlock();
b.color(rand()%6);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(b.block[i][j]==1) cout <<"■";
else cout <<" ";
}
cout << endl;
}
}
return 0;
}
调整后:
int main(){
Block b;
srand((int)time(0)); //只调用一次
for(int j=1;j<=19;j++){
b.RandBlock();
b.color(rand()%6);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(b.block[i][j]==1) cout <<"■";
else cout <<" ";
}
cout << endl;
}
}
return 0;
}
之后查了一下此函数是根据什么实现的,发现这个函数的功能就是相当于根据当前时间种种子,调用一次后,再调用rand();就会产生多个随机数,注意到time(0)产生的时间是以秒为单位。所以如果我们多次调用此函数,而且程序在1s内完成的话,那么产生的方块就都是相同的了,因为产生随机数相同,参考博客会在总作业中标出!
7.在构造函数中对19中方块进行初始化,如果我们需要调用多个对象,就需要多次进行初始化,这样做的话很费时间和内存,待优化
暂时讨论的是想将19个数组数组定义成静态共有,并在类外直接初始化,这样就不用每次调用都需要进行初始化了。
8.对于Block类中color函数的作用,在思考是否放在interface类中执行
在19组数组中做标记,然后根据标记的数据,传入color中,并产生不同的颜色(待考虑)。
我罗斯方块第二次作业(Block类)的更多相关文章
- 我罗斯方块第二次作业(Player类)
我罗斯方块第二次作业 我的任务 完成player类的编写 player类的测试 我的计划 类的设计: Player类作为一个玩家类,需要处理和玩家有关的所有信息,以及维护玩家的游戏页面map.关于玩家 ...
- 我罗斯方块最终篇(Block类)
负责的任务 完善Block类的相关函数及变量: 对Block类中函数进行调整改进,并于其他人负责的类相互配合: 对Block类的函数功能进行调试: github项目地址. 效果图 具体可见总篇,一下仅 ...
- 我罗斯方块最终篇(Player类、Game类)
我罗斯方块最终篇(Player类.Game类) |--------------------项目GitHub地址--------------------| 目录 我罗斯方块最终篇(Player类.Gam ...
- 我罗斯方块最终篇(Interface类)
负责的任务 游戏过场及界面设计 Interface类的基础实现 根据队友需求完善Interface类功能 Interface类的本地测试 辅助队友改良游戏操作 代码要点 我们主要是通过控制台进行界面渲 ...
- UML与软件建模:第二次作业(类图中类的表示)
一.类图 (1)类图定义 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是在&q ...
- UML第二次作业:类在类图中的表示
类在类图中的表示 一.概览 1.plant UML语法学习小结 2.班级学生管理系统中的 —— “学生” 类的属性.方法 3.类图脚本程序 4.类图示例 二.类图语法学习小结 1.类之间的关系 通过某 ...
- OO第二单元作业总结【自我反思与审视】
第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...
- Java第二次作业——数组和String类
Java第二次作业--数组和String类 学习总结 1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法.举例说明equals方法和==的区别 ...
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
随机推荐
- sonar入门
一.Sonar是什么? 根据我的了解,可以说Sonar包含三个部分: SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码味道.它可以与您现有的工作流程集成,以实现跨项目分支和提 ...
- Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式
1. 前言 发送邮件,我们在平时工作中经用到,做为测试人员,在自动化测试中用的也比较多,需要发送邮件给某领导 SMTP是Python默认的邮件模块,可以发送纯文本.富文本.HTML 等格式的邮件 今天 ...
- DBeaver MSSQL 支持TLS设置
DBeaver是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 由于 DBeaver 基于 Java 开发, ...
- Spring IOC Container原理解析
Spring Framework 之 IOC IOC.DI基础概念 关于IOC和DI大家都不陌生,我们直接上martin fowler的原文,里面已经有DI的例子和spring的使用示例 <In ...
- JAR文件
目录 JAR文件 创建JAR文件 jar程序选项 清单文件 注释 可执行JAR文件 警告 多版本JAR文件 注释 关于命令行选项的说明 警告 警告 JAR文件 在将应用程序打包时,你一定希望只向用户提 ...
- Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul
前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr. 1.环境准备 我们准备两台centos7虚拟机 Dapr1:1 ...
- HCIP-RSTP
端口角色 根端口(RP): 非根桥收到最优的BPDU配置信息的端口为根端口,(到根桥开销最小的端口),根桥没有根端口. 指定端口(DP): 两非根交换机之间连接的两个端口必有一个为指定端口,比较两个非 ...
- Map中getOrDefault()与数值进行比较
一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...
- elasticsearch基于RBAC认证和集群之间的TLS通讯
elasticsearch基于RBAC认证和集群之间的TLS通讯 一.背景 二.需要解决的问题 三.给es增加用户名和密码访问 1.修改config/elasticsearch.yml 2.访问es集 ...
- spring cloud config 结合 spring cloud bus实现配置自定的刷新
在线上环境中,有时候我们希望系统中的某些配置参数在修改后,可以立即生效而不用重新启动服务.由上一节我们知道,我们可以把配置文件统一放到配置服务中进行管理,这一节我们在配置中心中整合spring clo ...