当前位置:文档之家› 基于MFC的俄罗斯方块游戏设计实验报告

基于MFC的俄罗斯方块游戏设计实验报告

基于MFC的俄罗斯方块游戏设计实验报告
基于MFC的俄罗斯方块游戏设计实验报告

计算机学院

VC++项目开发实验报告

基于MFC的俄罗斯方块游戏设计

题目基于MFC的俄罗斯方块游

戏设计

学号

专业及班级

姓名

日期

目录

一:实验内容--------------------3 1:游戏简介-----------------------------------------------3

2:课程设计目的----------------------------------------3

3: 实验要求-----------------------------------------------3二:设计思路--------------------4 1:窗体设计----------------------------------------------4

2:编辑资源----------------------------------------------4

3: 菜单项设计-------------------------------------------7

4: 窗体美化----------------------------------------------8

5:额外功能----------------------------------------------10 三:代码实现--------------------10

四:运行结果--------------------12

五:实验心得--------------------13

一:实验内容

1:游戏简介

俄罗斯方块是由阿列谢·帕基特诺发明的,Tetris游戏在一个m*n 的矩形框内进行的,矩形框的顶部会随机的出现一个有四个小方块组成的砖块,每过一段时间,就会下落一格,知道他碰到底部,然后再过一个时间下落另一个砖块,依次进行,砖块是随机出现的。当发现底部砖块是满的话,则消去它从而得到相应设置的分数,当砖块到达顶部的时候,游戏结束。

2: 课程设计的目的

综合运用所学知识,熟练掌握VC++程序设计的编码与MFC框架结构以及各类作用个的具体实现,完成俄罗斯方块游戏的设计。

3 课程设计的要求

用VC++设计与实现俄罗斯方块游戏。要求包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的函数及说明;附上程序源代码。

二:设计思路

1:窗体设计

利用MFC AppWinzard生成记事本应用程序框架具体步骤如下:

(1)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFC AppWizard(exe)选项,然后在Project name文本框中输入MyTetris 。

(2)单击OK按钮.

2:编辑资源

按钮控件资源清单

按钮名称按钮ID

新建ID_FILE_NEW

开始ID_Game_Start

暂停IID_Game_Pause

结束ID_Game_Over

容易IID_DIFF_EASY

一般ID_DIFF_MID

困难ID_DIFF_SUP

菜单项设计

2)标题栏的设计。

要修改标题栏的内容或文件打开(关闭)对话框的过滤器中的显示内容,只须在字符串表编辑器对此项目进行重新编辑即可。

1:打开String Table,找到IDR_MAINFRAME,双击。

2:在弹出的String Properties对话框Caption中输入:文本编辑器\nEdit\nEditSo\n\n\n\ nEditSoft.Document\nEditSo Document 3:编译连接并执行。

随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下:

2.2.2游戏界面需求:

良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。

2.1.3游戏形状(方块)需求:

良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。

2.2算法分析

2.2.1程序流程图

将新生的下坠物代替旧的“下一

个下坠物“

将旧的“下一个下坠物”用作当前

下坠物

到达底部

销行操作

到达底部,

游戏结束

游戏结束处理

结束

图2.2.3 程序运行调用图

2.2.2定义方块的数据结构

对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 [2] 。

图3.1 方块编号

ActiveStatus[0][0]和ActiveStatus[0][1]则是第0号方块的横坐标x 和纵坐标y ;ActiveStatus[2][0]和ActiveStatus[2][1]则是第2号方块的横坐标x 和纵坐标y 。

刷新

游戏结束

重新游戏 下一个图行 达到指定位置 达到指定位

置 显示屏幕信

按向上键

游戏开始 否 按键 7.OnTimer() 10.IsBottom() 12.RectChang e()

9.OnDraw() 6.invalidatecurren

t() 8.GamePaush () 5.RectDown()

11.KeyDown(

)

13.GameEnd(

)

1.Main()

2.Rectview()

3.Gamestart()

4.DrawGame ()

0 1

2

3

(x 0,y 0) (x 1,y 1) (x 2,y 2) (x 3,y 3)

2 3 0 1 (x 0,y 0)

(x 1,y 1)

(x 2,y 2)

(x 3,y 3)

2.2.3 游戏设计分析

有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:

CRectGameView : public CView

{

//内部存取数据结构

int m_stateMap[MAX_ROW][MAX_COL];

//初始化操作

GameInitnal(); //游戏的初始化

//用于判断数据相关状态的操作

IsLeftLimit(); //下坠物件是否可向左移动

IsRightLitmit(); //

IsBottom(); //是否已经到达了底部

IsGameEnd(); //是否游戏已经结束

//方块物件下坠过程中的操作

RectChange(); //下坠物件变形

RectDown(); //下坠物件正常下落

RectArrow(); //下坠物件方向移动(左,右,下加速)

//状态控制操作

GameStart(); //游戏开始

GamePause(); //游戏暂停

GameEnd(); //游戏结束

}

通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操作和执行操作这样两种类型[3]。

三系统设计

3.1创建界面的主框架

首先建立一个项目工程,名为skyblue_Rect,并在AppWizard的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示:

在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg 类是用作俄罗斯方块参数选择的对话框类对象。

3.2正常流程的设计

3.2.1定时制机制

从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,具体如表2所示。

3.2.1菜单选项功能对应表

菜单选项名称快捷键资源ID 响应处理函数

开始游戏&S ID_GAME_STAT OnGameStart()

暂停游戏&P ID_GAME_PAISH OnGamePaush()

结束游戏&E ID_GAME_END OnGameEnd()

3.2.2定时处理

经过定时器的设置后,这里通过利用ClassWizard跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。

图 3.2.2装载方块

视图类创建了m_icurrentStatus和m_inextStatus两个成员变量来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而m_currentRect除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标识(1~7),第2位用作同种类型的不同表现方式,最多有4种状态(1~4)。

在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。

四、系统实施

4.1底部到达的判断与销行的实现

图3.2.3 处理方块到达图

