一、开发进度
一共四类:方块类、游戏类、玩家类、渲染类。
现阶段已经完成方块类中的方块构造函数、方块旋转函数以及方块移动函数
二、开发日记
-
(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;
}
}
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;
}
三、遇到的问题以及一些解决
-
目前我们小组在我罗斯的开发中,因为没有以前的相关经验,所以慢慢摸索的过程会显得略微艰难困苦。
-
到目前为止,我们组主要完成了方块类,但只在脑海中构建出不那么粗陋的界面,(甚是心酸)。其中方块类中对方块旋转和移动都经过了简单测试。
-
目前在对从未接触过的渲染类进行编写,但过程不是特别顺利,可能是因为还未找到正确的方法,只能继续努力
-
因为之前从来没有自己单独设计过项目,也没写这么长代码的经验,因此,我们在做我罗斯的开发中主要采用的就是分块去写函数,在每一次的分步过程中累加经验,提升自我,最终希望能做出一个成形的游戏