我罗斯方块最终篇
这个作业属于哪个课程 | 2020年面向对象程序设计 (福州大学 - 数学与计算机科学学院) |
---|---|
这个作业要求在哪里 | 我罗斯方块最终篇 |
作业正文 | 如下 |
设计者 | 031902231 郑霖睿 031902220 汪鸿宇 031902212 林炳灿 |
项目地址 | https://github.com/LRlicious/wo-luo-si-fan-kuai- |
这次的作业并没有完成预期的指标,一些必要功能还无法实现(指渲染类),因此无法展现游戏过程,,。。
游戏运行示意
预想的开始界面
预想的结束界面
代码要点
方块的的自动下落
ULONGLONG now,last;
int tick=100;
last=GetTickCount();
while (1){
now=GetTickCount();
if(now>last){_____}
这通过了GetTickCount()函数来获取时间,并通过now和last两个函数分别记载下一个自动下落时对应的时间和当前时间,若超过的tick所设定的间隔,则进行执行,并改变记录时间
而if里则执行的是标准的下降用的函数,也用于后续部分。
if(player1.Down()){
if(player1.Faile()){
player2.win=true;
}
int t=player1.Getscore();
if(t)
{
player2.Addline(t);
if(player2.Faile()){
player1.win=true;
}
}
}
按键识别
while(_kbhit()){//命令区 wsad与8456识别
key=_getch();
if(key=='w'){
player1.Up();
}
else if(key=='8'){
player2.Up();
}
else if(key=='a'){
player1.Left();
}
else if(key=='4'){
player2.Left();
}
我们是用_kbhit()函数来判定有无输入,然后用key来接受输入的指令,并用后续的多个if来执行对应的命令,此处仅展示出部分语句
碰撞检测
bool player::Ifmove(block bl, int x, int y) {
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
// 如果检测到block中该位置为1的话 先检测这个位置是否越界 再检测这个位置对应的map位置是否也为1
if(bl.Block[i][j]==1) {
if(x + i >= 25 || y + j < 0 || y + j >= 10) {
return false;
}
else if(Player1_map[x+i][y+j]==1 && x + i >=0) {
return false;
}
}
}
}
return true;
}
通过这个函数的bool值来对其他的左右下移动以及变形进行判断是否能够执行
消行
int player::Getscore(){
int count;
for(int i=0;i<25;i++){
int flag=1;
for(int j=0;j<10;j++){
if(Player1_map[i][j]==0){
flag=0;
break;
}
}
if(flag!=0){
Player1_Score+=10;
count++;
for(int k=i;k>=1;k--) {
for(int j=0;j<10;j++) {
Player1_map[k][j]=Player1_map[k-1][j];
}
}
}
}
return count;
}
能够通过遍历来查找有哪行为全满的,若全满则将上一行覆盖到此行循环执行完所有行的覆盖,并有count值返回来确认要加上几行
加行
void player::Addline(int t){
for(int i=0;i<t;i++){
for(int m=0; m<19; m++) {
for(int n=0; n<10; n++) {
Player1_map[m][n]=Player1_map[m+1][n];
}
}
for(int j=0; j<10; j++) {
Player1_map[19][j] = 0;
}
for(int j=0; j<10; j++) {
Player1_map[19][j]=1;
}
Player1_map[19][rand()%10]=0;
}
}
通过前面返回的值来进行此函数的功能执行,并通过rand函数来随机使一个为空格
创建新方块
void block::Create_Block(){ //创建新方块
srand((unsigned)time(NULL)); //初始化随机数
unsigned int ran=rand()%7;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Block[i][j]=BLOCK[ran][0][i][j];
}
}
}
通过rand()函数来随机确定一种方块,但目前都只确定方块的第一种形态
胜负判定
bool player::Faile(){ //若上边界处出现1(及0——4排),则判负,返回false,游戏结束。
int i,j;
for(i=0;i<5;i++){
for(j=0;j<10;j++){
if(Player1_map[i][j]==1){
return false;
}
}
}
return true;
}
特意的将玩家的游戏区域列为【25】【10】的大小,并准备将前5行作为禁区,一但检测到有方块,则返回false值,并像下面所示将对手的值改为true
if(player2.Faile()){
player1.win=true;
}
并通过这判断来确认谁胜谁负
if(player1.win==true){ //执行结束
//此处应有显示玩家1获胜用的函数
return;
}
if(player2.win==true){ //执行结束
//此处应有显示玩家2获胜用的函数
return;
收获与心得
这次的的大作业使我们见识到了面向对象的思路,以及灵活使用多个类来组合完成所需的功能,并且通过.cpp与.h文件来分别储存类对象和函数的实现,并在最后统一有序的调用。并且,我们还通过查阅资料获取了一些以前从来没有见过的函数的使用方法,这也增长了我们见识,提高了自学能力。
仍存在的问题
没能完成此次大作业可能是最大的问题。。。。其次目前所完成的功能也没有经过彻底的检查来排除潜在的bug。
在网络与队友们进行联络的效率好像也并不高,我们也没有充分利用github来进行有效交流,要在以后加强队友间的合作性
程序的封装性好像也不是很好,但是封装起来代码的复杂度又会再次提升。。。