我罗斯方块最终篇
这个作业属于哪个课程 | 2020年面向对象程序设计
- | - | -
这个作业要求在哪里 | 我罗斯方块最终篇
这个作业的目标 | 1.代码的 git 仓库链接
| 2.运行截图/运行视频。
| 3.代码要点
| 4.收获与心得
| 5.依然存在的问题
成员 | 031902335方静怡
|031902343张妍
项目地址 | github地址
运行截图
代码要点
方块类作为基类,其中初始化方块的种类和变形
int block[7][4][4][4];//block[方块种类][4种变形][][]
class Tetris {//方块类
public:
Tetris();
};
游戏类继承于方块类
class Tetris_Game :public Tetris {//游戏类
public:
void pause_();//暂停函数
void end1_();//结束函数1
void end2_();//结束函数2
};
玩家类
两个玩家类其中有部分函数是相同的,有想过合并起来,但是还没有实现出来
class Tetris_Player1 :public Tetris {//玩家类1
public:
int nx, ny;
int t0, t1;//暂时保存
int blocknow[4][4];
int blocknext[4][4];
int turn;
int type;
DWORD time_now;
Tetris_Player1()
{
nx = 1; ny = 16;
time_now = 0;
for (int i = 4; i <= 29; i++)
{
map1[i][2] = 1;
map1[i][3] = 1;
map1[i][35] = 1;
map1[i][36] = 1;
}
for (int j = 3; j <= 35; j++)
{
map1[29][j] = 1;
}
}
Tetris_Player1(int x, int y) :nx(x), ny(y) {}
void create_block();
void remove_block();
void print_block();
int readkey();
void left_block();
void right_block();
void turn_block();
void normalfall_block();
void speedfall_block();
int fall_block();
bool judgetop_block(int xn);
bool judgebottom(int xn);
bool judgebottom_block();
void forecast_block();
void nexttonow();
void clear_forecast();
void run();
bool judgeleft();
bool judgeright();
bool detectCollision();
void markmap();
void clear_line();
void gameover();
};
class Tetris_Player2 :public Tetris {//玩家类2
public:
int nx, ny;
int blocknow[4][4];
int blocknext[4][4];
int turn;
int type;
int t0, t1;
DWORD time_now;
Tetris_Player2()
{
nx = 1; ny = 87;
time_now = 0;
for(int i=4;i<=29;i++)
{
map2[i][73]=1;
map2[i][107]=1;
}
for(int j=74;j<=106;j++)
{
map2[29][j]=1;
}
}
Tetris_Player2(int x, int y) :nx(x), ny(y) {}
void create_block();
void remove_block();
void print_block();
int readkey();
void left_block();
void right_block();
void turn_block();
void normalfall_block();
void speedfall_block();
int fall_block();
bool judgetop_block(int xn);
bool judgebottom(int xn);
bool judgebottom_block();
void forecast_block();
void nexttonow();
void clear_forecast();
void run();
bool judgeleft();
bool judgeright();
bool detectCollision();
void markmap();
void clear_line();
void gameover();
};
渲染类
class Tetris_xuanran :public Tetris {//渲染类
public:
void Welcome();//进入界面
void Setname();//命名
void SetFrame();//游戏界面
};
存在问题
因为组内两个人都是新手小白级别(非常小白那种),知识储备比较少,经验也少,所以存在的问题很多。就目前没有解决的问题有:
1.键盘操作方面,没有办法做到两个玩家同时操作并且键盘识别也不是特别灵敏(目前是当光标在哪边,另一边就能识别),尝试过很多方法,都没有办法解决,特别识别的灵敏度,调出来识别灵敏,但是同步下降又没法实现,总之好像没办法都顾及到。
2.预测方块与方块变形似乎有些矛盾,导致变形方块的时候会变形成下个方块变形后的形态。
3.没有实现此消彼长,尝试了几种方法,没有办法达到想要的效果。
4.方块在前五行的时候,如果左右移动,会有方块部分印记残留原来的位置。
5.消行的时候暂时没法做到多行一起消除,一次只能消除一行。(存在的问题包括但不限于以上所述,这些问题,今后有能力会继续完善)
6.设计了暂停界面,但是还没有找到接口
收获与心得
这是我们两个新手小白第一次做游戏的设计,虽然我们的我罗斯方块可能完成得不如别的组那么好,但是我们在这次设计中有极大的收获。通过这次的游戏制作,我们深刻感受到了游戏制作的不易。做PTA上的练习题的时候,都是题目给你限定了各种条件,甚至限定了类的内容,做题只需要填充内容就可以了。而做我罗斯方块,需要自己确定框架,界面,自己建立变量,设计每个模块运行的条件,还要通过搜索学习一些不会在做题中碰到的一些操作(比如获取方向键,获取鼠标点击等等)。自己设计游戏是什么都要自己想的。在做的过程中,我们终于能深刻领会老师之前说的会打代码最重要的是会debug,这也是最令我们崩溃的地方,经常会碰到的情况是,一个地方出现bug,需要不断的回到各种函数里,设计不同的辅助输出去找,有时候会一两天都找不到这个bug,甚至是解决了这个bug,另一个bug又产生了,但是每次能成功解决的时候是特别感动的。还有一点,我们体会特别深刻,就是细节的重要性,往往是一个地方打错了就会影响整个代码的运行,导致debug的时候特别困难。