将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定,利用数组InterFace[74][4]记录1~7种下坠物的1~4种形态的接触面信息。

统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得100分,同时消2行得400分,销掉x行,则分数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。

4.2中断操作流程的实现

(1)处理键盘事件

关于按键命令消息的响应,可以通过对WM_KEYDOWN消息的处理函数进行截获并重写来实现,下面是对该处理函数OnKeyDown()的重写。

// 功能:处理用户的输入,方块的左,右移,加速及变形

void CSkyblue_RectView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar)

{

case VK_LEFT:

RectArrow(LEFT);

break;

case VK_RIGHT:

RectArrow(RIGHT);

break;

case VK_UP:

RectChange();

break;

case VK_DOWN:

RectArrow(DOWN);

break;

}

CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

4.3变形的实现

当按下向上键时,将会执行方块变化事件(change())。常见的方块有7种(长条形、Z 字形、反Z形、田字形、7字形、反7形、T字型),所有图形都是用两个一维数组来统计它的横坐标和纵坐标,每个方块有4种不同的变化形状。

例计算变形后的小方块的坐标和显示的状态值

//变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下

xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3=y3; yy4=y4;

switch(m_currentRect)

{

case 1:

xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2; yy4=y4+2;

m_lscurrentRect = 11;

break;

case 11:

xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2;

m_lscurrentRect = 1;

break;

……

//省略部分为同类实现的变形后小方块坐标的计算代码

case 73:

xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;

m_lscurrentRect = 7;

break;

}

4.4 游戏区域绘图的实现

首先将外部位图文件rect.bmp中的位图动态导入(映射)到内存位图里面,根据游戏区域中的二维数组GameStatus[MAX_ROW][MAX_COL]中的内部数据将所有数据状态中为被占用状态MAP_STATE_NOT_EMPTY的小方块区域用指定的小方块图样类型来填充,然后将已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显示。

4.5 功能的完善

为了使得游戏功能更加健全,另外为用户提供了一些附加功能,如表4.5.1所示。

表 4.5.1 附加功能描述列表

功能名称选项其他描述

游戏等级选择初级......顶级对游戏快慢难度的设定

方块图案样式选择深蓝......条纹对下坠物的小方块图案样式选择

游戏区域大小选择小、中、大对游戏区域的行列数选择

网格的选用有、无是否需要在游戏区域绘制网格

背景音乐的选用有、无在游戏过程中是否播放背景音乐先将这些目标功能通过资源编辑器在主菜单条进行添加,将前面已有的菜单选项补全,再通过ClassWizard添加对应的响应处理函数。其最终效果如图

1

图 4..5.2 游戏设置

游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我在游戏中添加了漂亮的场景和动听的背景音乐,设置了个性化的工具栏快捷键,激发大家的娱乐激情。

4.6 游戏演示

游戏主界面如图所示。

图4..6.1 俄罗斯方块游戏运行主界面4.7主程序源程序清单

CSkyblue_RectView::CSkyblue_RectView()

{

//第一次开始游戏

m_bFistPlay = TRUE;

//缺省为不是游戏暂停状态

m_bGamePaush = FALSE;

//缺省为不插放背景音乐

m_bMusic = FALSE;

//缺省为画网格线

m_bDrawGrid = TRUE;

//总分值清零

m_iPerformance = 0;

//测试值:为12行,10列

m_iRow = 12;

m_iCol = 10;

//左上角X,Y坐标

m_iStartX = 10;

m_iStartY = 10;

//缺省级别为3级

m_iLevel = 2;

//第一种样式

m_iBlockSytle = 0;

//缺省方块大小为m_iLarge个象素

m_iLarge = 30;

//缺省游戏是结束的

m_bGameEnd = TRUE;

int i,j;

//赋初值

for (i=0;i<100;i++)

for (j=0;j<100;j++)

GameStatus[i][j]=0;

//各种形状方块的接触面数据,参见设计书的接触面表格,

//5.判断游戏是否已结束: 碰了底,且第1行有小方块if (m_isBottom)

for (i=0;i

if (GameStatus[0][i])

{

KillTimer(1);

AfxMessageBox("游戏已结束!");

for (j=0;j

for (k=0;k

GameStatus[j][k]=0;

Invalidate(FALSE);

m_bGameEnd = TRUE;

break;

}

}

else //当前方块下降

{

RectDown();

}

CView::OnTimer(nIDEvent);

}

// 函数:产生一个最大值不大于指定值的随机正整数(Random) // 参数:MaxNumber : 随机数的上限

// 返回值: 产生的随机数

int CSkyblue_RectView::Random(int MaxNumber)

{

//布下随机种子

srand( (unsigned)time( NULL ) );

//产生随机数

int random = rand() % MaxNumber;

//保证非0

if(random == 0 ) random++;

return random;

}

}

}

//内部函数:刷新当前的区域

void CSkyblue_RectView::InvalidateCurrent()

{

int i;

for (i=0;i<4;i++)

{

CRect rect(m_iStartX+ActiveStatus[i][1]*m_iLarge,

m_iStartY+ActiveStatus[i][0]*m_iLarge,

m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5,

m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);

//InvalidateRect(&rect);

Invalidate(FALSE);

}

}

// 内部函数:当前方块下降加速,左移,右移

void CSkyblue_RectView::RectArrow(int m_Type)

