我罗斯方块汇报(1)

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 我罗斯方块汇报(1)
这个作业的目标 1.汇报自己这个阶段的开发进度。(完成了哪几个模块)2.讲述自己遇到的问题和尝试解决的方法和最后的结果(解决与否)3.制作一篇开发日记,描述自己开发某一个模块的过程。
作业正文 见下文
其他参考文献 俄罗斯方块的实现(windows) 使用C++一步步实现俄罗斯方块后续
小组成员 031902522--杨潮湧 031902503--陈松庆
项目地址 这里

开发进度

到目前为止,本组主要对几个类的声明部分做了一些修改、补充以及完善。并对程序主体框架做了规划和设计。同时,对其中的一些部分的实现进行了相关资料的查阅。各个类的具体完整实现还未完成。

类声明

首先是新的类声明

本次的修改相比之前的设计,类之间的联系较为紧密。由游戏类来控制游戏进程,将击键检测放入玩家类中,渲染类的成员包括大地图(二维数组)以及相关的渲染函数,专门用于完成游戏界面显示等方面的工

作。至于方块类,主要问题是如何刻画方块的形状以及确定方块的位置,还有方块的旋转、平移等操作。

head.h文件(暂定)如下
#pragma once
class Block;//方块类的前项引用
class Game {//游戏类
public:
	int Timecount;
	bool Choose();//游戏模式选择(单人还是双人模式)
	void Begin();//开始游戏
	int Timework();//计时工作
	void Getblock();//随机获得方块
	void Getp(Block &);//通过友元关系获取方块的位置(get position)
	void End();//结束游戏
};
class Block {//方块类
private:
	int shape;//方块的形状,一共七种,分别用1到7表示
	int X, Y;//标记方块在大地图上的位置,作为方块的中心坐标(也将作为下面pos数组的中心)
	int pos[3][3];//pos数组(3*3)用来绘制方块(position)
public:
	void Initial();//初始化方块
	void DropB();//方块自然下落
	void Cmove();//控制方块运动(control move)
	void Spin();//方块的旋转(spin)
	void Tran();//方块的平移(tranlation)
	friend void Game::Getp();//Game类由此获取方块坐标
};
class Render {//渲染类
private:
	int Map[10][25];//游戏界面大地图(宽10*高25)
	int Scount[4][4];//计分板(暂定)(score count)
public:
	bool Judge();//检测地图底部是否可以消行
	void Newmap();//更新大地图
	void NewS();//更新计分板
	//以及一些能让大地图以图形界面的形式显示出来的函数(暂定)
	void gameinterface();//显示游戏界面//用户模式选择界面
};
class Player {//玩家类
private://是否换成public会好一些?
	int score;//玩家的当前积分
	int top;//当前最高行数
public:
	int Getscore();//获取玩家积分
	int GetT();//检查玩家最高行是否为地图顶行
	void Key();//玩家击键指令检测(检测玩家是否发出指令以及该指令能否执行)
};

游戏类

本组打算在游戏类的实现中添加计时功能函数。该函数将会承担游戏开始之后的计时工作。设置此函数的目的在于:能在一定的时间间隔后,向方块类发送信息,使得方块类调用自动下落函数,完成一次(必然的)下移。

在实现该功能时,需要在程序的头文件中包含time.h头文件。添加之后就可以使用clock()函数了。调用clock()函数可以得到从程序启动到此次函数调用时累计的毫秒数。

预先在宏里定义好方块下落的时间间隔

#define TICK 1//将方块每次下落的时间间隔设置为1秒

先在主函数中调用一次clock(),取得一个初始计时点last,并将last值加上预先定义好的时间间隔值,求得基准值。

clock_t last;
//用户点击开始游戏之后
last = clock()/ CLOCKS_PER_SEC+ TICK;

接着在Game类的计时函数中,可以在每次调用时,比较当前时间与基准值,当当前时间大于等于基准值时,Game类对象向方块类发出自动下落的信息,若小于则不下落,继续执行后续语句。

//在Game类的计时函数中
	void Game::Timecount()
	{
		clock_t now=clock();
		if (now >= start) {
			start += TICK;
			//接着调用方块类的自动下落函数
		}
	}

在设计Getblock()函数的过程中,本组决定在随机生成方块时,首先创建一个随机数种子。
主函数中

 srand((unsigned)time(NULL));

然后在后续游戏进程中,当需要随机生成一种方块时,对该随机数取模,以此决定生成的方块种类。

void Getblock()
{
    now_shape = rand() % 7;
    //后续操作
}

渲染类

之前本组成员对渲染类这部分不是很了解,查阅了一些资料后,了解到如果需要使用到控制台,在控制台上进行操作(即游戏界面),需要使用到Windows.h头文件。

在一个大佬那儿了解到可以这样消除光标:
在写主函数之前

HANDLE hdl;

根据我们搜集到的资料,这应该是一个窗口句柄,用于控制台的有关操作。

接着在main()函数中

hdl = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci = { 1,0 };
SetConsoleCursorInfo(hdl, &cci);
SetConsoleTitle("TETRIS!!!");

玩家类

对于玩家类中的击键检测函数,实现其功能需要使用到conio.h头文件中定义的getch()函数。

这样就可以对玩家的击键做出反应

方块类

查阅了一些资料之后,对于实现方块类的旋转,有如下思路:

类似于矩阵的旋转,先将 shape 数组进行斜对角线对称化,再进行左右对称,便完成了旋转,需要注意的是要判断旋转后方块是否出界或重合,如果是,则取消本次旋转。

目前遇到的一些问题

如下:

对于有关调用window控制台等渲染部分的操作仍然比较迷茫,有些无从下手

(1)对于句柄还是很陌生,需要继续学习以及尝试使用与其相关的各种操作。

(2)对于windows.h,time.h等头文件中的函数使用,仍在学习中,毕竟第一次接触到这些头文件。

对于多人开发的模式,有着一些新鲜感,同时也有一些疑虑。

(1)对于如何分配开发任务的问题。对于我罗斯的开发,我们的开发小队应该如何分配工作。可以每人分别负责两个类的编写吗?这样可行吗?(比如Block类需要Game类来追踪,如果我编写的是Block类是有我来编写,而Game类则交给别人,这样的话,是不是在进行类的测试时,会遇到麻烦?)

(2)我罗斯的编程,应该如何安排进度,是应该先实现单一类吗?还是每一类都需要同步跟进?如何安排测试?从哪里才能入手?
本组的初步决定是,先实现渲染类部分,完成到能调用控制台显示游戏界面,再去实现方块类,接着再进行游戏类、玩家类的实现,这样合理吗?

呜呜呜感觉大家有好强啊

唔还需要继续努力,要学的东西多着呢!冲!!!

posted @ 2020-05-22 20:36  枭魈  阅读(196)  评论(1编辑  收藏  举报