outputImage[i][j]=0;
}
Display(outputImage,score);
//开始游戏
while(!
gameOver)
{
if(!
brickInFlight)
{
//没有砖块落下时,需要新建一个砖块.
//新建砖块需要随机指定砖块的形状和初始状态.
brickType=(rand()%NUM_BRICK_TYPES)+1;
initOrientation=(unsignedint)(rand()%4);
if(brickType==1)
activeBrick=newCIBrick;
elseif(brickType==2)
activeBrick=newCLBrick;
elseif(brickType==3)
activeBrick=newCSBrick;
elseif(brickType==4)
activeBrick=newCL_2Brick;
elseif(brickType==5)
activeBrick=newCS_2Brick;
elseif(brickType==6)
activeBrick=newCFBrick;
elseif(brickType==7)
activeBrick=newCTBrick;
activeBrick->setColour((unsignedchar)brickType);//动态多态性的体现
activeBrick->putAtTop(initOrientation,binWidth/2);
notCollide=activeBrick->checkCollision(tetrisBin);//检查是否冲突
if(notCollide){
//新建砖块同游戏面板的顶部没有冲突,就可以下落了
brickInFlight=1;
tetrisBin->getImage(outputImage);//拷贝游戏面板类的image到outputImage
activeBrick->operator>>(outputImage);////输出当前下落砖块的映像到outputimage
Display(outputImage,score);//显示outputImage
}
else{
//新建砖块同游戏面板的顶部有冲突,表明面板剩余空间已经放不下新砖块。
//游戏结束
gameOver=1;
deleteactiveBrick;
brickInFlight=0;
}
}
//if(brickInFlight)
else
{
//当前有砖块正在下落,因此需要检测用户的按键
if(kbhit())
{//检测是否有键按下
arrowKey=getch();//检查用户输入
if(arrowKey==KEY_RIGHT)
activeBrick->shiftRight(tetrisBin);
elseif(arrowKey==KEY_LEFT)
activeBrick->shiftLeft(tetrisBin);
elseif(arrowKey==KEY_UP)
activeBrick->rotateClockwise(tetrisBin);
elseif(arrowKey==KEY_DOWN)//一键加速下落
{
while(activeBrick->shiftDown(tetrisBin));
}
elseif(arrowKey=='p')
Pause();
//更新屏幕显示
tetrisBin->getImage(outputImage);//拷贝游戏面板类的内部图像到outputImage
activeBrick->operator>>(outputImage);//输出当前下落砖块的映像到outputimage
Display(outputImage,score);
}
//砖块靠重力下落.
Sleep(difficulty);
notCollide=activeBrick->shiftDown(tetrisBin);
if(notCollide)
{
tetrisBin->getImage(outputImage);
activeBrick->operator>>(outputImage);
}
else
{
//砖块落在底部或已固定的砖块上,不再下落.
brickInFlight=0;
//Addthisbrickpermanentlytothebin.
tetrisBin->getImage(outputImage);
activeBrick->operator>>(outputImage);
tetrisBin->setImage(outputImage);
Display(outputImage,score);
//检查是否需要消行
switch(tetrisBin->removeFullLines())//计分方式。
这里还可以实现更复杂的计分方式
{
case1:
score++;break;
case2:
score+=3;break;
case3:
score+=5;break;
case4:
score+=8;break;
}
switch(score/100)//等级确定
{
case0:
difficulty=500;break;
case1:
difficulty=20;break;
case2:
difficulty=170;break;
case3:
difficulty=150;break;
case4:
difficulty=120;break;
case5:
difficulty=100;break;
case6:
difficulty=70;break;
case7:
difficulty=50;break;
case8:
difficulty=20;break;
case9:
difficulty=0;break;
}
//检查消行后,更新外部图像面板
tetrisBin->getImage(outputImage);
}
Display(outputImage,score);
}
}
GotoXY(1,24);
printf("GameOver");
getch();
//释放动态开辟的空间
for(i=0;idelete[]outputImage[i];
delete[]outputImage;
return0;
}
5测试与实现
6总结
优点:
实现了双人游戏模式,有各自独立的系统。
缺点:
反应慢,导致游戏出现延迟较高。
未能实现砖块预测功能。
开发过程:
首先完善了所有砖块的显示,其次实现了双游戏界面功能,并逐渐完善显示函数等问题。
心得体会:
完善所有砖块时遇到不少问题,如:
下标越界。
无法显示等,经过思考能解决。
双游戏界面起初没有想法,经讨论过后有了头绪,并逐步实现。
双人游戏过程在测试过程中遇到了不少问题,一遍遍反复的修改、再测试过程中完善了游戏,体会到了‘写’游戏的乐趣。