当前位置:文档之家› 迷宫游戏设计报告

迷宫游戏设计报告

迷宫游戏设计报告
迷宫游戏设计报告

人工智能与专家系统

课程设计

---------迷宫游戏

目录

序言-------------------------------------------------------------3

算法详解-------------------------------------------------------3

程序代码内容与说明

程序各个全局变量的声明---------------------------------7

主体程序的实现----------------------------------------------8

执行结果演示------------------------------------------------15

设计心得体会------------------------------------------------17

参考书目------------------------------------------------------17

附录:程序源代码------------------------------------------18

序言

“人工智能”也就是所谓的AI(artifical intelligence),它是一门抽象的技术,人工智能程序的编写不需要遵循任何即定的思考模式或者规则,而游戏中的AI完全按照程序员自己

的思考逻辑而发展。这就是说,程序员越是聪明越是能够写出更为精明的计算机人工智能程序,这和程序员自身的条件有着很大的关系。如果对于一个很陌生不熟悉的游戏领域,程序员从来没有接触过,这样即使有很高的编程水平,也没有办法实现我们想要达到的目标,根本不可能在游戏中将所有的情况包罗其中。

人工智能具有特定的三种思考模式,分别为移动模式,行为模式和策略模式。顾名思义,给定一个物体移动路径的公式,物体按照这样的公式来移动的就是移动模式。这种情况很多见,例如:某个物体追着玩家跑,目标射击等等。它又可以分为固定模式移动,追逐移动,躲避移动。策略型人工智能是AI中比较复杂的一种,最常见的运用策略型AI游戏是棋盘类的游戏,通常计算机必须判断目前情况下所有可走的棋步和可能获胜的情况,并计算目前计算机可走棋步的制胜分数或者是玩家可走棋步的制胜分数,最后决定出最佳的走法。行为型AI在游戏中是经常会运用到的,它的主要意义是物体会随着情况的改变来做出一些行为动作,而这些物体可以是游戏中的主角、怪物或者是四周环境中的物品。

而此次迷宫游戏的设计也是属于人工智能中的行为模式。

算法详解

路径搜寻的概念

路径搜寻与行为型人工智能有直接的关系。在迷宫游戏中,涉及路径搜寻时必须设定物体的一些走出迷宫的法则。如前面有路时就往前走,前面的路走过就往没走过的地方走等。这些法则必须确实可以让物体搜索迷宫中的每一块区域来找到出口,若走迷宫的法则设定得不完整,那么物体就有可能在同一个地方兜圈子,永远找不到出口了。

此外,为了让物体在走出迷宫后能知道正确走出迷宫的路径,必须给物体一张地图来记录所走过的路径,这张图就是一个链表结构,当物体成功走出迷宫后,整个链表就是正确走出迷宫的路径。如图1所示

图 1

图1中,实线部分为小球走迷宫的最短路径,依照走迷宫的规则每移动到新一格时,该区域就被增加到链表中,而当走过的区域并非正确路径时(图中虚线部分),则从链表中删除。例如:上图中虚线部分为小球所走过的区域,但小球进入该区域后发现是死路,因此必须倒退,每倒退一格时,就表示该格不是正确路径,因此从链表中删除;最后,当小球走出迷宫后,正确路径便会记录在链表中。

●搜寻最佳路径

在这个迷宫路径搜寻的程序中,我以一颗小球来走迷宫,小球会自动搜寻到迷宫的入口,接着自动找寻出口,当找到出口后便记录着正确走出迷宫的路径,按[F2]键察看此最短路径。

●定义迷宫的方式

使用一个整数的二维数组maze[8][8]来存储整个迷宫的状态。如图2

出口

图 2

定义数组时,设定出口元素值为3,入口的元素值为2,墙元素值为1,通道的元素值为0。图2中,代表入口的数组元素为maze[0][1],同时,以变量m,n分别代表数组一维与二维的索引值,具体如下所示:

maze[m][n]=3 // 出口

maze[m][n]=2 // 入口

maze[m][n]=1 // 墙

maze[m][n]=0 // 通道

●双向链表的使用

在程序中我使用双向链表记录小球所走过的路径,结构定义如下:

struct list //定义链表结构

{

int m;

int n;

struct list*next; //指向下一结点

struct list*back; //指向前一个结点

};

typedef struct list node; //定义结点

typedef mode*pointer; //定义动态指针

当小球走迷宫时,主要王没有走过的格子走,程序使用一个二维的布尔数组pass[8][8]来记录格子是否走过,小球走向未走过的格子时,这一格会被加到链表里,而当小球走到其上、下、左、右有墙或者都已经走过的格子时,此时必须倒退,而每倒退一格就表示那一格是错误的格,因此将其从链表中删除,直到最后走出迷宫时,链表中每一结点便是正确的行进路线。如图3:

图3

图中,虚线部分是小球所走过的错误路径,在走进错误区域后,都是死路。因此小球必须沿原先进入的路径后退。在后退后,原先加到链表中的错误结点也会同时从链表中删除,而后退到有其他未走过的格子可以走时,就往那一个格子前进,最后找到出口后,正确的行进路线的结点便记录在链表中。

●走迷宫的规则

?先试着往下走,若下一格有墙或者走过,则试着往右走

?若右一格有墙或者走过,则试着往左走

?若左一格有墙或者走过,则试着往上走

?若上一个有墙或者走过,此时表示上、下、左、右都有未走过的格,便必须往后退,

回到上一结点位置并删除目前结点

以下列出依各条规则所设定出的算法:

1)试图往下走的程序代码:

if(下一格是墙)

/*试图往右走的程序代码*/

else

if(下一格走过)

/*试图往右走的程序代码*/

else

//往下走并新增结点

2)试图往右走的程序代码:

if(右一格是墙)

/*试图往左走的程序代码*/

else

if(右一格走过)

/*试图往左走的程序代码*/

else

//往右走并新增结点

3)试图往左走的程序代码:

if(左一格是墙)

/*试图往上走的程序代码*/

else

if(左一格走过)

/*试图往上走的程序代码*/

else

//往左走并新增结点

4)试图往上走的程序代码:

if(上一格是墙)

//回上一个结点并删除目前结点

else

if(上一格走过)

//回上一个结点并删除目前结点

else

//往上走并新增结点

将上面4组算法结合起来,就得到整个走迷宫的判断式结构了

●程序内容说明:

本迷宫游戏的主要功能如下:

?程序执行式自动搜寻入口与出口

?按[F1]键可重新进行搜寻

?按[F2]键辉县是正确走迷宫的路径

?若迷宫无出口,则搜寻结果会显示无出口的信息

程序代码内容与说明

一程序各个全局变量的声明

int maze[8][8] =

{1,1,1,1,1,1,1,1,2,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,1,0, 1,0,0,1,1,3,1,1,1,1,1,1};

BOOL pass[8][8];