{

//获取当前下坠物4个小方块的位置坐标

int x1,x2,x3,x4,y1,y2,y3,y4;

x1 = ActiveStatus[0][0];

x2 = ActiveStatus[1][0];

x3 = ActiveStatus[2][0];

x4 = ActiveStatus[3][0];

y1 = ActiveStatus[0][1];

y2 = ActiveStatus[1][1];

y3 = ActiveStatus[2][1];

y4 = ActiveStatus[3][1];

//对不同的移动命令指示进行分类实现

switch(m_Type)

{

case LEFT:

//对每种不同的移动命令指示特性作相应的可移动分析

if ( (ActiveStatus[0][1]>0) && IsLeftLimit() && !m_isBottom)

{

//清原来的方块

GameStatus[x1][y1]=MAP_STATE_EMPTY;

GameStatus[x2][y2]=MAP_STATE_EMPTY;

GameStatus[x3][y3]=MAP_STATE_EMPTY;

GameStatus[x4][y4]=MAP_STATE_EMPTY;

//添加新的移动后数据状态

ActiveStatus[0][1] -= 1;

ActiveStatus[1][1] -= 1;

ActiveStatus[2][1] -= 1;

ActiveStatus[3][1] -= 1;

GameStatus[x1][y1-1]=MAP_STATE_NOT_EMPTY;

GameStatus[x2][y2-1]=MAP_STATE_NOT_EMPTY;

GameStatus[x3][y3-1]=MAP_STATE_NOT_EMPTY;

GameStatus[x4][y4-1]=MAP_STATE_NOT_EMPTY;

InvalidateCurrent();

}

break;

case RIGHT:

if ( (ActiveStatus[3][1]< m_iCol-1) && IsRightLitmit() && !m_isBottom)

{

//清原来的方块

GameStatus[x1][y1]=MAP_STATE_EMPTY;

GameStatus[x2][y2]=MAP_STATE_EMPTY;

GameStatus[x3][y3]=MAP_STATE_EMPTY;

GameStatus[x4][y4]=MAP_STATE_EMPTY;

//添加新的移动后数据状态

ActiveStatus[0][1] += 1;

ActiveStatus[1][1] += 1;

ActiveStatus[2][1] += 1;

ActiveStatus[3][1] += 1;

GameStatus[x1][y1+1]=MAP_STATE_NOT_EMPTY;

GameStatus[x2][y2+1]=MAP_STATE_NOT_EMPTY;

GameStatus[x3][y3+1]=MAP_STATE_NOT_EMPTY;

GameStatus[x4][y4+1]=MAP_STATE_NOT_EMPTY;

InvalidateCurrent();

}

break;

case DOWN:

RectDown();

break;

}

}

// 内部函数:方块的变形

void CSkyblue_RectView::RectChange()

{

//先预先变形,然后判断变形后的方块是否有空间,如有足够空间,则进行实际变形,否则不变int xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4;

int m_lscurrentRect;

CString lsStr;

int x1,x2,x3,x4,y1,y2,y3,y4;

x1 = ActiveStatus[0][0];

x2 = ActiveStatus[1][0];

x3 = ActiveStatus[2][0];

x4 = ActiveStatus[3][0];

y1 = ActiveStatus[0][1];

y2 = ActiveStatus[1][1];

y3 = ActiveStatus[2][1];

y4 = ActiveStatus[3][1];

//变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下

xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3=y3; yy4=y4;

switch(m_currentRect)

{

case 1:

xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2; yy4=y4+2;

m_lscurrentRect = 11;

break;

case 11:

xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2;

m_lscurrentRect = 1;

break;

……

//省略部分为同类实现的变形后小方块坐标计算代码

case 73:

xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;

m_lscurrentRect = 7;

break;

}

//改变形状代码

m_currentRect = m_lscurrentRect;

}

else

{//恢复原来状态

GameStatus[x1][y1] = MAP_STA TE_NOT_EMPTY;

GameStatus[x2][y2] = MAP_STA TE_NOT_EMPTY;

GameStatus[x3][y3] = MAP_STA TE_NOT_EMPTY;

GameStatus[x4][y4] = MAP_STA TE_NOT_EMPTY;

}

//判断是否已到底

IsBottom();

}

//绘图设备环境的初始化

void CSkyblue_RectView::DcEnvInitial(void)

{

if(m_bFistPlay)

{

m_bFistPlay = FALSE;

//黑色的黑笔

m_pBlackPen = new CPen(PS_SOLID,1,BLACK);

//画刷

m_pGrayBrush = new CBrush(RGB(66,66,66));

m_pBlackBrush = new CBrush(BLACK);

}

}

void CSkyblue_RectView::DCEnvClear(void)

{

//设备环境

m_memDC.DeleteDC();

m_memRectDC.DeleteDC();

//位图资源

DeleteObject(m_memBmp);

DeleteObject(m_hMemRectBmp);

delete(m_pBlackPen);

delete(m_pGrayBrush);

delete(m_pBlackBrush);

}

void CSkyblue_RectView::DrawGame(CDC *pDC)

{

int i,j;

//选用黑色画刷,绘制整个游戏所在窗口的背景

pDC -> SelectObject(m_pBlackBrush);

CRect rect;

GetClientRect(&rect);

pDC -> Rectangle(rect);

//选用灰色画刷,绘制游戏区域的背景

pDC -> SelectObject(m_pGrayBrush);

pDC -> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);

pDC->SelectObject(m_pBlackPen);

//画网格线

if (m_bDrawGrid)

{

//画横线

for (i=0;i

{

pDC->MoveTo(m_iStartY, m_iStartX + i*m_iLarge);

pDC->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);

}

//画竖线

for (i=0;i

{

pDC->MoveTo(m_iStartY+i*m_iLarge, m_iStartX);

pDC->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);

}

}

int x,y,nW,nH;

//小方块的绘制

