负责任务

  • 完善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类)的更多相关文章

  1. 我罗斯方块第二次作业(Player类)

    我罗斯方块第二次作业 我的任务 完成player类的编写 player类的测试 我的计划 类的设计: Player类作为一个玩家类,需要处理和玩家有关的所有信息,以及维护玩家的游戏页面map.关于玩家 ...

  2. 我罗斯方块最终篇(Block类)

    负责的任务 完善Block类的相关函数及变量: 对Block类中函数进行调整改进,并于其他人负责的类相互配合: 对Block类的函数功能进行调试: github项目地址. 效果图 具体可见总篇,一下仅 ...

  3. 我罗斯方块最终篇(Player类、Game类)

    我罗斯方块最终篇(Player类.Game类) |--------------------项目GitHub地址--------------------| 目录 我罗斯方块最终篇(Player类.Gam ...

  4. 我罗斯方块最终篇(Interface类)

    负责的任务 游戏过场及界面设计 Interface类的基础实现 根据队友需求完善Interface类功能 Interface类的本地测试 辅助队友改良游戏操作 代码要点 我们主要是通过控制台进行界面渲 ...

  5. UML与软件建模:第二次作业(类图中类的表示)

    一.类图 (1)类图定义 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是在&q ...

  6. UML第二次作业:类在类图中的表示

    类在类图中的表示 一.概览 1.plant UML语法学习小结 2.班级学生管理系统中的 —— “学生” 类的属性.方法 3.类图脚本程序 4.类图示例 二.类图语法学习小结 1.类之间的关系 通过某 ...

  7. OO第二单元作业总结【自我反思与审视】

    第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...

  8. Java第二次作业——数组和String类

    Java第二次作业--数组和String类 学习总结 1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法.举例说明equals方法和==的区别 ...

  9. 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...

随机推荐

  1. PHP的SPL扩展库(一)数据结构

    SPL 库也叫做 PHP 标准库,主要就是用于解决典型问题的一组接口或类的集合.这些典型问题包括什么呢?比如我们今天要讲的数据结构,还有一些设计模式的实现,就像我们之前讲过的观察者模式相关的接口在 S ...

  2. 【vue】获取异步加载后的数据

    异步请求的数据,对它做一些处理,需要怎么做呢?? axios 异步请求数据,得到返回的数据, 赋值给变量 info .如果要对 info 的数据做一些处理后再赋值给 hobby ,直接在 axios ...

  3. 8.3 MHA 搭建

    操作步骤 1.配置主从 1.1 master /etc/my.cnf server-id log-bin skip-name-resolve 1.2 master 建立repl用户 grant rep ...

  4. JVM学习笔记——堆

    堆 Heap 一个 JVM 只有一个堆,堆也是 Java 内存管理的核心区域.在 JVM 启动时堆被创建,同时大小在启动时已设定好,堆是 JVM 管理最大的一块内存空间,其大小可以调节. 堆的内存空间 ...

  5. ssh 批量免密登陆

    SSH第一次连接远程主机 公钥交换原理 1.客户端发起链接请求2.服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)3.客户端生成密钥对4.客户端用自己的公钥异或会话ID,计算出一个 ...

  6. 洛谷3119 草鉴定(tarjan)

    题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...

  7. iOS路由最佳选择是什么

    背景 记得四年前iOS路由开始盛行,当时比较有名的是蘑菇街的,后来CTMediator写了几篇文章把蘑菇街批的体无完肤,导致我后来写新项目用了CTMediator,那一堆组件创建的叫一个酸爽啊!再后来 ...

  8. Ajax配合后端实现Excel的导出

    一.需求 在我们的日常开发中,可能经常需要遇到excel的导出,以往excel的导出服务器端都是使用的 GET 方法,但是某些情况下,服务器端只能使用 POST 方法,那么我们有没有好的方法实现exc ...

  9. stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  10. 硬件工程师必须掌握的PCB叠层设计内容

    总的来说叠层设计主要要遵从两个规矩: 1. 每个走线层都必须有一个邻近的参考层(电源或地层); 2. 邻近的主电源层和地层要保持最小间距,以提供较大的耦合电容; 下面列出从两层板到八层板的叠层来进行示 ...