int i,j,m,n,lastm,lastn;

BOOL start= true,search= true,go;

pointer ptr,preptr,first;

char str[10];

说明:

1)第1、2行程序代码定义大小为8×8迷宫数组的内容,其中值为2与3的元素就是迷宫

的入口与出口

2)第3行程序代码定义一个pass数组,用来记录迷宫中各个格子是否走过,举例来说,

若maze[4][5]走过,则pass[4][5]会被设定为true

3)第4行程序代码定义的格个整数变量用途说明如下

变量名称说明

i 计数变量

j 计数变量

m 小球所在位置的第一个索引值

n 小球所在位置的第二个索引值

lastm 上一次小球所在位置的第一个索引值

lastn 上一次小球所在位置的第二个索引值

4)第5行程序代码所定义的3个布尔变量start、search、go分别用以表示程序开始,重新

搜寻以及显示最短路径

5)第6行程序代码定义了ptr、preptr与first动态指针,分别代表目前结点、上一个结点

与第一个节点。

二主体程序的实现

canvasFrame::canvasFrame()

{

/*建立窗口与加载图文件的程序代码*/

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

{

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

if(maze[i][j]==2)

break;

if(maze[i][j]==2)

break;

}

m = i;

n = j;

ptr = (pointer)malloc(sizeof(node));

ptr->m = m;

ptr->n = n;

ptr->next = NULL;

ptr->back = NULL;

first = ptr;

}

说明:

1)第3---10行程序代码为一个双层循环,用来搜寻二位数组中,元素值为2的元素;第

6---8行程序代码判断若找到了此元素,则结束循环,此时I与j的值便是代表迷宫入口的索引值

2)第11、12行程序代码将i,j的值赋予给m、n,这是第一个链表结点中所要存储的值

3)第13行程序代码建立第一个节点的指针ptr,接着14、15行程序代码设定其中的成员

变量m与n的值,第16、17行程序代码则将结点的前后指针指向NULL。如此,第一个结点结构如下:

其中结点的back指针是用以指向链表中的上一个结点,next指针则是指向下一个结点,如此便形成双向链表,而小球在走迷宫时才能够前进与后退

4)第18行程序代码则设定first等于ptr,用来记录链表第一个结点的位置

void canvasFrame::OnTimer(UINT nIDEvent)

{

if(start)

Start(); //开始搜寻

else

{

if(search)

Search(); //进行搜寻

if(go)

Go(); //显示最短路径

}

CFrameWnd::OnTimer(nIDEvent);

}

说明:

在OnTimer函数中则是会依目前程序的状况来执行开始搜寻,显示最短路径等于自定义函数。

程序于一开始进行搜寻时便会执行Start函数,将小球的图案显示于入口上。

接下来每次进行搜寻而小球移动时,会执行Search函数,而当用户按下[F2]键时,则会调用Go函数来显示走出迷宫最短路径

void canvasFrame::Start()

{

CClientDC dc(this);

mdc->SelectObject(tile);

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

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

if(maze[i][j] == 1)

dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);

mdc->SelectObject(ball);

dc.BitBlt(ptr->n*40,ptr->m*40,40,40,mdc,0,0,SRCCOPY);

start = false;

lastn = ptr->n;

lastm = ptr->m;

}

说明:

1)在start函数中,第4---8行程序代码会先贴上迷宫中的墙。使用双层循环在条件式

maze[i][j] == 1成立时,则以左上角的贴图坐标(j*40,i*40,)来进行贴上墙的动作

2)第10行程序代码则以ptr所指结点中m与n成员变量的值来计算贴图坐标,此时ptr

所指结点为第一个结点,因此贴图后,小球会出现在迷宫入口位置上

3)接下来第11行程序代码将start变量设定为false,第12、13行程序代码则将结点m与

n的值记录在lastm与lastn中,以便下次执行OnTimer时可以覆盖掉前一次的贴图

void canvasFrame::Search()

{

CClientDC dc(this);

mdc->SelectObject(tile);

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

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

if(maze[i][j] == 1)

dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);

mdc->SelectObject(ball);

lastn = ptr->n;

lastm = ptr->m;

if(maze[m+1][n]==1) //下一格是墙

/*判断行进方向与变更链表内容的程序代码*/

else

if(pass[m+1][n]) //下一格走过

if(maze[m][n+1] == 1) //右一格是墙

if(maze[m][n-1] ==1) //左一格是墙

if(maze[m-1][n] == 1) //上一格是墙

{

if(ptr->back != NULL)

{

ptr = ptr->back;

free(ptr->next);

ptr->next = NULL;

}

m = ptr->m;

n = ptr->n;

}

else

if(pass[m-1][n]) //上一格走过

{

if(ptr->back != NULL)

{

ptr = ptr->back;

free(ptr->next);

ptr->next = NULL;

}

m = ptr->m;

n = ptr->n;

}

else

{

m-=1; //往上一格

ptr->next = (pointer)malloc(sizeof(node));

ptr->next->m = m;

ptr->next->n = n;

preptr = ptr;

ptr->next->next = NULL;

pass[m][n] = true;

ptr = ptr->next;

ptr->back = preptr;

}

else

/*判断行进方向与变更链表内容的程序代码*/ else

{

m+=1; //往下一格

ptr->next = (pointer)malloc(sizeof(node));

ptr->next->m = m;

ptr->next->n = n;

preptr = ptr;

ptr->next->next = NULL;

pass[m][n] = true;

ptr = ptr->next;

ptr->back = preptr;

}

dc.BitBlt(lastn*40,lastm*40,40,40,mdc,0,0,WHITENESS);

dc.BitBlt(ptr->n*40,ptr->m*40,40,40,mdc,0,0,SRCCOPY);

if(ptr->back == NULL)

{

dc.TextOut(120,320,"找不到出口");

search = false;

}

if(maze[m][n] == 3)

{

dc.TextOut(120,320,"找到出口");

search = false;

}

}

说明:

在search()函数中主要是进行迷宫出口的搜寻与小球的移动,而当搜寻完毕后,便显示是否找到出口的信息

1)第4---8行程序代码会先贴上迷宫中墙的部分

2)第12—14行程序代码则是路径搜寻的判断式,由于整个判断式内容相当冗长,在此仅

列出部分来作说明

3)第12行程序代码判断目前为止的下一个是否有墙,即maze[m+1][n]是否等于1,如果

有墙接下来的程序代码便试图往其他的方向走

4)若目前位置的下方没有墙,此时第14行程序代码会以pass[m+1][n]是否为true来判断

下一格走过或者没有走过。如果条件式成立,表示下一格走过,接下来的程序代码同样会试图往其他的方向走。倘若条件式不成立,表示下一格未走过,便执行第54---63行的程序代码,在链表中新增一个结点

5)如果目前位置的下一格走过且第15---17行程序代码都成立,就表示已走到了死路,小