for (i=0;i

for (j=0;j

{

if (GameStatus[i][j]==MAP_STA TE_NOT_EMPTY)

{

//在游戏区域中状态为被占用状态的区域绘制小方块

x = m_iStartY+j*m_iLarge +2;

y = m_iStartX+i*m_iLarge +2;

nW = m_iLarge-4;

mfc绘图程序上机步骤

首先生成MFC程序空框架 空框架中的每个类的职责是什么要自己理解清楚 第一次课: 1.定义自己的数据类CLine直线类,用于绘图 点击菜单:插入—类 选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现 classCLine { int x1,y1,x2,y2; public: CLine(int a=0,int b=0,int c=0,int d=0); virtual ~CLine(); int Getx1(); int Gety1(); int Getx2(); int Gety2(); void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的 void SetPoint2(intx,int y); }; 2.自定义的类要作为数据成员出现在Doc类中 classCSmallCADDoc : public CDocument { protected: // create from serialization only CSmallCADDoc(); DECLARE_DYNCREATE(CSmallCADDoc) // Attributes public: CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句 添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。。。”语句 此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h” 语句。共3处:app doc view 这3个类的cpp文件前 4.注意:初始化 CLine line1; //数据成员是文档类的,它不像dos下程序,明确能看到定义,调用构造

扫雷的课程设计报告

西安文理学院信息工程学院课程设计报告 设计名称:数据结构课程设计 设计题目:实现一个N*M的扫雷游戏 学生学号:1402130407 专业班级:软件13级四班 学生姓名:樊秀琳 学生成绩: 指导教师(职称):谢巧玲(讲师) 课题工作时间:2015.6.22 至2015.7.3

说明: 1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个 学生。 2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。 3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律 按不及格处理。答辩由指导教师实施。 4、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设 计的情况另行规定。 5、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按 不及格处理。

信息工程学院课程设计任务书 指导教师:院长: 日期:2015年6月22日

信息工程学院课程设计进度安排表 学生姓名:樊秀琳学号:1402130407 专业:软件工程班级:13级四班 指导教师签名: 2014年6月22日

成绩评定表 学生姓名:樊秀琳学号:1402130407 专业:软件工程班级:13级四班

摘要 摘要: 扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法设计和语言实现,如C,C++,VB,JAVA等。我利用eclipse编写了与它功能相似的扫雷游戏,寓学于乐。 程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。所有地雷标出后胜利,当鼠标左键单击到地雷时提示游戏失败。其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。清除未靠近地雷区的方块较为复杂。 关键词:算法设计;事件;Eclipse

贪吃蛇小游戏实验报告[

软件设计报告 设计题目:贪吃蛇 学院:华北电力大学科技学院 专业班级:软件10K1 学生姓名:张飞 学生学号:101909020122 指导教师:乔玲玲 提交时间: 成绩: - 0 -

目录 一.需求分析 二.概要设计 三.详细设计 四.心得体会 一.需求分析 1.1关于题目 1.1.1题目要求 利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求: (1)应用MFC单文档制作 (2)能够记录游戏成绩 (3)可根据玩家要求设置游戏速度(级别):初级,中级,高级 (4)可以根据个人喜好更换背景图片,食物图片,障碍物图片,结束图片等 1.1.2选题背景 贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此我们选定了这个题目。 1.2关于编译软件 本程序采用Microsoft Visual C++6.0的英文版本进行编译。VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。 - 1 -

- 2 - 1.3关于兼容性 本程序经过调试,可以在XP 系统下编译运行,也可以在Vista 下运行,界面稍有不同,但不影响运行结果。 二. 概要设计 2.1软件主要功能设计 2.1.1程序结构 根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。具体的程序结构如下面的图1-1所示。 图2-1 贪吃蛇结构图 2.1.2程序流程 根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括: 游戏开始,随机出现食物。 贪吃蛇 游 戏开始 游戏设置 游戏结束 开始 初级 中级 高级 结束

mfc简单绘图程序

M F C 简 单 的 绘 图 程 序 ——王帅

目录 摘要 (2) 关键字 (2) 1 引言 (2) 设计目的 ............................................................................................................ 错误!未定义书签。 2 功能说明 (2) 2.1菜单栏....................................................................................................... 错误!未定义书签。 2.1.1图形 (3) 2.1.2画笔 (4) 2.1.3画硬币 (4) 2.2工具栏 (5) 2.3状态栏 (5) 3 功能的实现 (5) 3.1 视图设计 (5) 3.2 编辑资源 (6) 3.3 编程思路及各个函数的实现 (7) (1)思路 (7) (2)代码的实现 (7)

1.为基本形状创建一个基类 (8) 2.基本形状类的创建 (8) 2.1矩形类的创建及定义 (8) 2.2圆形类的创建及定义 (10) 2.3正五边形类的创建及定义 (11) 2.4正三角形类的创建及定义 (14) 2.5椭圆类的创建及定义 (16) 2.6正四边形类的创建及的定义 (17) 2.7正六边形类的创建及定义 (18) 2.8直线类的创建及定义 (19) 3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20) 3.1矩形类的调用与与绘图的实现 (20) 3.2圆形类的调用 (24) 3.3正三角形类的调用 (25) 3.4基本类型调用的剩余代码 (26) 4.画笔的使用、颜色及大小的调整 (29) 5.画硬币 (35) 6.工具栏中的自定义控件 (38) 7.状态栏中的显示 (39) 4程序功能的测试 (41) 5最后总结 (42)

五子棋游戏实验报告

五子棋游戏实验报告 课程名称计算机程序设计(VB) 学号______________________ 姓名______________________ 班级______________________ 提交时间 五子棋软件设计 一、实验目的 1?通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提岀自己的想法及设计方案。 2?通过开发一个较大的系统,增强软件开发能力。 3?通过调试系统,增强逻辑思维能力。 二、实验内容 1.基本要求: (1)输入两个对手名字,然后进入游戏界面。 (2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。(棋盘15*15 ) (3)可以悔棋。 (4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。 (5)能够将棋局的结果保存,保存该棋局

结束的状态、对手名字、棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。

因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息 用文件技术进行棋局保存,思路相同。 (7)五子棋恢复棋局 思路:首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。 窗体启动事件应该完成的事情: 组合框中应该显示曾经保存的棋局名。因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最 后,因此表中关于棋局名的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据 这个特点编程序取出表中不同的棋局名。 具体算法: 用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给strfile,并加入到组合 框中,一直到表中最后一个记录 因为要从数据库中取岀相关数据到a数组中,因此要将a数组所有数据清零。 要建立一个data控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中选择的棋 局名比较),将数据库该棋局中所有信息都赋值给a数组及相关变量。 刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。 重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中。思路如下: 清屏一绘制棋盘一根据a数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值是1还是 2来决定在该位置绘制何颜色的棋子。 决定该黑白方走的blackwhite变量当时没有保存,可以采用在数据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的。 因此设置了一个变量做计数器,每走一步棋计数器的值加一。 用文件技术实现棋局恢复,思路相同。 (8)悔棋 悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔 一步棋即将那几个变量所表示的点的a数组信息清零。而后调用paint ()过程重画。 以上是教师带着学生完成的软件功能。 遗留问题:保存棋手姓名和棋局名并在恢复棋局的时候显示。(需要同学们自己完成)思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。 三、设计日期 十二月 四、完成日期 十二月 五、实验体会 其实,一开始学习vb我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。起初,我对待这门新课程和其他课

C++实验报告(MFC简单画图程序)

VC++程序设计实验报告 一、实验目的 掌握MFC编程 二、实验内容 用MFC向导创建单文档应用程序,一个简单的画图程序。 ?使用C++语言实现 ?使用VC++6.0集成开发环境开发 ?使用MFC应用程序开发框架 三、实验步骤 ?基本功能描述 1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、 曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决 定图形的大小,当鼠标弹起,此图形则绘制完毕。 ?设计思路 1. 对需要用到的变量进行初始化。 2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。 3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。 4. 选择图形或其它属性,可进行下一次绘制。 ?软件设计 A 设计步骤 1.创建单文档 创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。

图1 创建工程 图2 创建单文档

贪吃蛇实验报告

创作编号: GB8878185555334563BT9125XW 创作者:凤呜大王* 《计算机程序设计》课程设计报告课题名称贪吃蛇游戏 班级 学号 姓名 指导教师 设计时间至 设计地点 常熟理工学院计算机科学与工程学院

常熟理工学院计算机科学与工程学院 目录 1 需求分析 (1) 2 系统分析和设计 (1) 2.1 数据结构的设计和选择的理由 (1) 2.2 系统模块划分和模块结构 (2) 2.3 流程图 (2) 2.4 数据类型、全局变量和函数说明 (3) 3 程序测试和运行结果 (4) 4 课程报告小结 (5) 4.1分数重叠显示 (5) 4.2速度太快 (5) 4.3食物可能出现在蛇身上 (5) 附录A:程序源代码 (6)

《C程序设计》课程设计 1 需求分析 【阐述课程设计应该完成的功能】 使用键盘的上下左右,来控制蛇的运动方向,ESC键退出,并显示得分。 2 系统分析和设计 2.1 数据结构的设计和选择的理由 本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。 2.1.1从游戏参考画面中我们可以看到,贪吃蛇的身体是一节节的,由一个个大小相同的方块组成,那么我们可以用一个(x,y)坐标为左上角的、固定宽度的正方形来表示一节蛇身。为表示连续的多节身体,那么我们可以采用数组(或链表,或线性表)等数据结构来表示。下面以数组方式为例: struct Point { int x, y; } struct Point nodes[MAX_LENGTH]; //蛇身数组,MAX_LENGTH为最大蛇长 贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点: 1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用int direction;表示) 2. 运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes[0]表示蛇头的时候,nodes[1]运动到nodes[0]处;nodes[2]运动到nodes[1]处...。 3. 吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用int length;表示) 根据上面的情况,我们可以设计蛇的数据结构如下: struct Snake { struct Point nodes[MAX_LENGTH]; //蛇身数组,保存每节蛇身的坐标。MAX_LENGTH为最大蛇长 int length; //当前蛇长 int direction; //蛇头运动方向 int live; //蛇活的,还是已经死了? } 2.1.2 关于食物,有两个属性: 1. 坐标位置 2. 状态:存在,或被吃。 故我们用以下结构表示: struct Food { struct Point position; //食物的位置 int exist; //存在?还是被吃? } 1

mfc简单绘图程序报告

简单绘图程序 1 需求说明 1.1 问题描述 设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。 1.2功能说明 1.图形绘制功能:直线、椭圆、矩形。 在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。 2.可以绘制自由线段 3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。 4.可以保存绘图文件,保存后打开可以继续绘制。 2.1.3 数据说明 在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.

其他主要数据说明: int fd 判断是否为自由绘图模式int w 线宽 int R RGB中的R int G RGB中的G int B RGB中的B CGraph类中 int m_nType:保存后重绘时用户的选择int qdx; 重绘起点x int qdy; 重绘起点y int zdx; 重绘终点x int zdy; 重绘终点y CLine类中 int cx; 重绘线宽 int sx; 重绘起点x int sy; 重绘起点y int zx; 重绘终点x int zy; 重绘终点y int w; 重绘线宽 自定义颜色对话框关联变量: IDC_EDIT_RED int m_Red IDC_EDIT_GREEN int m_Green IDC_EDIT_BLUE int m_Blue IDC_SCROLL_RED CScrollBar m_Sred IDC_SLIDER_GREEN CSliderCtrl m_Sgreen IDC_SPIN_BLUE CSpinButtonCtrl m_Sblue 2 分析、设计与实现 2.1 主要功能设计与实现

C程序课程设计报告(扫雷游戏)

C程序设计 扫雷游戏 一、设计题目:扫雷游戏 二、设计目的 1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 2.培养学生综合运用所学知识独立完成课题的能力。 3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基

本素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。 三、设计要求 1.汪洋和孔维亮组成设计小组。小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。 2.查阅相关资料,自学具体课题中涉及到的新知识。 3.采用结构化、模块化程序设计方法,功能要完善,界面要美观。 4.按要求写出课程设计报告,并于设计结束后1周内提交。 一概述 1)掌握数组指针的概念及其应用 2)培养团结合作精神 2. 课程设计的要求 要求我们有扎实的C语言知识,以及良好的编程习惯,能够熟练的应用循环,有毅力,还要求我们有较强的合作精神,善于总结。同时还要求我们自学C语言作图部分知识。在必要时还要上网查相关资料。 3.课程设计的主要设计思想 扫雷游戏主要用了一个10行10列的二维数组,刚开始利用random随机布雷。 每一个程序最主要的是算法。扫雷游戏算法的重点是一开始统计好每个格子周围有多少雷,当鼠标左键点在格子上时做出判断,如果周围8个格子有雷则显示出雷数,如果没有雷则显示空白格(在四个角的格子显示周围3个格子,其它边缘的格子显示周围5个的状态),我们在主函数中用两个for语句来判断周围雷数。我们还加了鼠标处理函数。 如果格子上有雷则调用函FailExitGame(),显示“Fail!”,游戏结束。若所有的雷都标出,且所有的格子都处理过,则调用函数ExitGame(),显示“OK,Good!”,游戏结束。游戏结束后,按任意键出去。

贪吃蛇游戏程序设计实验报告

Windows编程大作业贪吃蛇设计与实现 学校:武汉轻工大学 院系: 班级: 姓名: 学号: 2015年12月16日

目录 一、题目介绍 二、设计目的 三、详细设计 3.1贪吃蛇本体设计 3.2贪吃蛇食物设计 3.3游戏界面设计 3.3.1游戏初始化 3.3.2游戏开始 3.3.3游戏暂停 3.3.4游戏退出 3.3.5游戏总界面 3.3.6游戏区域与背景 3.3.7关于SNAKE 3.4玩法规则设计 3.5核心设计 四、功能测试 五、总结 六、参考文献

一、题目介绍: 编写一个基于MFC的小游戏。 基本要求: 1、实现一个小游戏 2、实现基本游戏控制功能 3、具有游戏数据保存功能 4、界面布局合理、美观; 二、设计目的: 通过使用vc++6.0实现一个小游戏的课程设计,进一步掌握MFC的高级使用方法和锻炼自己动手写程序的能力。了解游戏设计的整个过程,通过熟练使用MFC来设计游戏。程序主要包括:游戏界面设计,游戏菜单栏设计,游戏初始化,游戏控制等。培养和锻炼开发游戏的能力。 三、详细设计 3.1贪吃蛇的本体设计 贪吃蛇的头部拥有一个坐标(x,y),蛇体有一个长度len,蛇有一个运动方向direct,故定义一个结构体如下: struct Snake { int x,y; int len; int direct; }Snake[50]; 3.2贪吃蛇食物设计 贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。 struct Food { int x; int y; int isfood; }Food; 3.3游戏界面设计 3.3.1游戏初始化 游戏初始蛇体长度为3,颜色为灰色,食物标志为1,因为此时没有显示出食物,需要随机生成后,才置为0;

MFC实现简单画图形程序(学习相关)

《MFC编程及应用》课程设计报告题目:简单画图形程序 学号:姓名: 指导老师: 时间: 评语:

程序设计步骤: 一、建立基于对话框的应用程序框架; 二、CMy0910200155Dlg类中关键新增变量的作用: CPtrArray pta; //用于保存已绘图形的相关信息。 CMemoryNode *pmN; //指向CMemoryNode类的指针,程序运行过 程中动态保存对象信息。 CMemoryNode *pmn; //指向CMemoryNode类的指针,从文件中读 取信息时动态创建类的对象。 COLORREF m_CurrentBrushColor; //用于存放当前画刷的颜色。 COLORREF m_CurrentPenColor; //用于存放当前画笔的颜色。 int num; //用于存放从"Index.txt"文件中读取的数字。 int flag=0; //用于标识:当为1时,表示按下了”画图”按钮;当为2时, 表示按下了”撤消”按钮;当为3时,表示按下了”加载历史” 按钮,则从文件中读取信息。 int mark; //用于标识:当为0时,表示刚画过矩形;当为1时,表示 刚画过圆角矩形;当为2时,表示刚画过椭圆。 int index; //用于存放pta数组的容量。 int flag1=0; //用于标识,和flag搭配,用来处理多种情况下的窗口重绘 问题。 int ButtonState=0; //用于标识,是类CShow和类CMy0910200155Dlg 的一个接口,通过其值在1和0之间转换,来处理弹出式对 话框的初次绘制和移动时的重绘问题。

游戏开发课程设计报告模版-扫雷游戏报告(定稿)

中原工学院信息商务学院 课程设计报告 2016~2017学年第一学期 课程游戏开发课程设计 课程设计名称扫雷游戏 学生姓名*** 学号***** 专业班级数媒141 指导教师郑全录 2016年12月

目录 第一章设计内容及要求 (1) 1.1 扫雷游戏的基本要求 (1) 1.2 游戏需要实现的主要功能 (1) 第二章需求分析 (2) 2.1扫雷游戏界面设计 (2) 2.2 雷区的设计 (2) 2.3 音效的设计 (3) 2.4 扫雷英雄榜的设计 (3) 第三章总体设计 (5) 3.1 总体功能图 (5) 3.2 总体流程图 (5) 第四章主要功能设计流程 (6) 4.1 雷区设计流程图 (6) 4.2 音效设计流程图 (6) 4.3 英雄榜设计流程图 (7) 第五章主要功能设计流程 (8) 5.1 类之间关系图 (8) 5.2程序运行效果图 (8) 5.2.1 游戏登录界面 (8) 5.2.2游戏菜单界面 (9) 5.2.3游戏运行界面 (10) 5.2.4游戏英雄榜界面 (12) 第六章总结 (13) 参考文献 (14) 附录 (15)

第一章设计内容及要求 1.1扫雷游戏的基本要求 当前各种游戏层出不穷,因为游戏的开发成本非常大,所以游戏的开发具有一定的风险性,但是一些小游戏的开发成本具有成本小,编写简单的优势,所以这些小游戏在游戏开发中也占有一席之地。在这类小游戏中包括益智类游戏,它以画面精美、游戏方法简单等特点得到大家的认可。成为人们在工作之余不可或缺的好伙伴。针对这种情况我选择了扫雷游戏该课题作为我的课程题目。 Windows XP和Windows 7系统提供的扫雷游戏是一个很有趣的游戏。本次课程设计的主要任务是使用JA V A语言编写一个与其类似的扫雷游戏。具体要求如下: 1、扫雷游戏分为初级、中级和高级三个级别,同时扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。 2、选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中任何一个方块便启动了计时器。 3、用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下没有雷,则显示一个数字,该数字代表此方块周围的8个方块中共有多少颗雷。 4、如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),窗口左上角的雷数计数器将会减少一个。 5、扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。 6、用户如果遇到疑问的方块,可以勾选游戏菜单下的标记选项卡(或者用快捷键Alt+G然后点击M)即可标记该可疑方块,此时双击右键并可出现“?”标记。另有颜色选项,当用户选中该项时,游戏将以最低图像像素来显示。 7、如果用户需要使用提示声,可选中声音选项,此时将听到计时的咔嗒声。当用户点中雷时,将有爆炸声产生;胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。 1.2游戏需要实现的主要功能 1、用户可以自定义级别并且可以任意输入雷数; 2、具有计时功能,既显示用户完成所有扫雷任务所需要的时间; 3、自动保存扫雷英雄榜。

python实现贪吃蛇

Python版贪吃蛇.py #!/usr/bin/python from Tkinter import * import random class snake(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.body = [(0,0)] self.bodyid = [] self.food = [ -1, -1 ] self.foodid = -1 self.gridcount = 10 self.size = 500 self.di = 3 self.speed = 500 self.top = self.winfo_toplevel() self.top.resizable(False, False) self.grid() self.canvas = Canvas(self) self.canvas.grid() self.canvas.config(width=self.size, height=self.size,relief=RIDGE) self.drawgrid() s = self.size/self.gridcount id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s, (self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow") self.bodyid.insert(0, id) self.bind_all("", self.keyrelease) self.drawfood() self.after(self.speed, self.drawsnake) defdrawgrid(self): s = self.size/self.gridcount for i in range(0, self.gridcount+1): self.canvas.create_line(i*s, 0, i*s, self.size) self.canvas.create_line(0, i*s, self.size, i*s) defdrawsnake(self): s = self.size/self.gridcount head = self.body[0] new = [head[0], head[1]] if self.di == 1: new[1] = (head[1]-1) % self.gridcount elifself.di == 2: new[0] = (head[0]+1) % self.gridcount elifself.di == 3: new[1] = (head[1]+1) % self.gridcount

扫雷游戏-课程设计报告

J A V A课程设计题目:扫雷游戏 院(系)计算机信息工程学院 专业网络工程 班级 13级网络工程1班 学生姓名方琴刘莉虹程子卿薛中意 设计时间 2015年8月 指导教师万中英

提交日期 2015年10月8日 摘要 《扫雷》是一款大众类的益智小游戏。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷。先任意点开少量的方格,没有爆炸时,会出现一个数字,这个数字代表的意思是以它为中心的9个格子内所有雷的个数。一般围在一堆数字中间的有可能是雷,你在你认为是雷的那里插旗,就可以把它设定为雷,然后在数字区用鼠标左右键双击,可以打开非雷区,等打开所有非雷区,你就赢了。 采用GUI界面设计,窗口定位,绘图机制,鼠标监听等Java技术。用户可以自己选择地雷的数量,地雷随机分布在17*24的方块矩阵中,地雷数量越多,难度越大。鼠标放在方格上,单击鼠标左键开始游戏,按空格键插旗。如果插旗错误,或是点击到了地雷,则游戏失败。

1 引言 该设计的目的及意义 该设计的要求 相关技术 2 总体设计 功能设计 3 详细设计 系统界面设计 流程图 界面截图

程序描述 选择地雷数量 游戏界面 4 课程设计总结 遇到问题解决问题过程 系统存在的问题,进一步要做的工作 课程设计心得体会 5 附录(程序代码) 该设计的目的及意义

1.利用扫雷游戏巩固和Java语言程序设计这一课程的基本 知识的理解和掌握; 2.掌握Java语言程序设计中编程和程序调试的基本技能; 3.基本掌握完全面向对象程序设计的基本思路和方法; 4.利用Java语言程序设计学会基本的软件设计; 5.掌握书写程序设计说明文档的能力。 课程设计要求 1. 分析课程设计题目的思路及要求; 2. 编写程序代码,调试程序使其能正确运行; 3. 设计完成的软件要便于操作和使用,有整齐、美观的使用界面; 4. 能实现简单的扫雷游戏; 相关技术

VC实现贪吃蛇的实验报告

题目:利用VC++实现贪吃蛇小游戏

一、题目:利用VC++实现贪吃蛇小游戏 利用VC++实现的贪吃蛇小游戏更加注重可视化。一条蛇在封闭的围墙内,在围墙内会随机出现一个食物,通过键盘上的W S A D四个键控制它向上,下,左,右四个方向移动。当蛇头撞到食物时表示将食物吃掉,这时蛇身增长一节,得分加一。接着随机生成食物,等待被蛇吃掉。如果在移动过程中撞到墙壁或者自己的身体,则游戏结束。游戏过程中,可以在菜单中选择暂停或者结束游戏,对游戏进行暂停或者退出。

二、编程要点(或基本思路、算法分析与说明): 本次游戏设计包含两大模块,一个模块是贪吃蛇游戏本身算法的设计,完成了贪吃蛇的食物产生,获取食物,蛇的移动等功能。另一个模块是利用MFC完成贪吃蛇的可视化显示,产生了一个对话框,在对话框可以控制游戏及游戏的显示。 1.贪吃蛇游戏算法设计包括: <1>果实出现的设计思路: (1)采用随机数生成果实出现坐标 (2)判断当前生成的果实是否在贪吃蛇身体范围内。 (3)如果在,重新生成直到不在为止。如果不在,则把坐标位置返回给调用对象。 <2>贪吃蛇更新的算法设计 (1)接收玩家按下的方向键消息,并保存到方向变量中。 (2)定义一个时间定时器,用来控制蛇运动的速度。 (3)当每次时间间隔到达时,则根据方向变量来更新贪吃蛇curr(即贪吃蛇身体)向量。 (4)判断curr向量的第一个元素中的坐标数据是否碰到边界或者蛇身,如果有,则游戏结束。否则,进行下一步。 (5)判断curr向量的第一个元素中的坐标数据是否与当前果实重合,如果有,表示贪吃蛇已经吃到果实。这时就向贪吃蛇curr向量添加一个元素,并重新生成一个果实。 (6)吃到食物后,得分会同步增加。 2.利用MFC完成贪吃蛇的可视化显示: 首先初始对话框,完成游戏的整体框架的显示。然后游戏玩家在菜单栏里选择开始,暂停,结束等,控制游戏状态。游戏开始后,玩家通过键盘上的消息控制蛇的运动。在函数DrawSnake(CDC *pDC,Snake snake),和DrawFood(CDC *pDC,SnakeFood f)完成对蛇和食物的重绘,从而显示出蛇的运动和对食物的获取。在OnPaint()函数中完成得分和游戏操作提示的显示。 本次游戏设计的主要功能函数如下: OnGameStart()(游戏开始函数), OnGamePauseStart()(游戏暂停函

VB课程设计报告——扫雷游戏

VB课程设计报告 -------扫雷游戏马学清1008260132 指导老师:张小兵 一、题目介绍 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。 扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利用Turbo C编写了与它功能相仿的扫雷游戏,寓学于乐。 程序功能 二、程序功能 程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的“开始”按钮可以重新开始游戏。所有地雷标出后胜利,当鼠标左键单击到地雷时失败。 三、程序设计目的 1.培养综合运用所学知识独立完成课题的能力。 2.更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。 4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核 四、游戏规则 设计10×10格区域,单击鼠标后,在此格中显示的数字,则表示它周围就有几个空格内含有的地雷数,周围没有地雷的显示空白,则不能再单击了。如果是地雷,则游戏结束。如果判断是地雷,可以单击鼠标右键标出,显示红色,要取消红旗标志则再单击鼠标右键,当所有地雷都标出,每个空格都处理过,那么游戏就胜利结束。 五、程序源代码 '级别 Private Sub Form_Load() '默认初级 dengji = 1 Call nandu(dengji)

java扫雷游戏课程设计报告

Java课程设计报告 姓名 号学 系院 级班 业专 1.设计内容及要求 1.1 扫雷游戏的基本要求 Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下: (1) 扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。 (2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。 (3) 用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。. (4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为

是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。 (5) 扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。 (6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G 然后M)即可,此时双击右键并可出现“?”标记。另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。 (7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。 1.2 需实现的主要功能 (1)用户可以自定义级别并且可以任意输入雷数; (2)具有计时功能,即显示用户完成移动盘子所花费的时间; (3)用户可以选择是否有音效; (4)自动保存扫雷英雄榜; 2.需求分析 2.1 扫雷棋盘的布局设计 系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。 2.2 雷区的设计 MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener 和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成 图2-1 MineArea类的UML图

贪吃蛇游戏软件可行性分析报告

软件设计与体系架构实验报告 学院:计算机科学与技术学院 学号:0121210680330 姓名:郭烨华 班级:sy1201 课题名:贪吃蛇游戏开发

贪吃蛇开发并进行动态分析 指导老师:陈明俊 组员:李安福 郭烨华 分工明细 成员分工: 职责姓名任务 项目分析经理、程序员李安福可行性分析,系统功能分析,编程 系统设计师、程序员郭烨华概要设计,开发设计、编程 目录 一、引言 (1)

1.1编写目的 (1) 1.2 编写主题 (1) 1.3 游戏运行环境 (1) 二、可行性研究的前提 (1) 2.1游戏基本功能 (1) 2.2 要求 (3) 2.3目标 (3) 2.4 进行可行性研究的方法 (3) 2.5 评价尺度 (4) 三、对现有系统的分析 (4) 3.1 处理流程和数据流程: (4) 3.2 工作负荷 (4) 3.3 人员.................................................................................................. 错误!未定义书签。 3.4 设备 (4) 3.5局限性 (4) 3.6 改进要求 (5) 四、所建议的系统 (5) 4.1 对所建议系统的说明 (5) 4.2处理流程和数据流程 (5) 4.3改进之处 (6) 4.4 影响 (6) 4.4.1对设备的影响: (6) 4.4.3 对用户单位机构的影响 (6) 4.4.4 对系统运行过程的影响 (7) 4.4.5对地点和设施的影响 (7) 4.5 技术条件方面的可行性 (7) 五、可选择的其他系统方案 (7) 六、投资及效益分析 (8) 6.1支出 (8) 6.1.1 基本建设投资 (8) 6.1.2 其他一次性支出 (8) 6.1.3 非一次性支出 (8) 6.2 收益 (8) 6.2.1 一次性收益 (8) 6.2.2 非一次性收益 (8) 6.2.3 不可定量的收益 (8) 6.3 投资回收周期 (9) 6.4 敏感性分析 (9) 七、社会因素方面的可行性 (9) 7.1 法律方面的可行性 (9) 7.2 使用方面的可行性 (9) 八、结论 (9)

基于MFC的OpenGL绘图

基于MFC的OpenGL绘图 本文更新版本请点击 [置顶]《基于MFC的OpenGL编程》系列文章 一、简介 GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。 二、MFC中的OpenGL基本框架 1、首先创建工程 用AppWizard产生一个MFC EXE项目,其他默认即可。 2、将此工程所需的OpenGL文件和库加入到工程中 在工程菜单中,选择"Build"下的"Settings"项。单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。然后打开文件"stdafx.h",加入下列头文件: #include #include 3、改写OnPreCreate函数并给视图类添加成员函数和成员变量

OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。把OnPreCreate改写成如下所示:BOOL COpenGLDemoView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); } 产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在COpenGLDemoView的类中添加一个保护型的成员函数BOOL SetWindowPixelFormat(HDC hDC)(用鼠标右键添加)和保护型的成员变量:int m_GLPixelIndex;并编辑其中的代码如下: BOOL COpenGLDemoView::SetWindowPixelFormat(HDC hDC) {//定义窗口的像素格式 PIXELFORMATDESCRIPTOR pixelDesc= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0, 0,

相关主题
文本预览
相关文档 最新文档