我罗斯方块第二次作业(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项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
随机推荐
- easy-rule 学习
Easyrule是个规则引擎,类似于drools,我们来熟悉一下这个东西 [ ] 一个简单实例规则,这个规则会被一直触发,然后行为是打印helloWorld @Rule(name="hell ...
- python numpy loadtxt
用numpy加载csv文件数据 发现python numpy loadtxt 方法和数据的结构有很大关系当我的数据有第一行文字是这样子的时候 我程序的运行结果永远都报错,编码格式也处理了统一utf-8 ...
- 简单介绍session,cookie,token以及区别
Cookie简介 ①.是由服务器发给客户端的特殊信息,以文本的形式存放在客户端 ②.客户端再次请求的时候,会把Cookie回发给服务器 ③.服务器接收到后,会解析Cookie生成与客户端相对应的内容 ...
- Ubuntu18.04安装MySQL教程
Ubuntu18.04下安装MySQL 提示:以下操作均在root权限下进行. # 查看有没有安装MySQL: dpkg -l | grep mysql # 安装MySQL: apt install ...
- nsq topic
与Topic相关的代码主要位于nsqd/topic.go中. 上一篇文字我们讲解了下nsq的启动流程.对nsq的整体框架有了一个大概的了解.本篇文章就是由大到小.对于topic这一部分进行详尽的讲解. ...
- 熊猫分布密度制图(ArcPy实现)
一.背景 大熊猫是我国国家级珍惜保护动物,熊猫的生存必须满足一定槽域(独占的猎食与活动范围)条件.因此,科学准确的分析熊猫的分布情况,对合理制定保护措施和评价保护成效具有重要意义. 二.目的 通过练习 ...
- GoLang设计模式10 - 中介者模式
中介者模式是一种行为型设计模式.在中介者模式中创建了一个中介对象来负责不同类间的通信.因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果. 中介者模式的一个典型案例是老式小火车 ...
- 串的模式匹配 BF算法和KMP算法
设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则 ...
- C 标准库函数手册摘要
<stdlib.h> int abs( int value ); long int labs( long int value ); 返回参数的绝对值 int rand( void ); v ...
- 一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?
一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白? 以下从死锁检测.死锁避免.死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优. 死锁检测 通过SQL语句查询锁表相关信息: ( ...