球必须往后退,也就是必须从链表中删除错误路径的结点。

6)第19---26行程序代码进行删除结点的动作,第19行程序代码判断ptr back是否为

NULL,若为NULL,则表示目前结点为链表的第一个结点,并不删除该结点;若目前结点不是第一个结点,便依底下图标过程来删除结点。

执行第21行程序代码:

NULL

ptr

ptr

执行第22行程序代码:

释放其后面所指

结点的存储单元

执行第23行程序代码:

第24、25行程序代码则依目前ptr 所指的结点来重设m 与n 的值

7) 当有未走过的格子可走时,此时就必须在链表的最后加上代表新格子的结点,如第

40---51行与第53---64行的程序代码

8) 以第40---51行往上一动一格的程序代码为例,我们来说明加入新结点的方式,第42

行程序代码将m 值减1代表上一个格子,而新增结点的过程则如底下的图标所示。

执行第43

行程序代码:

执行第44、45行程序代码:

执行第46行程序代码:

ptr preptr

执行第47行程序代码:

NULL

ptr preptr 执行第49行程序代码:

NULL

执行第50行程序代码:

NULL

完成以上步骤之后,在链表中便新增一个结点,m与n的值则是代表新的一格在数组中的索引值,而第48行程序代码是设定mass[m][n]为true,表示此格已走过

9)第65行程序代码以上一次的m与n的值lastm和lastn来覆盖上一次的小球贴图,第

66行程序代码则以目前结点的m与n值来贴上小球到所移动的格子上。

10)第67行程序代码判断小球是否会到第一个结点,便表示这个迷宫没有出口,而第一个

结点的back指针指向NULL,因此69行程序代码显示找不到出口的信息,并将Search 设为false。

11)在每次计算m与n值之后,若maze[m][n]元素值为3,则表示小球移动到了定义为出口

的地方,第72行判断式成立,接下来便显示找到出口的信息,同时将Search设定为false。

void canvasFrame::Go()

{

CClientDC dc(this);

m = ptr->m;

n = ptr->n;

mdc->SelectObject(tile);

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

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

if(maze[i][j] == 1)

dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);

mdc->SelectObject(ball);

dc.BitBlt(n*40,m*40,40,40,mdc,0,0,SRCCOPY);

if(maze[m][n] == 3)

{

dc.TextOut(120,320,"最短路径");

go = false;

}

else

ptr = ptr->next;

}

说明:

当用户按下[F2]键后便会将go变量设定为true,并将链表的指针移回第一个结点。OnTimer函数中就会不断地调用Go函数来进行小球贴图显示正确走出迷宫的路径:

1)第4、5行程序代码取出目前结点m与n的值

2)第7---10行程序代码贴上迷宫中的墙

3)第12行程序代码依m与n的值贴上小球图

4)第13行判断式判断maze[m][n]是否等于3,若等于3则表示已走到了出口,显示最短

路径的信息,并将go设定为false;否则第19行程序代码将指针移到链表的下一个结点,已进行下一次小球的移动

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

{

CClientDC dc(this);

if(nChar == VK_ESCAPE)

PostMessage(WM_CLOSE);

if(nChar == VK_F1)

{

start = true;

search = true;

go = false;

for(i=0;i<=8;i++) //清空数组

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

pass[i][j] = false;

dc.BitBlt(ptr->n*40,ptr->m*40,40,40,mdc,0,0,WHITENESS);

while(ptr->back) //删除结点

{

ptr = ptr->back;

free(ptr->next);

ptr->next = NULL;

}

m = ptr->m;

n = ptr->n;

}

if(nChar == VK_F2)

{

if(ptr->back == NULL)

dc.TextOut(120,320,"此迷宫无出口");

else

{

ptr = first; //移动指针到第一个结点

go = true;

search = false;

}

}

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

}

OnKeyDown函数用于处理按下按键信息,用户可按下[ESC]键来结束程序,按[F1]键重新进行搜寻,按[F2]键显示走出迷宫的路径。

说明:

1)第7行程序代码判断若用户按下[F1]键,则将start、search变量设定为true,go变量设

定为false,如此OnTimer函数会调用Start与Search函数重新进行路径搜寻

2)第12---14行程序代码将记录走过格子的二维数组中的各元素重新设定为false

3)第15行程序代码覆盖最后一次的小球贴图

4)第16---21行得while循环进行链表结点的删除,仅留下第一个开始的结点

5)第22、23行程序代码设定变量m与n的值为第一个结点的成员变量m与n的值,即

为小球已开始所在的格子

6)若用户按下了[F2]键,此时程序必须将链表指针的位置移到第一个结点,然后再一一取

出各个结点中的m与n的值,来贴上小球图以显示路径

7)第27行判断式中的条件式ptr→back==NULL若成立则所在结点为第一个结点(入口结

点),即表示迷宫没有出口

8)若ptr→back==NULL不成立,则31行程序代码将链表的指针移动到第一个结点的位置

上,然后将go设定为ture,search设定为false,以执行显示最佳路经得Go函数

执行结果演示

进行迷宫搜寻找到出口

最短路径

当迷宫设定为无出口时,则搜寻后结果如下图所示:

找不到出口

可以通过改变数组中的数据来改变迷宫路径,程序也可自动找到入口并搜寻走出迷宫的路径

设计心得体会

5年前,当得知象棋大师卡斯帕罗夫同IBM“深蓝二代”计算机的对弈以失败告终后,人工智能,在我的脑海里便成为了一个神秘并且深不可及的名词。在我看来,它可以让很多本来没有思想的东西变得富有生命力,赋予他们思考的能力。比如会踢足球的机器人,会与人对弈的计算机,可以自动控制的家电等等。

这个学期,通过人工智能与专家系统这门课程的学习,使我对人工智能这个前沿领域有了初步的了解。当得知要进行课程设计的时候,我的心里是欣喜并且有些担忧的。虽然迷宫游戏只是属于人工智能的一个小小的分支,但是,要完成这样的课程设计对我来说还是有相当大的难度的。为此,我查阅了很多计算机游戏编程的书籍,并且到网上搜集了很多的资料,为这次编程进行了很充足的准备。然而,理论转变为实际的过程中,还是存在着许多大大小小的问题的。

首先,在分析问题的时候,应该要尽可能的全面。迷宫游戏中,涉及路径搜寻时必须设定物体的一些走出迷宫的法则。如前面有路时就往前走,前面的路走过就往没走过的地方走等。这些法则必须确实可以让物体搜索迷宫中的每一块区域来找到出口,若走迷宫的法则设定得不完整,那么物体就有可能在同一个地方兜圈子,永远找不到出口了。

