C++俄罗斯方块课程设计报告书.docx

上传人:b****2 文档编号:11560950 上传时间:2023-06-01 格式:DOCX 页数:42 大小:694.17KB
下载 相关 举报
C++俄罗斯方块课程设计报告书.docx_第1页
第1页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第2页
第2页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第3页
第3页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第4页
第4页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第5页
第5页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第6页
第6页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第7页
第7页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第8页
第8页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第9页
第9页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第10页
第10页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第11页
第11页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第12页
第12页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第13页
第13页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第14页
第14页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第15页
第15页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第16页
第16页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第17页
第17页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第18页
第18页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第19页
第19页 / 共42页
C++俄罗斯方块课程设计报告书.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++俄罗斯方块课程设计报告书.docx

《C++俄罗斯方块课程设计报告书.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块课程设计报告书.docx(42页珍藏版)》请在冰点文库上搜索。

C++俄罗斯方块课程设计报告书.docx

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[

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2