我罗斯方块第二次作业(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项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
随机推荐
- P4249-[WC2007]剪刀石头布【费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P4249 题目大意 \(n\)个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多. \( ...
- pkusc2021游记
@ 目录 前言 Day 0 Day 1 Day 2 Day 3 前言 到时候APIO的大概也会写在这篇里吧. Day 0 车,公交,飞机,公交,车 坐了半天的交通终于到了,整个人都坐的晕乎乎的,然后看 ...
- Mybatis逆向工程和新版本MybatisPlus3.4逆向工程的使用
Mybatis和MybatisPlus3.4的使用 目录 Mybatis和MybatisPlus3.4的使用 1 RESTFUL 2 逆向工程 2.1 tkMybatis逆向工程 2.1.1 导入依赖 ...
- 常见的==和equals比较
在笔试上碰到很多这样类似的题,全部整理到这里 String a = "Hello"; String b = "Hello"; String c = new St ...
- 1.JDBC编程六步走以及实现案例
1.注册驱动:通知Java程序我们要连接的是哪个品牌的数据库 2.获取数据库连接:Java进程和Mysql进程之间的通道开启了 3.获取数据库操作对象:这个对象是用来执行sql语句的 4.执行SQL语 ...
- 峰值利用率80%+,视频云离线转码自研上云TKE实践
作者 刘兆瑞,腾讯云高级研发工程师,负责腾讯明眸极速高清,画质重生等产品.专注于codec优化,画质增强等技术. 背景和问题 随着流量资费的降低和带宽的增加,视频成为人们获取信息越来越重要的方式,随之 ...
- 洛谷3721 HNOI2017单旋(LCT+set+思维)
这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我 ...
- NXOpen.BlockStyler的一些用法
关于BLOCK UI的一些控件的用法,本人曾经使用的代码,拿出来共享: Option Strict Off Imports NXOpen Imports NXOpen.BlockStyler Impo ...
- C++ 与 Visual Studio 2019 和 WSL(四)——库组件
C++ 与 Visual Studio 2019 和 WSL (库组件) Reference 在 C++ 项目中使用库和组件 | Microsoft Docs 演练:创建和使用自己的动态链接库 (C+ ...
- python爬虫时,解决编码方式问题的万能钥匙(uicode,utf8,gbk......)
转载 原文:https://blog.csdn.net/xiongzaiabc/article/details/81008330 无论遇到的网页代码是何种编码方式,都可以用以下方法统一解决 imp ...