写程序对我来说确实是件有点头疼的事情。起初设想的算法写着写着发现原来是行不通的。这时,就需要及时的更正,一条路走不同,就要从另外的角度去思考问题了。在程序调试的过程中一份平和的心态以及冷静的头脑尤为重要,不能急躁,往往漏洞就出现在最不起眼的地方。只有冷静下来,心思缜密的从头把程序梳理下来,细心思考每一个步骤,每一个过程,通过逐步调试,才能一点点地将错误纠正过来。

在通过自己的一番辛苦努力以及同学的指导之下,当最终调试出了另人满意的结果的时候,心里那种成功的喜悦感是无法言表的。

人工智能是一个很深奥的领域。通过这次的课程设计,初步激发了我对这个领域的兴趣。相信在以后的学习以及工作过程当中,我一定会尝试着去接触更多更深层次的方面,希望有朝一日,我也可以为人工智能这个领域做出一些贡献。

参考书目

c++动画编程水力水电出版社

c++游戏动感编程电子工业出版社

人工智能基础编程西北电子科技大学出版社

附录:程序源代码

// canvasFrame.cpp : implementation file

#include "stdafx.h"

#include "canvasr.h"

#include "canvasFrame.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

struct list //定义链表结构

{

int m;

int n;

struct list *next; //指向下一个结点

struct list *back; //指向前一个结点

};

typedef struct list node; //定义结点

typedef node *pointer; //定义动态指针

/////////////////////////////////////////////////////////////////////////////

// canvasFrame

IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)

int maze[8][8] = {1,1,/*2*/1,1,1,1,1,1,/*1*/2,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0, 0,1,1,0,1,0,1,0,0,/*3*/1,1,/*1*/3,1,1,1,1,1,1};

BOOL pass[8][8];

int i,j,m,n,lastm,lastn;

BOOL start= true,search= true,go;

pointer ptr,preptr,first;

char str[10];

canvasFrame::canvasFrame()

{

RECT rect;

Create(NULL,"绘图窗口",WS_OVERLAPPEDWINDOW,CRect(0,0,330,380));

CClientDC dc(this);

int width = dc.GetDeviceCaps(HORZRES);

int height = dc.GetDeviceCaps(VERTRES);

GetWindowRect( &rect );

width = ( width - ( rect.right - rect.left ))/2 ;

height = (height - (rect.bottom - rect.top ))/2 ;

MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);

mdc = new CDC;

mdc->CreateCompatibleDC(&dc);

tile = new CBitmap;

ball = new CBitmap;

tile->m_hObject = (HBITMAP)::LoadImage(NULL,"tile.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);

ball->m_hObject = (HBITMAP)::LoadImage(NULL,"ball.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);

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

{

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

if(maze[i][j]==2)

break;

if(maze[i][j]==2)

break;

}

m = i;

n = j;

ptr = (pointer)malloc(sizeof(node));

ptr->m = m;

ptr->n = n;

ptr->next = NULL;

ptr->back = NULL;

first = ptr;

}

canvasFrame::~canvasFrame()

{

delete tile;

delete ball;

delete mdc;

ptr = first;

while(ptr->next)

{

ptr = ptr->next;

free(ptr->back);

}

free(ptr);

}

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd) //{{AFX_MSG_MAP(canvasFrame)

ON_WM_TIMER()

ON_WM_CREATE()

ON_WM_KEYDOWN()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// canvasFrame message handlers

void canvasFrame::OnTimer(UINT nIDEvent)

{

if(start)

Start(); //开始搜寻

else

{

if(search)

Search(); //进行搜寻

if(go)

Go(); //显示最短路径

}

CFrameWnd::OnTimer(nIDEvent);

}

void canvasFrame::Start()

