双人版俄罗斯方块游戏实验报告.docx
- 文档编号:4405087
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:25
- 大小:1.96MB
双人版俄罗斯方块游戏实验报告.docx
《双人版俄罗斯方块游戏实验报告.docx》由会员分享,可在线阅读,更多相关《双人版俄罗斯方块游戏实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
双人版俄罗斯方块游戏实验报告
西安科技大学
《VisualC++程序设计》
实验报告
题目双人版俄罗斯方块游戏
院、系(部)计算机科学与技术学院
专业及班级软件工程1101班
姓名张XX
日期2012/12/14
一.功能需求:
1.能进行双人模式:
这是程序的主要功能。
2.能进行下一砖块的预测:
这也是俄罗斯方块游戏的基本功能,可以在这个基础上进行扩展其他功能,如不同于经典模式的砖块显示等来增加难度。
二.总体设计计:
1.矩形框类的设计:
设计CBin类描述Tetris游戏的矩形框,用image的二维数组来描述这个矩形框。
设置不同的值显示不同颜色的矩形,若没有砖块则为0。
2.砖块的设计:
设计CBrick抽象类来设计砖块,应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块。
3.砖块在面板中的显示设计:
在视图类中设计并显示砖块。
三.详细设计:
1.矩形框类的设计:
设计CBin类描述Tetris游戏的矩形框,用image的二维数组来描述这个矩形框。
设置不同的值显示不同颜色的矩形,若没有砖块则为0。
CBin类的五个成员函数:
(1)CBin(unsignedintunsignedinth)
构造函数,用来初始化数据成员,width和height,并为image分配空间并初始化。
(2)~CBin()
析构函数,删除在构造函数中为image分配的空间。
(3)VoidgetImage(unsignedchar*destImage)
将image的数据拷贝到destImage,你可以假设destimage指向的空间足够容纳image的空间。
(4)VoidsetImage(unsignedchar**srcImage)
把srcImage中的数据拷贝到image,你可以假设srcImage是一个合法的指针。
(5)UnsignedintremoveFullLines()
检查image,如果任何一行完全填满,则删除这一行,并让上面一行的数据下移,返回删除的总行数。
设计代码如下:
classCBin{
private:
unsignedchar**image;
unsignedintwidth;
unsignedintheight;
public:
CBin(unsignedintw,unsignedinth);
~CBin();
unsignedintgetWidth(){returnwidth;};
unsignedintgetHeight(){returnheight;};
voidgetImage(unsignedchar**destImage);
voidsetImage(unsignedchar**srcImage);
unsignedintremoveFullLines();
};
CBin:
:
CBin(unsignedintw,unsignedinth)
{
width=w;
height=h;
image=newunsignedchar*[height];
for(unsignedinti=0;i { image[i]=newunsignedchar[width]; for(unsignedintj=0;j image[i][j]=0; } } CBin: : ~CBin() { for(unsignedinti=0;i deleteimage[i]; } delete[]image; } voidCBin: : getImage(unsignedchar**destImage) { for(unsignedinti=0;i for(unsignedintj=0;j destImage[i][j]=image[i][j]; } voidCBin: : setImage(unsignedchar**srcImage) { for(unsignedinti=0;i for(unsignedintj=0;j image[i][j]=srcImage[i][j]; } unsignedintCBin: : removeFullLines() { unsignedintflag,EmptyLine=0; unsignedinti,j,m; for(i=0;i { flag=0; for(j=0;j { if(image[i][j]==0) flag=1; } //一行完全被填满 if(flag==0) { for(j=0;j { image[i][j]=0; } //消除整行 for(m=i;m>0;m--) { for(j=0;j { image[m][j]=image[m-1][j]; } } for(j=0;j { image[0][j]=0; } EmptyLine++;//记录消的行数 i--; } } returnEmptyLine; } 2.砖块的设计: 设计CBrick抽象类来设计砖块,应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块。 CBrick类的成员函数: (1)intshiftLeft(CBin*bin 将砖块在游戏的矩形框内左移一位。 注意座椅可能产生冲突,左边有赚快活碰到墙,如果不能左移返回0值,如果能左移返回1值。 (2)intshiftRight(CBin*bin) 同shiftLeft,右移。 (3)intshiftDown(CBin*bin) 同shiftLeft,下移。 (4)introtateClockwise(CBin*bin) 同shiftLeft,顺时针旋转。 (5)intcheckCollision(CBin*bin) 检查移动或旋转过程中是否有冲突,有冲突返回0,否则返回1。 (6)intcheckCollision(CBin*bin) 重载运算符>>,通过设置映射到游戏矩形的二维数组binImage,设置砖块的颜色,这里假设binimage是一个合法的大侠合适的二维数组。 (7)voidoperator>>(unsignedchar*binimage) (8)putAtTop(unsignedintnewOrient,unsignedintnewPosX) 通过设置砖块特定点的Y坐标(posY)是的砖块位于矩形的最上方,砖块的X坐标和砖块的状态由newPosX和newOrient确定。 注意posY的值依赖于砖块的状态 (9)putAtMid(unsignedintnewOrient,unsignedintnewPosX) 与putAtTop一致,只是将坐标设置在面板中间。 下面是一个具体的砖块设计代码: classCCBrick: publicCBrick{ public: intshiftLeft(CBin*bin); intshiftRight(CBin*bin); intshiftDown(CBin*bin); introtateClockwise(CBin*bin); intcheckCollision(CBin*bin); voidoperator>>(unsignedchar**binImage); voidputAtTop(intnewOrient,intnewPosX); voidputAtMid(intnewOrient,intnewPosX); }; ///////////////////////// intCCBrick: : shiftLeft(CBin*bin) { intposX; posX=getPosX(); setPosX(posX-1); if(checkCollision(bin)==0){ setPosX(posX); return0; } return1; } intCCBrick: : shiftDown(CBin*bin) { intposY; posY=getPosY(); setPosY(posY+1); if(checkCollision(bin)==0){ setPosY(posY); return0; } return1; } intCCBrick: : shiftRight(CBin*bin) { intposX; posX=getPosX(); setPosX(posX+1); if(checkCollision(bin)==0){ setPosX(posX); return0; } return1; } intCCBrick: : rotateClockwise(CBin*bin) { intorientation,oldOrientation; orientation=getOrientation(); oldOrientation=orientation; if(orientation==3) orientation=0; else orientation=orientation+1; setOrientation(orientation); if(checkCollision(bin)==0){ setOrientation(oldOrientation); return0; } return1; } intCCBrick: : checkCollision(CBin*bin) { intwidth; intheight; unsignedchar**image; intorientation; intposX; intposY; width=bin->getWidth(); height=bin->getHeight(); image=newunsignedchar*[height]; for(inti=0;i { image[i]=newunsignedchar[width]; } bin->getImage(image); orientation=getOrientation(); posX=getPosX(); posY=getPosY(); if(orientation==0) { if((posX<0)|| ((posX+1)>width-1)|| (posY<1)|| (posY+1>height-1)) return0; if((image[posY-1][posX]! =0)|| (image[posY-1][posX+1]! =0)|| (image[posY][posX]! =0)|| (image[posY+1][posX]! =0)|| (image[posY+1][posX+1]! =0)) return0; } if(orientation==1) { if((posX<1)|| ((posX+1)>width-1)|| (posY<0)|| ((posY+1)>height-1)) return0; if((image[posY+1][posX+1]! =0)|| (image[posY][posX+1]! =0)|| (image[posY][posX]! =0)|| (image[posY][posX-1]! =0)|| (image[posY+1][posX-1]! =0)) return0; } if(orientation==2) { if((posX<1)|| (posX>width-1)|| (posY<1)|| ((posY+1)>height-1)) return0; if((image[posY-1][posX-1]! =0)|| (image[posY-1][posX]! =0)|| (image[posY][posX]! =0)|| (image[posY+1][posX]! =0)|| (image[posY+1][posX-1]! =0)) return0; } if(orientation==3) { if((posX<1)|| (posX+1>width-1)|| (posY<1)|| ((posY)>height-1)) return0; if((image[posY-1][posX+1]! =0)|| (image[posY][posX+1]! =0)|| (image[posY][posX]! =0)|| (image[posY][posX-1]! =0)|| (image[posY-1][posX-1]! =0)) return0; } return1; } voidCCBrick: : operator>>(unsignedchar**binImage) { intorientation; intposX; intposY; unsignedcharcolour; posX=getPosX(); posY=getPosY(); orientation=getOrientation(); colour=getColour(); if(orientation==0) { binImage[posY-1][posX+1]=colour; binImage[posY-1][posX]=colour; binImage[posY][posX]=colour; binImage[posY+1][posX]=colour; binImage[posY+1][posX+1]=colour; } if(orientation==1) { binImage[posY+1][posX+1]=colour; binImage[posY][posX+1]=colour; binImage[posY][posX]=colour; binImage[posY][posX-1]=colour; binImage[posY+1][posX-1]=colour; } if(orientation==2) { binImage[posY-1][posX-1]=colour; binImage[posY][posX]=colour; binImage[posY-1][posX]=colour; binImage[posY+1][posX]=colour; binImage[posY+1][posX-1]=colour; } if(orientation==3) { binImage[posY-1][posX+1]=colour; binImage[posY][posX+1]=colour; binImage[posY][posX]=colour; binImage[posY][posX-1]=colour; binImage[posY-1][posX-1]=colour; } } voidCCBrick: : putAtTop(intnewOrient,intnewPosX) { setPosX(newPosX); setOrientation(newOrient); switch(newOrient) { case0: setPosY (1);break; case1: setPosY(0);break; case2: setPosY (1);break; case3: setPosY (1);break; } } voidCCBrick: : putAtMid(intnewOrient,intnewPosX) { setPosX(newPosX-3); setOrientation(newOrient); switch(newOrient) { case0: setPosY(9);break; case1: setPosY(8);break; case2: setPosY(9);break; case3: setPosY(9);break; } } 3.砖块在面板中的显示设计: 在视图类中设计并显示砖块。 (1).定义相关的变量并在构造函数中初始化。 (2).添加DrawImage(CBin*bin,unsignedchar**image,CDC*pDC)函数,用来绘制游戏砖块。 这其中要绘制四个面板,传递四个参数。 两个主面板,两个与侧面板。 部分代码如下: voidCNewTerisView: : DrawImage(CBin*bin,CBin*bin1,CBin*bin2,CBin*bin3,unsignedchar**image,unsignedchar**image1,unsignedchar**image2,unsignedchar**image3,CDC*pDC) CRectrect; //创建背景位图画刷 CBitmapbitmap; bitmap.LoadBitmap(IDB_BITMAP24); CBrushbrush; brush.CreatePatternBrush(&bitmap); GetClientRect(&rect); pDC->FillRect(rect,&brush); //右边玩家分数的输出 CRectre; pDC->FillSolidRect(re,RGB(210,255,255)); charbuf[100]; sprintf(buf,"%d",numLines*10); pDC->TextOut(330,90,buf); //左边玩家分数的输出 CRectre1; pDC->FillSolidRect(re1,RGB(230,255,100)); charbuf1[100]; sprintf(buf1,"%d",numLines1*10); pDC->TextOut(440,90,buf1); CRectrc,rc1,rc2,rc3; //将载入的位图资源放在数组中 intBit[8]={IDB_BITMAP11,IDB_BITMAP12,IDB_BITMAP13,IDB_BITMAP14,IDB_BITMAP15,IDB_BITMAP16,IDB_BITMAP17,IDB_BITMAP18}; intb,b1,b2; for(i=0;i { for(j=0;j { rc1=CRect(j*nSize+300,i*nSize,(j+1)*nSize+300,(i+1)*nSize);//矩形的区域 if(image1[i][j]! =0) { b=image1[i][j]; b1=b; CBitmapbitmap1;//左边玩家预测砖块的位图填充 bitmap1.LoadBitmap(Bit[b]); bitmap1.SetBitmapDimension(20,20); CBrushbrush1; brush1.CreatePatternBrush(&bitmap1); pDC->FillRect(rc1,&brush1); } } } for(i=0;i { for(j=0;j { rc=CRect(j*nSize+80,i*nSize,(j+1)*nSize+80,(i+1)*nSize); if(image[i][j]! =0) { b=image[i][j];//左边玩家主面板砖块的位图填充 CBitmapbitmap1; bitmap1.LoadBitmap(Bit[b]); bitmap1.SetBitmapDimension(20,20); CBrushbrush1; brush1.CreatePatternBrush(&bitmap1); pDC->FillRect(rc,&brush1); } } } (3).在菜单中添加“开始”、“难度”、“暂停”、“游戏模式”等菜单, A.为“开始”菜单添加消息响应函数。 初始化面板,并设置定时器。 代码如下: voidCNewTerisView: : OnGameStart() { //TODO: Addyourcommandhandlercodehere gameOver=0; brickInFlight=0; numLines=0; //------------ gameOver1=0; brickInFlight1=0; numLines1=0; for(unsignedinti=0;i<20;i++) { for(unsignedintj=0;j<10;j++) { outputImage[i][j]=0; outputImage1[i][j]=0; outputImage2[i][
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双人 俄罗斯方块 游戏 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)