我罗斯方块作业汇报1

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 我罗斯方块作业汇报(1)
这个作业的目标 1.汇报自己这个阶段的开发进度。(完成了哪几个模块)
2.讲述自己遇到的问题和尝试解决的方法和最后的结果(解决与否)
3.制作一篇开发日记,例子如此,描述自己开发某一个模块的过程。
成员 031902439 苏海瑶
031902437 赖凯慧
031902416 饶清
作业正文 我罗斯方块作业汇报1
github地址 github作业地址
其他参考文献 1.C++类
2.编写俄罗斯方块思路

一、开发进度

一共四类:方块类、游戏类、玩家类、渲染类。

现阶段已经完成方块类中的方块构造函数、方块旋转函数以及方块移动函数

二、开发日记

  • (5.9)对接下来进行计划

  • (5.10~5.13)对现有的单人俄罗斯方块代码及博客进行研究、学习

  • (5.15~5.16)编写方块构造函数,并进行修改和改进

class Block 
{
	public:
		int x; // 横坐标,以左上角为标志位 
		int y; // 纵坐标,以左上角为标志位 
		int type; // 方块类型 
		int director; // 旋转方向 0:向左,1向右 
		int shape[4][4]; // 格子大小 
		int shapes[8][4][4]; 
		/* 设置方块属性 */ 
		void set(int xx, int yy, int sshape){
			x = xx;
			y = yy;
			if(sshape != -1){
				for(int i = 0; i < 4; i++)
					for(int j = 0; j < 4; j++)
						shape[i][j] = shapes[sshape][i][j];	
				type = sshape;
				director = 0;
			}
		}
		void generate(){
			for(int i = 0; i < 8; i++)
				for(int j = 0; j < 4; j++)
					for(int k = 0; k < 4; k++)
						shapes[i][j][k] = 0;
			// 取值为1表示的是此处有方块■,其他为0则表示没有方块
			/* 石头 */
			shapes[0][1][1] = 1;
			
			/* 棍子 */
			shapes[1][1][0] = shapes[1][1][1] = shapes[1][1][2] = shapes[1][1][3] = 1;//1 1 1 1
			
			/* 七 (左)*/                                                             //1 1
			shapes[2][0][0] = shapes[2][0][1] = shapes[2][1][1] = shapes[2][2][1] = 1;//  1
			                                                                          //  1
			/* 七 (右) */                                                             
			shapes[3][0][1] = shapes[3][0][2] = shapes[3][1][1] = shapes[3][2][1] = 1;
			
			/* 凸 */                                                                  //  1
			shapes[4][0][1] = shapes[4][1][0] = shapes[4][1][1] = shapes[4][2][1] = 1;//1 1 1
			
			/* 田 */                                                                  // 1 1
			shapes[5][1][1] = shapes[5][1][2] = shapes[5][2][1] = shapes[5][2][2] = 1;// 1 1
			
			/* Z(左) */
			shapes[6][0][0] = shapes[6][0][1] = shapes[6][1][1] = shapes[6][1][2] = 1;
			
			/* Z(右)*/                                                                // 1 
			shapes[7][0][2] = shapes[7][0][1] = shapes[7][1][1] = shapes[7][1][0] = 1;// 1 1
			                                                                          //   1
		}
 }; 
  • (5.17~5.19)编写较为困难的部分:方块旋转函数

void rotation(Block *block,int director){
	//向左旋转
	if(director==0){
		int value=block->shape[0][0];
		block->shape[0][0]=block->shape[0][2];
		block->shape[0][2]=block->shape[2][2];
		block->shape[2][2]=block->shape[2][0];
		block->shape[2][0]=value;
		value=block->shape[0][1];
		block->shape[0][1]=block->shape[1][2];
		block->shape[1][2]=block->shape[2][1];
		block->shape[2][1]=block->shape[1][0];
		block->shape[1][0]=value;
	} 
	else if(director==1){
		int value=block->shape[0][0];
		block->shape[0][0]=block->shape[2][0];
		block->shape[2][0]=block->shape[2][2];
		block->shape[2][2]=block->shape[0][2];
		block->shape[0][2]=value;
		value=block->shape[0][1];
		block->shape[0][1]=block->shape[1][0];
		block->shape[1][0]=block->shape[2][1];
		block->shape[2][1]=block->shape[1][2];
		block->shape[1][2]=value;
	}
	//特殊情况
	if(block->type==1){
		if(block->shape[1][3]==1){
			block->shape[1][3]=0;
			block->shape[3][1]=1;
		}
		else{
			block->shape[1][3]=1;
			block->shape[3][1]=0;
		}
	} 
}
void _transfer(int **map, Block *block, int sign){
	int director = block->director;
	cleanBlock(*block);	 // 擦除旋转前的block 
	switch(sign){
		case 0:
			rotation(block, director);
			// 碰撞的检查
			if(checkCrash(map, block) == 1){
				rotation(block, director^1);
			}
			break;
		case 1:
			rotation(block, director);
			block->director = block->director ^ 1;
			// 旋转后进行碰撞检查
			if(checkCrash(map, block) == 1){
				rotation(block, director ^ 1);
				block->director = block->director ^ 1;
			}
			break;
	}
	
	drawBlock(*block);  // 重新绘制旋转后的block 
}
/* 旋转 */
void transfer(int **map, Block *block){
    int sign = block->type;
	//sign: 什么类型的方块, 不同类型的方块的旋转策略不同 
	if(sign == 2 || sign == 3 || sign == 4){ // 在左上角的三格内旋转 
		_transfer(map, block, 0);
	}
	else if(sign == 1 || sign == 6 || sign == 7){	// 处理棍子,Z
		_transfer(map, block, 1);
	}
	else if(sign == 0 || sign == 5){	// 不需要处理的 
		return;
	}
}
  • (5.20~5.21)编写方块移动函数

int _move(int **map, Block *block, int x, int y, int sign){
	// sign: 1表示向下移动, 0表示左右移动 
	/* 消除所有属于block的块 */
	/* 重新定位block的位置,生成新的block */
	cleanBlock(*block);
	block->set(block->x + x, block->y + y, -1);
	if(checkCrash(map, block) == 1){
		block->set(block->x - x, block->y - y, -1);
		drawBlock(*block);
		if(sign == 1)
			addBlock(map, *block);
		return 1;
	}
	drawBlock(*block);
	return 0;
}

三、遇到的问题以及一些解决

  • 目前我们小组在我罗斯的开发中,因为没有以前的相关经验,所以慢慢摸索的过程会显得略微艰难困苦。

  • 到目前为止,我们组主要完成了方块类,但只在脑海中构建出不那么粗陋的界面,(甚是心酸)。其中方块类中对方块旋转和移动都经过了简单测试。

  • 目前在对从未接触过的渲染类进行编写,但过程不是特别顺利,可能是因为还未找到正确的方法,只能继续努力

  • 因为之前从来没有自己单独设计过项目,也没写这么长代码的经验,因此,我们在做我罗斯的开发中主要采用的就是分块去写函数,在每一次的分步过程中累加经验,提升自我,最终希望能做出一个成形的游戏

猜你喜欢

转载自www.cnblogs.com/ClaireSHY/p/12939356.html
今日推荐