{

CClientDC dc(this);

mdc->SelectObject(tile);

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

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

if(maze[i][j] == 1)

dc.BitBlt(j*40,i*40,40,40,mdc,0,0,SRCCOPY);

mdc->SelectObject(ball);

dc.BitBlt(ptr->n*40,ptr->m*40,40,40,mdc,0,0,SRCCOPY);

start = false;

lastn = ptr->n;

lastm = ptr->m;

迷宫问题课程设计报告

目录 第一章:设计问题描述与分析 (1) 1.1.课程设计内容 (1) 1.2. 问题分析 (1) 1.3.功能实现 (2) 1.4.运行环境 (3) 第二章:算法设计与流程图 (4) 2.1.主函数的流程图 (4) 2.2.概要设计 (5) 2.4详细设计 (6) 2.4.1. 节点类型和指针类型 (6) 2.4.2.迷宫的操作 (6) (1)生成迷宫 (6) (2)打印迷宫矩阵与字符图形 (7) (3)迷宫求解路由求解操作 (7) (4)打印迷宫通路坐标 (8) (5)输出迷宫通路的字符图形 (8) 2.4.3. 主函数 (9) 第三章:调试分析 (10) 第四章:使用说明 (11)

第五章:测试结果 (12) 附录1 (19) 附录2 (19)

第一章:设计问题描述与分析 1.1.课程设计内容: 该系统是由C 语言编写的生成一个N×M(N行M列)的迷宫,完成迷宫的组织和存储,并实现迷宫路由算法。基本要求1、 N和M是用户可配置的,缺省值为50和50。 2、迷宫的入口和出口分别在左上角和右下角。 提示:(1)可以使用二维数组maze[M+2][N+2]表示迷宫,其中M,N为迷宫的行、列数,当元素值为0时表示该点是通路,当元素值为1时表示该点是墙。老鼠在每一点都有4种方向可以走,可以用数组move[4]来表示每一个方向上的横纵坐标的偏移量,可用另一个二维数组mark[M+2][N+2]记录节点的访问情况。(2)可以选用深度优先算法或广度优先算法实行,迷宫可由自动或手动生成。测试用例应该包含有解迷宫和无解迷宫。 1.2. 问题分析 本程序要求实现迷宫问题的相关操作,包括迷宫的组织和存储,并实现迷宫路由算法(即查找迷宫路径)。程序所能达到的:具体包括迷宫的建立,迷宫的存储(迷宫由自动生成或手动生成),迷宫中路径的查找 迷宫是一个矩形区域,迷宫存在一个入口和一个出口,其内部包含了不能穿越的墙或者障碍。迷宫的建立即是建立这样一个迷宫矩阵,用于存储迷宫信息,包括可穿越的路和不可穿越的墙或者障碍,分别用0表示通路,1表示障碍。对于迷宫矩阵,用m×n的矩阵来描述,m和n分别代表迷宫的行数和列数。这样,则迷宫中的每个位置都可以用其行号和列号来指定。从入口到出口的路径是由一组位置构成的。每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的上、下、左、右的邻居。 为了描述迷宫中位置(i ,j)处有无障碍,规定,当位置(i ,j)处有一个障碍时,其值为1,否则为0.这样迷宫就可以用0、1矩阵来描述,在构造矩阵时,为了操作方便会将矩阵四周置为1(不通)。

程序设计课程设计实验报告

《程序设计》课程设计姓名: 学号: 班级:软件工程14班 指导教师: 成绩:

1.消除类游戏 【问题描述】 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 【基本要求】 现在给你一个n行m列的棋盘(1≤n,m≤30),棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n,m,用空格分隔,分别表示棋盘的行数和列数。接下来n行,每行m 个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。 输出数据格式: 输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。 【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 测试数据一 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。 测试数据二 输出说明: 棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。 【功能实现】 #include #include<> usingnamespacestd;

{ intm,n,i,j; inttemp; cin>>n>>m; temp=m; m=n; n=temp; int*map=newint[m*n]; int*mark=newint[m*n]; int*tmap=map; int*tmark=mark; intdif=0; ount=0; } p rintf("请输入要输入数的个数\n"); s canf("%d",&n);/*输入要输入数的个数*/ f or(i=0;idata1[j+1].number)

课程设计报告示例:迷宫求解

安徽建筑大学 课程设计报告 课程名称:数据结构与算法课程设计 题目:迷宫求解 院系:数理系 专业:信息与计算数学 班级: 学号: 姓名: 时间:

目录 一、需求分析 (2) 1.问题描述: (2) 2.基本要求 (2) 二、概要设计 (3) 1.数据结构 (3) 2.程序模块 (3) 3.算法设计 (5) 三、详细设计 (7) 1.数据类型定义 (7) 2.函数实现代码 (7) 3.函数之间的调用关系 (7) 四、调试分析 (7) 五、用户手册 (8) 六、测试结果 (8) 七、参考文献 (9) 八、附录 (9)

迷宫求解题目: 以一个m×n长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。(1)以二维数组存储迷宫数据; (2)求得的通路以二元组( i , j )的形式输出,其中(i, j)指示迷宫中的一个坐标。 一、需求分析 1. 问题描述: 在迷宫中求出从入口到出口的路径。经分析,一个简单的求解方法是:从入口出发,沿某一方向进行探索,若能走通,则继续向前走;否则沿原路返回,换一方向再进行搜索,直到所有可能的通路都探索到为止。即所谓的回溯法。 求迷宫中从入口到出口的所有路径是一个经典的程序设计问题。由于计算机解迷宫时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。因此,在求迷宫通路的算法中应用“栈”也就是自然而然的事了。 假设“当前位置”指的是“在搜索过程中某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:若当前位置"可通",则纳入"当前路径",并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。 2. 基本要求 (1)以二维数组maze.adr[m+1][n+1]表示迷宫,其中mg[0][j]和mg[m+1][j](0 j n)及mg[i][0]和mg[i][n](0 i m)为添加的一圈障碍,数组中以元素值为0表示通路,1表示障碍,限定迷宫大小m,n 10。 (2)用户以文件的形式输入迷宫的数据:文件中第一行的数据为迷宫的行数m 和列数n;从第2行至第m+1行(每行n个数)为迷宫值,同一行的两个数之间用空 白字符相隔。 (3)迷宫入口为(1,1),出口为(m,n)。 (4)每次移动只能从一个无障碍的单元到周围8个方向上任意无障碍的单元,编制程序给出一条通过迷宫的路径或报告一个“无法通过”的信息。 (5)本程序只求出一条成功的通路。 3.测试数据见下表,当入口为(1,1)时,出口为(8,8) 用一个字符类型的二微数组表示迷宫,数组中的每个元素表示一个小方格,取值“0”(表示可以进出)或“1”(表示不可以进出) 随机产生一个8*8的迷宫,其中使用迷宫障碍坐标如下: (1,3),(1,7),(2,3),(2,7),(3,5),(3,6), (4,3),(4,4),(5,4),(6,2),(6,6),(7,2),(7,3), (7,4),(7,6),(7,7),(8,1)。

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

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;

课程设计报告(迷宫)详解

武汉东湖学院计算机科学学院 课程设计报告 课程名称数据结构课程设 题目深度与广度优先搜索 迷宫问题 专业班级(请自己填写) 学号(请自己填写) 学生姓名(请自己填写) 指导教师吴佳芬 (请自己填写)年(请自己填写)月(请自己填写)日

武汉东湖学院计算机科学学院 课程设计任务书 课程名称:数据结构课程设计 设计题目:深度与广度优先搜索:迷宫问题 专业:(请自己填写)班级:(请自己填写) 完成时间:自己填写指导教师:吴佳芬专业负责人:许先斌

武汉大学东湖分校计算机科学学院 课程设计成绩评价表 指导教师:吴佳芬年月日

(由学生完成,以下为摸版) 【软件课程设计报告目录】 1、需求分析 说明程序设计的任务,强调的是程序要做什么,明确规定: (1)输入的形式和输入值的范围; (2)输出的形式; (3)程序所能达到的功能; (4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 2、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3、详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法;画出函数的调用关系。 4、使用说明、测试分析及结果 (1)说明如何使用你编写的程序; (2)测试结果与分析; (3)调试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和分析; (4)运行界面。 5、课程设计总结(设计心得) (1)你在编程过程中用时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题? (2)遇到了哪些难题?你是怎么克服的? (3)你对算法有什么改正想法吗? (4)你的收获有哪些? 参考文献 (由学生完成,以下为摸版,编页码:共x页,第x页)

游戏C语言实验报告

嘉应学院计算机学院 实验报告 课程名称: C程序设计 开课学期: 2015—2016学年第1学期 班级:计算机1505 指导老师:陈广明 设计题目:游戏2048 学生姓名(学号):第3组:钟瞻宇

目录 一、实验目的和要求 .................................................................................................................................................... 二、实验环境、内容和方法 ........................................................................................................................................ 三、程序设计 ................................................................................................................................................................ 四、源代码 .................................................................................................................................................................... 五、调试与运行结果.................................................................................................................................................... 六、总结........................................................................................................................................................................

(完整word版)走迷宫游戏程序设计.docx

《C 语言程序设计》 题目走迷宫游戏程序设计 一、内容 本系统主要实现了走迷宫游戏,执行游戏的时候出现迷宫图案,每次各不相同,但是入 口均在左上角,出口在右下角,出入口各有“出”、“入”提示。人物为㊣,“█”表示墙,外围为一圈墙,空白部分为可行走的路,使用“上”、“下”、“左”、“右”键操作㊣,当遭遇“墙”时无法前进,操作“█”上下左右移动,直至走到出口,游戏胜利。当无法走出迷宫 时,按“ Esc”键即可退出游戏。 二、上机环境 操作系统: windows XP 开发工具: vc6.0 三、函数调用关系图

main 函数 creat 函数paint 函数game 函数gotoxy 函数get_key函数gotox 函数 图一:函数调用关系图 四、各函数功能说明 main 函数:主函数; create函数:随机生成迷宫; paint函数:画出迷宫; game函数:开始游戏; gotoxy 函数:在文本窗口设置光标; get_key函数:接受按键; 五、算法描述或流程图

开始 游戏界面 画长 33 宽 31 迷宫玩家继续移动人物 开始游戏 N 玩家移动人物 是否到达 口? 出N Y 是否遇 到墙?游戏成功 Y 结束人物坐标位置不变 图二:算法流程图 六、程序运行效果图

图三:游戏开始效果图

图四:到达终点效果图 七、总结 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践 能力的重要环节。大学来说掌握计算机开发技术是十分重要的。在程序设计的过程中,我遇到了不少的问题,请教过学姐或者学长,也请教了老师,最后将程序设计好了。回顾起此次 课程设计,我感慨良多,从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日 子里,我学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识,我发现 c 语言是一门有趣的课程,对它产生了很大的兴趣。并且我明白了细心真的很重要,有时候就是因为一点点的小错误,而导致程序无法调试,并且需要花较长的时间去寻找错误。细心很重要的。 两个星期前的现在,当听到老师布置给我们的题目时,我们都蒙了,这么难的题目我们怎么会啊,我们只能尽我们自己最大的努力把程序给写出来,虽然知道这一路肯定是异常的 艰苦,但豁出去了。上网查资料、去图书馆查,查相关的函数,经过两三天的努力,我把框 架弄出来了,可是还有计算难题摆在我的面前,真的是个难题,自从把框架弄好了以后就没 有进展了,眼看一个星期快过去了,我那个急啊,可是急也没有用。我坚持,终于工夫不负 有心人,大功告成了。

迷宫与栈课程设计报告范例

(此文档为word格式,下载后您可任意编辑修改!) 北京理工大学珠海学院课程设计说明书 _2014_—_2015_学年第_一_学期 题目: 迷宫与栈 学院:计算机学院 专业班级:软件工程x班 学号 x 学生姓名: XXX 指导教师:何春香 成绩: 时间: 2014年 11 月 7日

附件4: 北京理工大学珠海学院 课程设计任务书 2014 ~2015 学年第学期 学生姓名:专业班级: 指导教师:何春香工作部门:软件工程教研室一、课程设计题目 迷宫与栈问题 二、课程设计内容(含技术指标) 【问题描述】 以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【任务要求】 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出。其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如,对于下列数据的迷宫,输出一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),…。 编写递归形式的算法,求得迷宫中所有可能的通路。 以方阵形式输出迷宫及其通路。 【测试数据】 迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)

