C++俄罗斯方块课程设计报告书.docx
- 文档编号:24777651
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:42
- 大小:694.17KB
C++俄罗斯方块课程设计报告书.docx
《C++俄罗斯方块课程设计报告书.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块课程设计报告书.docx(42页珍藏版)》请在冰豆网上搜索。
C++俄罗斯方块课程设计报告书
C++面向对象课程设计报告
院(系):
计算机工程学院
专业:
学生姓名:
班级:
_______ 学号:
201007206
题目:
俄罗斯方块
起迄日期:
_2012.6.18~2012.6.29
设计地点:
计算机学院机房
指导教师:
完成日期:
2012年6月29日
一、需求分析………………………………………………………….3
1.课程设计内容…………………………………………………….3
2.程序实现功能…………………………………………………….3
二、设计内容………………………………………………………….3
1俄罗斯方块主功能框架图………………………………………4
2.主函数及各功能模块流程图………………………………..…4
三、调试分析……………………………………………………….....26
1.实际完成情况…………………………………………………....27
2.上机过程中出现的问题及其解决方案………………………..27
3.程序中可以改进、扩充的功能及设计实现构想……………..27
四、用户手册…………………………………………………………..27
五、设计总结………………………………………………………31
六、参考文献…………………………………………………………32
七、附录………………………………………………………………32
一、需求分析
1.课程设计目的
俄罗斯方块是由阿列谢.帕基特诺发明的,Tetris游戏在一个m*n的矩形形框内进行的,矩形框的顶部会随机的出现一个有四个小方块组成的砖块,每过一段时间,就会下落一格,知道他碰到底部,然后再过一个时间下落另一个砖块,依次进行,砖块是随机出现的。
当发现底部砖块是满的话,则消去它从而得到相应设置的分数,当砖块到达顶部的时候,游戏结束。
选择俄罗斯方块进行C++面向对象程序设计课程设计主要是在学习C++这门面向对象语言的基础上,在完成C++面向对象程序设计各部分实验的基础上,通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C++面向对象程序设计语言特点的认识与理解。
同时,可以提高运用C++编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
2.程序实现的功能
【1】实现方块的变形、下落、左移、右移消行等基本的功能。
【2】实现方块的直接丢下、暂停、判断分数以及等级设置功能。
【3】友好的地用户界面,七种基本的方块图形设计功能。
【4】设置快捷键实现游戏的暂停和播放音乐功能。
二、设计内容
1.俄罗斯方块主功能框架图
2.主函数及各功能模块流程图
【1】主程序流程图
【2】主程序函数调用图
【3】键盘响应方块移动及操作模块算法流程图
代码实现部分:
voidCTetrisView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//没有开始
if(!
m_bStart)
return;
if(m_bPause==TRUE)
return;
switch(nChar)
{
caseVK_LEFT:
russia.Move(KEY_LEFT);
break;
caseVK_RIGHT:
russia.Move(KEY_RIGHT);
break;
caseVK_UP:
russia.Move(KEY_UP);
break;
caseVK_DOWN:
russia.Move(KEY_DOWN);
break;
}
//重画
CDC*pDC=GetDC();
russia.DrawBK(pDC);
ReleaseDC(pDC);
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
voidCRussia:
:
Move(intdirection)//移动方块
{
if(end)return;
switch(direction)
{
//左
caseKEY_LEFT:
if(Meet(Now,KEY_LEFT,NowPosition))break;
NowPosition.y--;
break;
//右
caseKEY_RIGHT:
if(Meet(Now,KEY_RIGHT,NowPosition))break;
NowPosition.y++;
break;
//下
caseKEY_DOWN:
if(Meet(Now,KEY_DOWN,NowPosition))
{
LineDelete();
break;
}
NowPosition.x++;
break;
//上
caseKEY_UP:
Meet(Now,KEY_UP,NowPosition);
break;
default:
break;
}
}
//方块旋转
//////////////////////////////////////////////////////////////////////////
boolCRussia:
:
Change(inta[][4],CPointp,intb[][100])
{
inttmp[4][4];
inti,j;
intk=4,l=4;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
tmp[i][j]=a[j][3-i];
After[i][j]=0;//存放变换后的方块矩阵
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(tmp[i][j]==1)
{
if(k>i)k=i;
if(l>j)l=j;
}
}
}
for(i=k;i<4;i++)
{
for(j=l;j<4;j++)
{
After[i-k][j-l]=tmp[i][j];
}//把变换后的矩阵移到左上角
}
//判断是否接触,是:
返回失败
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(After[i][j]==0)
{
continue;
}
if(((p.x+i)>=m_RowCount)||((p.y+j)<0)||((p.y+j)>=m_ColCount))
{
returnfalse;
}
if(b[p.x+i][p.y+j]==1)
{
returnfalse;
}
}
}
returntrue;
}
boolCRussia:
:
Meet(inta[][4],intdirection,CPointp)//判碰撞,遇到了边界或者有其他方块档住
{
inti,j;
//先把原位置清0
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==1)
{Russia[p.x+i][p.y+j]=0;}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==1)
{
switch(direction)
{
case1:
//左移
if((p.y+j-1)<0)gotoexit;
if(Russia[p.x+i][p.y+j-1]==1)gotoexit;
break;
case2:
//右移
if((p.y+j+1)>=m_ColCount)gotoexit;
if(Russia[p.x+i][p.y+j+1]==1)gotoexit;
break;
case3:
//下移
if((p.x+i+1)>=m_RowCount)gotoexit;
if(Russia[p.x+i+1][p.y+j]==1)gotoexit;
break;
case4:
//变换
if(!
Change(a,p,Russia))gotoexit;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
Now[i][j]=After[i][j];
a[i][j]=Now[i][j];
}
}
returnfalse;
break;
}
}
}
}
intx,y;
x=p.x;
y=p.y;
//移动位置,重新给数组赋值
switch(direction)
{
case1:
y--;break;
case2:
y++;break;
case3:
x++;break;
case4:
break;
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==1)
{
Russia[x+i][y+j]=1;
}
}
}
returnfalse;
exit:
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==1)
{
Russia[p.x+i][p.y+j]=1;
}
}
}
returntrue;
}
【4】等级管理功能模块流程图
代码实现部分:
voidCRule:
:
SetLevel(intnLevel)
{
m_nLevel=nLevel;
}
intCRule:
:
UpLevel(intnLine)
{
m_nLevel=nLine/30;
returnm_nLevel;
}
CLevelDlg:
:
CLevelDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CLevelDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CLevelDlg)
m_level=0;
//}}AFX_DATA_INIT
}
voidCLevelDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLevelDlg)
DDX_Text(pDX,IDC_LEVEL_EDIT,m_level);//将变量和控件映射
DDV_MinMaxInt(pDX,m_level,1,10);//设置等级最大值最小值
//}}AFX_DATA_MAP
}
//CLevelDlgmessagehandlers
voidCLevelDlg:
:
OnOK()
{
if(UpdateData(TRUE))
{
CStringtmp;
tmp.Format("%d",m_level);
WritePrivateProfileString("SETUP","level",tmp,".\\setup.ini");
CDialog:
:
OnOK();
}
}
voidCLevelDlg:
:
OnOK()//确定
{
if(UpdateData(TRUE))
{
CStringtmp;
tmp.Format("%d",m_level);
WritePrivateProfileString("SETUP","level",tmp,".\\setup.ini");
CDialog:
:
OnOK();
}
}
voidCLevelDlg:
:
OnCancel()//取消
{
CDialog:
:
OnCancel();
}
BOOLCLevelDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
charpszTmp[128]={0};
GetPrivateProfileString("SETUP","level","0",
pszTmp,127,".\\setup.ini");//取出保存的等级记录
m_level=atoi(pszTmp);
UpdateData(FALSE);
returnTRUE;}
voidCRussia:
:
LineDelete()
{
intm=0;//本次共消去的行数
boolflag=0;
for(inti=0;i { //检查要不要消行 flag=true; for(intj=0;j { if(Russia[i][j]==0) { flag=false; } } //如果要 if(flag==true) { m++; for(intk=i;k>0;k--) { //上行给下行 for(intl=0;l { Russia[k][l]=Russia[k-1][l]; } } //第一行为零 for(intl=0;l { Russia[0][l]=0; } } } DrawWill(); //加分 switch(m) { case1: m_Score=m_Score+10+m_Level*10; break; case2: m_Score=m_Score+30+m_Level*10; break; case3: m_Score=m_Score+50+m_Level*10; break; case4: m_Score=m_Score+100+m_Level*10; break; default: break; } m_CountLine+=m; m_Level=rule.UpLevel(m_CountLine)+m_Level; end=rule.Win(Now,Russia,NowPosition);//速度 m_Speed=320-m_Level*20; if(end) { AfxMessageBox("游戏结束! "); } } 【5】主界面显示功能模块 代码实现部分: voidCTetrisView: : OnDraw(CDC*pDC) { CTetrisDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); CDCDc; if(Dc.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox("Can'tcreateDC"); //没有开始,显示封面 if(! (m_bStart)) { Dc.SelectObject(fengmian); pDC->BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY); } else russia.DrawBK(pDC); } voidCTetrisView: : OnTimer(UINTnIDEvent)//设置时间函数让方块自动按时 移动 { russia.Move(KEY_DOWN); russia.DrawBK(GetDC()); CView: : OnTimer(nIDEvent); } //绘游戏界面 ////////////////////////////////////////////////////////////////////////// voidCRussia: : DrawBK(CDC*pDC) { CDCDc; if(Dc.CreateCompatibleDC(pDC)==FALSE) { AfxMessageBox("Can'tcreateDC"); } //画背景 Dc.SelectObject(bkMap); pDC->BitBlt(0,0,540,550,&Dc,0,0,SRCCOPY); //画分数,速度,难度 DrawScore(pDC); //如果有方块,显示方块 //游戏区 for(inti=0;i { for(intj=0;j { if(Russia[i][j]==1) { Dc.SelectObject(fkMap); pDC->BitBlt(j*30,i*30,100,100,&Dc,0,0,SRCCOPY); } } } //预先图形 for(intn=0;n<4;n++) { for(intm=0;m<4;m++) { if(Will[n][m]==1) { Dc.SelectObject(fkMap); pDC->BitBlt(400+m*30,100+n*30,30,30,&Dc,0,0,SRCCOPY); } } } } //绘分数和等级 ////////////////////////////////////////////////////////////////////////// voidCRussia: : DrawScore(CDC*pDC) { intnOldDC=pDC->SaveDC(); //设置字体 CFontfont; if(0==font.CreatePointFont(200,"ComicSansMS")) { AfxMessageBox("Can'tCreateFont"); } pDC->SelectObject(&font); //设置字体颜色及其背景颜色 CStringstr; CStringa("下一个方块: "); pDC->SetTextColor(RGB(0,255,0)); pDC->SetBkColor(RGB(255,255,255)); //输出数字 str.Format("等级: %d",m_Level); if(m_Level>=0) pDC->TextOut(400,275,str); /*str.Format("行数: %d",m_CountLine); if(m_Speed>=0) pDC->TextOut(410,325,str);*/ str.Format("总分: %d",m_Score); if(m_Score>=0) pDC->TextOut(400,325,str); str.Format("%s",a); pDC->TextOut(370,25,str); pDC->RestoreDC(nOldDC); } 【6】游戏规则判断功能模块 代码实现部分: CRule: : CRule() { } CRule: : ~CRule() { } voidCRule: : SetLevel(intnLevel) { m_nLevel=nLevel; }//设置等级 intCRule: : UpLevel(intnLine) { m_nLevel=nLine/30; returnm_nLevel; }//游戏每一次消30行升一级 boolCRule: : Win(intNow[4][4],intRussia[100][100],CPointNowPosition) { if(m_nLevel==11) { returntrue; } for(inti=0;i<4;i++) { for(intj=0;j<4;j++) { if(Now[i][j]==1) { if(Russia[i+NowPosition.x][j+NowPosition.y]==1) { returntrue; } } } } returnfalse; }/判断是否结束游戏 ////////////////////////////////////////////////////////////////////////// //行消除函数 ////////////////////////////////////////////////////////////////////////// voidCRussia: : LineDelete() { intm=0;//本次共消去的行数 boolflag=0; for(inti=0;i { //检查要不要消行 flag=true; for(intj=0;j { if(Russia[i][j]==0) { flag=false; } } //如果要 if(flag==true) { m++; for(intk=i;k>0;k--) { //上行给下行 for(intl=0;l { Russia[k][l]=Russia[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 俄罗斯方块 课程设计 报告书