我罗斯方块第二次作业(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中,并产生不同的颜色(待考虑)。

原文地址:https://www.cnblogs.com/lvhang/p/12936897.html