为出口。 出口 出口 三、进度安排 1.初步设计:写出初步设计思路,进行修改完善,并进行初步设计。 2.详细设计:根据确定的设计思想,进一步完善初步设计内容,按要求编写出数据结构类型定义、各算法程序、主函数。编译分析调试错误。 3.测试分析:设计几组数据进行测试分析,查找存在的设计缺陷,完善程序。 4.报告撰写:根据上面设计过程和结果,按照要求写出设计报告。 5.答辩考核验收:教师按组(人)检查验收,并提出相关问题,以便检验设计完成情况。 四、基本要求 1.在设计时,要严格按照题意要求独立进行设计,不能随意更改。若确因条件所限,必须要改变课题要求时,应在征得指导教师同意的前提下进行。 2.在设计完成后,应当场运行和答辩,由指导教师验收,只有在验收合格后才能算设计部分的结束。 3.设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。设计报告以规定格式的电子文档书写、打印

Java程序设计实验报告2(弹球游戏)[1]1

《Java语言程序设计》课程设计 实习报告 题目: 班级: 学号: 姓名: 同组人员: 指导老师:张彬

一、实验目的 1、掌握Swing图形用户界面编程以及事件处理等,掌握java绘图技术。 2、掌握多线程编程的基本原理,能使用Runnable、ExecutorService等接口进行 线程的创建、启动等工作。 3、培养独立查找资料,并解决问题的能力。 二、实验任务 1、设计并编程实现弹球游戏: 用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)。 鼠标在界面中显示为方块状,玩家需按住鼠标来回移动以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。 程序需提供计时功能,并最终显示玩家能坚持多少秒。 2、程序要求: (1)具备相应界面,并通过事件编程,实现相应的GUI组件功能。 (2)使用多线程技术,在程序窗口区域绘制小球,并以线程控制小球的移动,实现动画效果。 (3)实现鼠标与屏幕四周,以及与小球的碰撞检测。 三、开发工具与平台 1.开发工具:Eclipse默认是一个和Jbuilder类似的Java开发工具,但它不仅仅只

