一.项目名称
十二生肖俄罗斯方块
二.开发背景:
俄罗斯方块是一个很低古老的一个小游戏,到但今日它还有很大的魅力。
三.技术路线或工作原理:
采用的软件及开发平台
Micosoft Visual ++6.0
项目的总体方案
1.生成方块模块。通过随机函数生成随机数来确定生成方块的种类。
2.键盘输入模块。通过消息映射来处理各种从键盘传入的信息。包括方块左走,右走,快速下降和变形。
3.得分模块。当方块下到底后判断玩家有没得分。
4.游戏数据记录模块。保存方块的个数和地点。
5.游戏结束模块。判断游戏是否已经结束。
四.算法描述(程序部分源码或伪代码)
1.在CMy1View.h开始时加入:
#define heng 15
#define shu 30
#define size 20
2.在类CMy1View中增加成员变量:
BITMAP bmfange;
BITMAP bmbeijing;
CBitmap bbeijing;
CBitmap bfange;
int score; 得分
int y; 活动方块的Y坐标
int x; 活动方块的X坐标
int yanshi; 活动方块的方向式样
int huodon; 活动方块的种类
int fange[shu+2][heng+2]; 记录游戏中每个方格中有没方块和方块的种类
3.在类CMy1View中增加成员函数:
void getscore(); 计算得分
void gameover(); 判断是否游戏结束
void changeyanshi(); 改变活动方块的方向式样
void goright(); 活动方块向右走
void goleft(); 活动方块向左走
void godown(); 活动方块响下走
void gaiweizhi(int r); 改变活动方块的位置,用于函数goright(),goleft(),godown中
void shengcheng(); 生成新的活动方块
由于函数的内容过大,函数具体内容请老师见于工程
4,在类CMy1View中修改函数CMy1View::CMy1View():
CMy1View::CMy1View()
{
// TODO: add construction code here
for(int i=1;i<=heng;i++)
{
for(int j=1;j<=shu;j++)
fange[j][i]=0;
fange[0][i]=9;
fange[shu+1][i]=9;
}
for(int k=0;k<shu+2;k++)
{
fange[k][0]=9;
fange[k][heng+1]=9;
}
score=0;
bfange.LoadBitmap(IDB_fange);
bfange.GetBitmap(&bmfange);
bbeijing.LoadBitmap(IDB_beijing);
bbeijing.GetBitmap(&bmbeijing);
}
5,在类CMy1View中修改函数CMy1View::OnDraw(CDC* pDC):
void CMy1View::OnDraw(CDC* pDC)
{
CMy1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC mdc;
mdc.CreateCompatibleDC(NULL);
mdc.SelectObject(&bbeijing);
pDC->BitBlt(0,0,bmbeijing.bmWidth,bmbeijing.bmHeight,&mdc,0,0,SRCCOPY);
CFont font;
font.CreateFont(40,0,0,0,FW_NORMAL,FALSE,FALSE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"华文行楷");
CFont *pOldFont=pDC->SelectObject(&font);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
CString str;
str.Format("%d",score);
pDC->TextOut((heng+4)*size/2,(shu+2)*size+size/2,str);
pDC->SelectObject(pOldFont);
mdc.SelectObject(&bfange);
for(int j=0;j<shu+2;j++)
for(int i=0;i<heng+2;i++)
{
if(fange[j][i]!=0&&fange[j][i]!=9)
{
pDC->BitBlt((i+1)*size,(shu-j+2)*size,size,size,&mdc,(fange[j][i]<9?(fange[j][i]-1):(fange[j][i]-11))*size,0,SRCCOPY);
}
}
}
6,在类CMy1View中生成消息函数CMy1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):
void CMy1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
case VK_UP:
changeyanshi();
break;
case VK_LEFT:
goleft();
break;
case VK_RIGHT:
goright();
break;
case VK_DOWN:
godown();
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
6,在类CMy1View中生成消息函数CMy1View::OnTimer(UINT nIDEvent):
void CMy1View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
godown();
CView::OnTimer(nIDEvent);
}
6,在菜单栏中加入菜单“开始”,在类CMy1View中生成与菜单“开始”相关联的消息函数CMy1View::OnKaishi():
void CMy1View::OnKaishi()
{
// TODO: Add your command handler code here
for(int i=1;i<=shu;i++)
for(int j=1;j<=heng;j++)
fange[i][j]=0;
shengcheng();
SetTimer(0,500,NULL);
Invalidate();
}
五.实验结果
六.测试分析:
1.首先每块方块活动的测试,用了一天时间,测试了方块的移动和变形
2.对开始游戏和当活动到达底部生成方块的测试,用了一天时间
3.对游戏结束和计分的测试,用了一天时间。
七.个人小结:
收获
1体会到写总体设计和部分设计的重要性
2从中体会到了运用VC++解决问题的快乐
3通过分析理解程序,对VC++的认识更为深入
4认识到更多的函数的使用
5对VC++的兴趣更为浓厚
教训
由于前期没有做好总体设计和各部分之间的关联的设计,所以会后期的工作产生影响