俄罗斯方块课程设计报告.docx
- 文档编号:8843554
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:28
- 大小:96.52KB
俄罗斯方块课程设计报告.docx
《俄罗斯方块课程设计报告.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
俄罗斯方块课程设计报告
1.系统概述………………………………………………1
2.设计说明书……………………………………………4
3.系统操作界面…………………………………………6
4.源程序编码……………………………………………7
5.测试计划………………………………………………36
6.改进意见……………………………………………39
7.课程设计心得体会………………………………40
8.参考书籍、资料……………………………………40
系统概述
现状分析
在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。
此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
项目要求
俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。
本软件要实现的功能如下:
(1)游戏区:
玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。
(2)游戏控制:
玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。
(3)级别设置:
玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。
(4)系统功能模块示意图
俄罗斯方块游戏
项目开发计划书
项目开发计划书
名称
时间
工作内容
下达设计任务
1天(集中)
说明如何着手设计的方法和设计任务的解释说明。
收集、分析资料及文档
2天
项目组在项目经理的组织下选题、分析,识别实体,完成《项目开发计划书》及小组人员分工。
设计
2天
各项目组完成系统层次图、用户界面设计、数据库表设计、报表设计,完成《设计说明书》
程序编写和测试
7天
根据方案进行现场编程、调试。
编写设计文档
2天
完成软件测试以及《用户操作手册》的编写。
文档提交、答辩
1天
各小组提交文档,教师根据情况选择是否答辩及答辩方式(抽样答辩或全员答辩)。
设计说明
游戏区模块
控制区模块
系统流程图
开始
设置初始级别
创建游戏区
游戏开局
随机选择方块类型
是否到顶部
方块下落一行
游戏结束
是
否
模块简介
1.功能模块
(1)游戏区模块(创建游戏区,处理玩家操作,显示操作结果)
(2)游戏控制模块(开始,暂停继续,提高等级,降低等级,停止,新游戏,帮助)
系统操作界面
游戏打开界面
游戏进行中界面
源代码编码
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#definetrue1
#definefalse0
#defineBoardWidth12
#defineBoardHeight23
#define_INNER_HELPER/*innerhelpermethod*/
/*ScanCodesDefine*/
enumKEYCODES
{
K_ESC=0x011b,
K_UP=0x4800,/*upwardarrow*/
K_LEFT=0x4b00,
K_DOWN=0x5000,
K_RIGHT=0x4d00,
K_SPACE=0x3920,
K_P=0x1970
};
/*thedatastructureoftheblock*/
typedefstructtagBlock
{
charc[4][4];/*cellfillinfoarray,0-empty,1-filled*/
intx;/*blockpositioncx[0,BoardWidht-1]*/
inty;/*blockpositioncy[-4,BoardHeight-1]*/
charcolor;/*blockcolor*/
charsize;/*blockmaxsizeinwidthorheight*/
charname;/*blockname(theblock'sshape)*/
}Block;
/*game'sglobalinfo*/
intFrameTime=1300;
intCellSize=18;
intBoardLeft=30;
intBoardTop=30;
/*nextblockgrid*/
intNBBoardLeft=300;
intNBBoardTop=30;
intNBCellSize=10;
/*scoreboardposition*/
intScoreBoardLeft=300;
intScoreBoardTop=100;
intScoreBoardWidth=200;
intScoreBoardHeight=35;
intScoreColor=LIGHTCYAN;
/*infortextpostion*/
intInfoLeft=300;
intInfoTop=200;
intInfoColor=YELLOW;
intBorderColor=DARKGRAY;
intBkGndColor=BLACK;
intGameRunning=true;
intTopLine=BoardHeight-1;/*topemptyline*/
intTotalScore=100;
charinfo_score[20];
charinfo_help[255];
charinfo_common[255];
/*ourboard,Board[x][y][0]-isFilled,Board[x][y][1]-fillColor*/
unsignedcharBoard[BoardWidth][BoardHeight][2];
charBufferCells[4][4];/*usedtojudgeifcanrotateblock*/
BlockcurBlock;/*currentmovingblock*/
BlocknextBlock;/*nextBlocktoappear*/
/*functionlist*/
intGetKeyCode();
intCanMove(intdx,intdy);
intCanRotate();
intRotateBlock(Block*block);
intMoveBlock(Block*block,intdx,intdy);
voidDrawBlock(Block*block,int,int,int);
voidEraseBlock(Block*block,int,int,int);
voidDisplayScore();
voidDisplayInfo(char*text);
voidGenerateBlock(Block*block);
voidNextBlock();
voidInitGame();
intPauseGame();
voidQuitGame();
/*GetKeyCode*/
int_INNER_HELPERGetKeyCode()
{
intkey=0;
if(bioskey
(1))
{
key=bioskey(0);
}
returnkey;
}
/*displaytext!
*/
void_INNER_HELPERDisplayInfo(char*text)
{
setcolor(BkGndColor);
outtextxy(InfoLeft,InfoTop,info_common);
strcpy(info_common,text);
setcolor(InfoColor);
outtextxy(InfoLeft,InfoTop,info_common);
}
/*createanewblockbykeynumber,
*theblockanchortothetop-leftcornerof4*4cells
*/
void_INNER_HELPERGenerateBlock(Block*block)
{
intkey=(random(13)*random(17)+random(1000)+random(3000))%7;
block->size=3;/*becausemostblocks'size=3*/
memset(block->c,0,16);
switch(key)
{
case0:
block->name='T';
block->color=RED;
block->c[1][0]=1;
block->c[1][1]=1,block->c[2][1]=1;
block->c[1][2]=1;
break;
case1:
block->name='L';
block->color=YELLOW;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1,block->c[2][2]=1;
break;
case2:
block->name='J';
block->color=LIGHTGRAY;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1,block->c[0][2]=1;
break;
case3:
block->name='z';
block->color=CYAN;
block->c[0][0]=1,block->c[1][0]=1;
block->c[1][1]=1,block->c[2][1]=1;
break;
case4:
block->name='5';
block->color=LIGHTBLUE;
block->c[1][0]=1,block->c[2][0]=1;
block->c[0][1]=1,block->c[1][1]=1;
break;
case5:
block->name='o';
block->color=BLUE;
block->size=2;
block->c[0][0]=1,block->c[1][0]=1;
block->c[0][1]=1,block->c[1][1]=1;
break;
case6:
block->name='I';
block->color=GREEN;
block->size=4;
block->c[1][0]=1;
block->c[1][1]=1;
block->c[1][2]=1;
block->c[1][3]=1;
break;
}
}
/*getnextblock!
*/
voidNextBlock()
{
/*copythenextBlocktocurBlock*/
=;
=;
=(BoardWidth-4)/2;
=;
memcpy,,16);
/*generatenextBlockandshowit*/
EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
GenerateBlock(&nextBlock);
=1,=0;
DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);
}
/*rotatetheblock,updatetheblockstructdata*/
int_INNER_HELPERRotateCells(charc[4][4],charblockSize)
{
chartemp,i,j;
switch(blockSize)
{
case3:
temp=c[0][0];
c[0][0]=c[2][0],c[2][0]=c[2][2],c[2][2]=c[0][2],c[0][2]=temp;
temp=c[0][1];
c[0][1]=c[1][0],c[1][0]=c[2][1],c[2][1]=c[1][2],c[1][2]=temp;
break;
case4:
/*only'I'blockarivedhere!
*/
c[1][0]=1-c[1][0],c[1][2]=1-c[1][2],c[1][3]=1-c[1][3];
c[0][1]=1-c[0][1],c[2][1]=1-c[2][1],c[3][1]=1-c[3][1];
break;
}
}
/*judgeiftheblockcanmovetowardthedirection*/
intCanMove(intdx,intdy)
{
inti,j,tempX,tempY;
for(i=0;i<;i++)
{
for(j=0;j<;j++)
{
if[i][j])
{
/*cannotmoveleftwardorrightward*/
tempX=+i+dx;
if(tempX<0||tempX>(BoardWidth-1))returnfalse;/*makesurexisvalid!
*/
/*cannotmovedownward*/
tempY=+j+dy;
if(tempY>(BoardHeight-1))returnfalse;/*yisonlycheckedlowerbound,maybenegative!
!
!
!
*/
/*thecellalreadyfilled,wemustcheckY'supperboundbeforecheckcell!
*/
if(tempY>=0&&Board[tempX][tempY][0])returnfalse;
}
}
}
returntrue;
}
/*judgeiftheblockcanrotate*/
intCanRotate()
{
inti,j,tempX,tempY;
/*updatebuffer*/
memcpy(BufferCells,,16);
RotateCells(BufferCells,;
for(i=0;i<;i++)
{
for(j=0;j<;j++)
{
if(BufferCells[i][j])
{
tempX=+i;
tempY=+j;
if(tempX<0||tempX>(BoardWidth-1))
returnfalse;
if(tempY>(BoardHeight-1))
returnfalse;
if(tempY>=0&&Board[tempX][tempY][0])
returnfalse;
}
}
}
returntrue;
}
/*drawtheblock*/
void_INNER_HELPERDrawBlock(Block*block,intbdLeft,intbdTop,intcellSize)
{
inti,j;
setfillstyle(SOLID_FILL,block->color);
for(i=0;i
{
for(j=0;j
{
if(block->c[i][j]&&(block->y+j)>=0)
{
floodfill(
bdLeft+cellSize*(i+block->x)+cellSize/2,
bdTop+cellSize*(j+block->y)+cellSize/2,
BorderColor);
}
}
}
}
/*Rotatetheblock,ifsuccess,returntrue*/
intRotateBlock(Block*block)
{
chartemp,i,j;
intb_success;
if(block->size==2)
returntrue;
if((b_success=CanRotate()))
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
memcpy,BufferCells,16);
DrawBlock(block,BoardLeft,BoardTop,CellSize);
}
returnb_success;
}
/*eraseablock,onlyfillthefilledcellwithbackgroundcolor*/
void_INNER_HELPEREraseBlock(Block*block,intbdLeft,intbdTop,intcellSize)
{
inti,j;
setfillstyle(SOLID_FILL,BkGndColor);
for(i=0;i
{
for(j=0;j
{
if(block->c[i][j]&&(block->y+j>=0))
{
floodfill(
bdLeft+cellSize*(i+block->x)+cellSize/2,
bdTop+cellSize*(j+block->y)+cellSize/2,
BorderColor);
}
}
}
}
/*movebythedirectionifcan,donothingifcannot
*returnvalue:
true-success,false-cannotmovetowardthisdirection
*/
intMoveBlock(Block*block,intdx,intdy)
{
intb_canmove=CanMove(dx,dy);
if(b_canmove)
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
+=dx;
+=dy;
DrawBlock(block,BoardLeft,BoardTop,CellSize);
}
returnb_canmove;
}
/*droptheblocktothebottom!
*/
intDropBlock(Block*block)
{
EraseBlock(block,BoardLeft,BoardTop,CellSize);
while(CanMove(0,1))
{
++;
}
DrawBlock(block,BoardLeft,BoardTop,CellSize);
return0;/*returnvalueisassigntotheblock'salive*/
}
/*initthegraphicsmode,drawtheboardgrid*/
voidInitGame()
{
inti,j,gdriver=DETECT,gmode;
structtimesysTime;
/*drawboardcells*/
memset(Board,0,BoardWidth*BoardHeight*2);
memset,0,16);
strcpy(info_help,"P:
PauseGame.--byhoodlum1980");
initgraph(&gdriver,&gmode,"");
setcolor(BorderColor);
for(i=0;i<=BoardWidth;i++)
{
line(BoardLeft+i*CellSize,BoardTop,BoardLeft+i*CellSize,BoardTop+BoardHeight*CellSize);
}
for(i=0;i<=BoardHeight;i++)
{
line(BoardLeft,BoardTop+i*CellSize,BoardLeft+BoardWidth*CellSize,BoardTop+i*CellSize);
}
/*drawboardouterborderrect*/
rectangle(BoardLeft-CellSize/4,BoardTop-CellSize/4,
BoardLeft+BoardWidth*CellSize+CellSize/4,
BoardTop+BoardHeight*CellSize+CellSize/4);
/*drawnextblockgrids*/
for(i=0;i<=4;i++)
{
line(NBBoardLeft+i*NBCellSize,NBBoardTop,NBBoardLeft+i*NBCellSize,NBBoardTop+4*NBCellSize);
line(NBBoardLeft,NBBoardTop+i*NBCellSize,NBBoardLeft+4*NBCellSize,NBBoardTop+i*NBCellSize);
}
/*drawscorerect*/
rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,ScoreBoardTop+ScoreBoardHeight);
DisplayScore();
/*setnewseed!
*/
gettime(&sysTime);
srand*3600+*60+;
GenerateBlock(&nextBlock);
NextBlock();/*createfirstblock
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 课程设计 报告