是Java开发工具,只要装上相应的插件,eclipse也可作为其它语言的开发工具。如C/C++插件(CDT)。 2.开发平台:JDK1.5 四、设计思路 1.界面设计 (1)制作一个简单的面板JFrame,文件保存为bollFrame.java 其中为一public的类bollFrame,其构造方法为: bollFrame(int n){ super(); setTitle("我的弹球小游戏"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();//得到电脑屏幕大小 setSize(450,450); setLocation((dimension.width-game.getWidth())/2-250, (dimension.height-game.getHeight())/2-250);//设置面板显示基中; this.n = n; myBollPanel = new bollPanel(n);//构造一个画板; add(myBollPanel);//将画板放入JFrame createMenu();//创建菜单; setJMenuBar(bar); } (2)构造画板类,文件保存为bollPanel.java 其构造函数如下: bollPanel(int n){ this.n = n; // executorThread = Executors.newCachedThreadPool();//创建线程池; mouse = new mouseThread(mxNow,myNow,groupThread,this);//启动鼠标线程; this.setIsOver(false);//游戏开始线程条件的判断; for(int i =0 ;i

大班游戏教案《走迷宫》

大班游戏教案《走迷宫》 【设计意图】 走迷宫能有效地提高幼儿的有意注意和空间智能,帮助幼儿学会整体观察、全方位思考,培养幼儿逆向思维能力及沉着冷静、敢于挑战的品质等。 我班幼儿对走迷宫有一定经验,但能力参差不齐。有的幼儿能迅速判断并选择通畅的路径走出迷宫; 有的幼儿很容易迷失方向,多次“碰壁”后才能走出迷宫; 有的幼儿急于求成,缺乏一定的耐心,等等。基于此,我们设计了这个活动,将数学学习融入走迷宫游戏中,让幼儿在轻松愉快又富有挑战的情境中,提升经验,形成策略,巩固走迷宫的方法。 【活动目标】 1. 掌握走迷宫的一般方法(从进口走向出口;遇到岔路口选路线遇到死胡同回岔路口换条路线走等),学会反向检查(即从出口走向进口)。 2. 喜欢走迷宫,体验探究成功的喜悦。 3. 通过小组合作的形式,运用自己喜欢的的方式表达表现。 4. 初步培养幼儿有礼貌的行为。 【活动准备】 1. 幼儿会认读数字l ~10,知道数序。

2. 教具:电脑课件或图片《走迷宫》一套(大鱼迷宫(图1),数字迷宫(图2),公园迷宫(图3)]。 3. 学具:第1组,“菠萝迷宫”图(图4)、盒子、笔;第2 组,“灰熊迷宫”图(图5)、盒子、笔;第3组,“到海边去”图(图6)、盒子、笔;第4 组,“去吃汉堡"图(图7)、盒子、笔;第5 组,“送 花给妈妈”图(图8)、盒子、笔。 4. 每个幼儿胸前挂一个夹子。 5. 在数学角投放多种已塑封的迷宫图,水彩笔,抹布。 【活动过程】 一、感知了解 1. 揭示课题,引发兴趣。 师(操作课件或图片):欢迎来到迷宫王国。今天,我们要在迷宫王国里玩闯关游戏。有没有信心获胜? 2. 引导幼儿了解走迷宫的方法。 (1)出示“大鱼迷宫”图。 ①感知线条迷宫的结构,了解走迷宫的方法。 师:这是什么迷宫?这个箭头表示什么?(迷宫的进口。)那个箭头又表示迷宫的什么?(出口。) 师:谁知道迷宫一般是怎么走的?(幼儿自由回答。)师幼(小结):迷宫图,拿到手,先找进口和出口,沿着进口通道走,最后顺利到出口。

《数据结构》课程设计报告-运动会分数统计 一元多项式 迷宫求解 文章编辑 纸牌游戏等

《数据结构》课程设计报告-运动会分数统计一元多项式迷宫求解文章编辑纸牌游戏等

南京林业大学 数据结构课程设计报告 专业:计算机科学与技术 课程名称:数据结构 姓名: 学号:090801126 指导老师: 时间: 2011年1月

目录要点: 一.具体内容(题目) (1) 二.需求分析(功能要求) (2) 三.概要设计(程序设计思想) (3) 四.详细设计(源代码) (6) 五.调试分析(运行结果显示及说明) (31) 六.课设总结 (34) 题目1: 运动会分数统计** 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7,5,3,2,1,取前三名的积分分别为:5,3,2,;哪些取前五名或前三名由学生自己设定。(m〈=20,n〈=20); 题目2:一元多项式** 任务:能够按照指数降序排列建立并输出多项式; 能够完成两个多项式的相加,相减,并将结果输入; 题目4:迷宫求解 任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出; 题目5:文章编辑** 功能:输入一页文字,程序可以统计出文字、数字、空格的个数。 静态存储一页文章,每行最多不超过80个字符,共N行; 题目6:Joseph环 任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有的人出列为止。设计一个程序来求出出列的顺序。 2

数据结构课程设计——迷宫问题课程设计报告

迷宫问题 ——王欣歆20080564 一.需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。二.概要设计: 存储结构: 采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。 /*八个方向的数组表示形式*/ int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}}; /*用结构体表示位置*/ struct position { int x,y; }; position stack[m*m+1]; 基本算法: 走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。 每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。 用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。 二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。 假设当前所在位置是(x,y)。沿某个方向前进一步,它可能到达的位置最多有8个。 如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定: x=x+move[i][0] y=y+move[i][1] 从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。在搜索过程中,每前进一步,在所到位置处做标记“ ” (表示这个位置在通路上),并将该位置的坐标压入栈中。 每次后退的时候,先将当前所在位置处的通路标记“ ”改 成死路标记“×”(表示这个位置曾到达过但走不通,以后 不要重复进入),然后将该位置的坐标从栈顶弹出。 678 51 432 x y o

《程序设计课程设计》实验报告材料

《程序设计》课程设计 姓名: 学号: 班级:软件工程14 班 指导教师: 成绩:

1.消除类游戏 1.1【问题描述】 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 1.2【基本要求】 现在给你一个n行m列的棋盘(1≤n,m≤30),棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。 输出数据格式: 输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。 1.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 测试数据一 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。 棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。 1.4【功能实现】 #include #include using namespace std;

int main() { int m, n, i ,j; int temp; cin >> n >> m; temp = m; m = n; n = temp; int * map = new int[m * n]; int * mark = new int[m * n]; int * tmap = map; int * tmark = mark; int dif = 0; //输入 for ( i = 0 ; i < m ; i++ ) for (j = 0; j < n; j++) cin >> *(tmap + i * n + j); for (i = 0; i < m; i++) for (j = 0; j < n; j++) { //横行 if ((tmap + 2 - map) % n != 0 || (tmap + 1 - map) % n != 0) if (*(tmap) == *(tmap + 1) && * (tmap + 1) == *(tmap + 2)) { dif = tmap - map; *(tmark + dif) = 0; *(tmark + dif + 1) = 0; *(tmark + dif + 2) = 0; } //竖列 if (tmap + 2 * n - map < m * n || tmap + n - map < m * n) if (*(tmap) == *(tmap + n) && * (tmap + n) == *(tmap + 2 * n)) { dif = tmap - map; *(tmark + dif) = 0; *(tmark + dif + n) = 0; *(tmark + dif + 2 * n) = 0; } tmap = map + (j+1) + i * n; } //输出 cout << endl; tmap = map; for (i = 0; i < m; i++)

幼儿园大班游戏:走迷宫

大班游戏:走迷宫 【设计意图】 走迷宫能有效地提高幼儿的有意注意和空间智能,帮助幼儿学会整体观察、全方位思考,培养幼儿逆向思维能力及沉着冷静、敢于挑战的品质等。 我班幼儿对走迷宫有一定经验,但能力参差不齐。有的幼儿能迅速判断并选择通畅的路径走出迷宫;有的幼儿很容易迷失方向,多次“碰壁”后才能走出迷宫;有的幼儿急于求成,缺乏一定的耐心,等等。基于此,我们设计了这个活动,将数学学习融入走迷宫游戏中,让幼儿在轻松愉快又富有挑战的情境中,提升经验,形成策略,巩固走迷宫的方法。 【活动目标】 1.掌握走迷宫的一般方法(从进口走向出口;遇到岔路口选路线;遇到死胡同回岔路口换条路线走等),学会反向检查(即从出口走向进口)。 2.喜欢走迷宫,体验探究成功的喜悦。 【活动准备】 1.幼儿会认读数字l~10,知道数序。 2.教具:电脑课件或图片《走迷宫》一套(大鱼迷宫(图1),数字迷宫(图2),公园迷宫(图3)]。 3.学具:第1组,“菠萝迷宫”图(图4)、盒子、笔;第

2组,“灰熊迷宫”图(图5)、盒子、笔;第3组,“到海边去”图(图6)、盒子、笔;第4组,“去吃汉堡"图(图7)、盒子、笔;第5组,“送花给妈妈”图(图8)、盒子、笔。 4.每个幼儿胸前挂一个夹子。 5.在数学角投放多种已塑封的迷宫图,水彩笔,抹布。 【活动过程】 一、感知了解 1.揭示课题,引发兴趣。 师(操作课件或图片):欢迎来到迷宫王国。今天,我们要在迷宫王国里玩闯关游戏。有没有信心获胜? 2.引导幼儿了解走迷宫的方法。 (1)出示“大鱼迷宫”图。 ①感知线条迷宫的结构,了解走迷宫的方法。 师:这是什么迷宫?这个箭头表示什么?(迷宫的进口。)那个箭头又表示迷宫的什么?(出口。) 师:谁知道迷宫一般是怎么走的?(幼儿自由回答。) 师幼(小结):迷宫图,拿到手,先找进口和出口,沿着进口通道走,最后顺利到出口。 ②个别幼儿尝试。 师:谁会走“大鱼迷宫”?(先请个别幼儿上来“行走”,然后师幼一起分析如何很快找到出口和进口,最后请一位幼儿用水彩笔在迷宫上画出路线。)

《数据结构课程设计》走迷宫游戏

信息工程学院 课程设计报告 课程名称《数据结构》 课题名称走迷宫游戏 专业 班级 学号 姓名 联系方式 指导教师 2015 年 12 月 27 日

目录 1、数据结构课程设计任务书............................................................... 1 1.1、题目........................................................................... 1 1.2、要求........................................................................... 1 2、总体设计............................................................................. 1 2.1、设计思路及总体组成框架......................................................... 1 2.2、操作流程图..................................................................... 2 3、详细设计............................................................................. 5 3.1、程序中所采用的数据结构及存储结构的说明......................................... 5 3.2、函数功能模块说明............................................................... 5 3.3、各函数的调用关系 ............................................................................................................................... 7 4、调试与测试:......................................................................... 7 4.1、调试方法与步骤:............................................................... 7 4.2、测试结果的分析与讨论:......................................................... 8 4.3、测试过程中遇到的主要问题及采取的解决措施:................................... 10 6、源程序清单......................................................................... 10 7、数据结构课程设计总结............................................................... 14 8、参考文献........................................................................... 14

《程序设计实训》实验报告

计算机程序设计实训报告 [“拍飞虫”实验] 专业班级:装控1405,装控1406 实习时间:2015年7月11日至7月15日 实习地点:文理楼124 成员 1: 成员 2:

一、作品概述 本作品运用funcode平台所给模板,在所给源代码的基础上进行编写,对整个游戏进行美化,更换了背景,优化了空格开始键,并且添加了拍蚊子时的音效,以及开始时的欢迎界面,每次游戏结束会对积分进行排序,如果最终得分为满分,则会显示“游戏成功”。 二、功能设计 1.游戏运行,初试界面出现‘空格开始’的提示。 2.玩家按空格开始游戏,界面上出现25只小蚊子和15只大蚊子。 3.游戏开始后,用户每拍一个小蚊子,加两分 4.被淘汰的猴子会出局,加入屏幕下方的淘汰者猴子队列中。 5.站在被淘汰猴子后方的选手依次往前移,填补空白 6.用户继续按空格淘汰猴子,值到剩下唯一的猴子,就是大王!这样,一局游戏完成。 7.一局游戏完成后,屏幕重新出现“空格开始”的标志,用户按空格可以继续游戏,如此往复。 三、功能实现 含每个功能的具体实现,可以用流程图(不要贴代码)等描述。 (说明:主要写用到的各类型的全局变量、含义) 1.g_iMonkeys[6] 用一个int类型的数组来保存猴子精灵编号 2.g_flocation[6] 用一个浮点型数组存储猴子位置(因为6只猴子站成一排,y坐标值是相同的,因此该数组保存6只猴子的x坐标值)。其中g_Monkeys[i] 对应的位置 g_fLocation 3.g_iNumMokeys 当前备选猴子数量,即截图中上层队列的猴子数。 4.g_iNumLoseMonkeys 淘汰的猴子数量,即下层队列中的猴子数。 5.g_iChooseMonkey 本轮淘汰的猴子编号。 6.g_iMoveMonkey 淘汰猴子后,后面需要移动的猴子数。

冀美版三年级美术下册教学设计 设计迷宫教案

《设计迷宫》教案 教学目标: 1、能大胆想像与创造,运用多种方法表现出一个趣味的迷宫游戏。 2、通过探索迷宫,培养学生学习的兴趣,提高学生的专注力,加强耐心和毅力,引导学生对事物整体与局部的关系进行初步认识。让学生能够排除干扰,抓住关键,解决问题。 教学重点难点: 分析迷宫的结构,寻找破解迷宫的方法。 能大胆想像与创造,运用多种方法设计趣味性的迷宫游戏。 教学过程: (一)情景导入 苦瓜大王要苦化月球,喜洋洋为了拯救月球必须找到甜甜树。下面我们来看看喜洋洋在寻找甜甜树的过程中遇到了哪些难关吧?(播放视频)原来喜洋洋的爸爸妈妈在他们的实验室外面设置了重重难关,其中第一关便是闯迷宫,喜洋洋将面对怎样的迷宫,接受哪些挑战,最后如何顺利的通过迷宫,找到甜甜树?今天将由同学们来担任这个影片的导演和制作人。 要成为这个游戏的导演,我们首先要来补习一下迷宫的相关知识吧! (二)了解迷宫的相关知识 边播放幻灯片边介绍古今中外的迷宫 后来有人仿照这种迷宫建筑创造了平面的迷宫图,就形成了走迷宫的游戏。同学们以前玩的迷宫游戏是怎样的? (三)分解迷宫图的设计方法 出示幻灯片:各种各样的迷宫设计图 平面的迷宫图主要有两种。一种是由各种长长短短、曲直不同的线条围隔而成的格局图;一种是画面不仅有曲折的路线,而且还配有相应的背景。它既是一个迷宫,也是一幅漂亮的风景画或者场景画。 1、比较各种迷宫图,说说你更喜欢哪种形式的图。 2、迷宫图的构成:通过五张不同迷宫图片的对比分析,了解好的迷宫图需要有:起点与终点;复杂的路径(通路、岔路、死路);障碍物、相关背景;主题。 3、学生讨论设计迷宫图:

(1)、构思主题,设计喜洋洋寻找甜甜树的过程中经历的迷宫会是怎样的呢? (2)、选择舞台,用画笔勾画路径单线,暂定为迷宫的唯一通道。 (3)、在单线的基础上再添画一些迷惑视线的岔路。注意道路的曲折。 (4)、在岔道上确定障碍物的位置,使之成为死路,并检查路线的确定是否合理。 (5)、添画相关景物、障碍物和背景,使画面具有一定意境和情趣。 (6)、给画面上色,注意路径的颜色与背景要有对比。 课后作业: 自己想象情景或已某图形为背景,设计绘画出有意思的迷宫,并和小伙伴们一起试着走出迷宫。

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