博舍

贪吃蛇实验报告(八篇) 人工智能ai算法实验报告总结

贪吃蛇实验报告(八篇)

实验报告课程名称:实验名称:设计成员:专业年级:填写时间:Windows程序设计贪吃蛇漆咏康彭哲李佩东康勇周涛高志奇2011级软件工程2012/12/24程焱桥

贪吃蛇

一所要实现贪吃蛇的功能:

1、点击“上”、“下”、“左”、“右”,蛇想相应的方向移动;每吃到一个豆子,蛇的长度增加一个,然后又生成一个食物;当蛇撞界或者吃到自己时,游戏结束并显示“GAMEOVER”;蛇每吃一个食物,右边得分就增加;

2、在右边区域显示此游戏的作者姓名;

3、去掉工具栏,将应用程序的图标和名称改变;

4、当点击游戏菜单下的“新游戏”、“游戏开始”、“游戏暂停”、“游戏继续”相关按钮时,就会执行相应的功能;

5、当点击音效菜单下的“开启声音”、“关闭声音”时,就会响起声音或者关闭声音;

6、当在难度设置菜单下设置了难度后,游戏的难度就会做相应的变化;

7、当不了解游戏规则时,单击帮助菜单下的“游戏规则说明”就会弹出一个消息框;

相关界面如下:

二贪吃蛇的设计思想:

1、界面布局的实现:采用图形工具(位图、画笔、文本文字)在单文档上

显示出来;装载应用程序图标及修改应用程序图标;修改菜单栏以及去掉工具栏并固定应用程序窗口大小,取消最大化;

2、在视类源文件定义一个蛇类和食物类的结构体变量,并初始化蛇的各项

成员变量,包括蛇出现在客户区的初始位置、长度以及蛇的行驶方向;同时也要初始化食物类:食物出现的初始位置以及食物是否被吃掉的判断;用初始化长度为3的蛇,并且默认食物为0,未出现;

3、为视类添加一个公共成员变量,用来存放分数;在视类源文件处定义一

个静态变量,用来存放时间time1;

4、给视类添加一个WM_TIMER消息,用OnTimer()函数不断更新游戏;

同时也要添加一个WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作;另外,也要添加一个WM_RBUTTONDOWN消息,此消息只是为了获取客户区相应位置的位置,用于显示文字而用;

…………余下全文

传教士与野人过河问题 人工智能 实验报告

实验目的理解并熟悉掌握深度优先搜索算法。将所学人工智能理论知识综合运用到具体项目当中。问题描述

有N个传教士和N个野人来到河边渡河,河岸有一条船,每次至多可供k人乘渡。问:传教士为了安全起见,应如何规划摆渡方案,使得任何时刻,河两岸以及船上的野人数目总是不超过传教士的数目(否则不安全,传教士有可能被野人吃掉)。即求解传教士和野人从左岸全部摆渡到右岸的过程中,任何时刻满足M(传教土数)≥C野人数)和M+C≤k的摆渡方案。

算法分析

      假设以传教士和野人的数量N为3,船一次最大的载人量K为2分析。

初始状态:河左岸有3个野人河3个传教士;河右岸有0个野人和0个传教士;船停在左岸,船上有0个人。

目标状态:河左岸有0个野人和0个传教士;河右岸有3个野人和3个传教士;船停在右岸,船上有0个人。

将整个问题抽象成怎样从初始状态经一系列的中间状态从而达到目标状态,状态的改变是通过划船渡河来引发的。

根据要求,共得出以下5中可能的渡河方案:

(1)渡2传教士

(2)渡2野人

(3)渡1野人1传教士

(4)渡1传教士

(5)渡1野人

本程序使用类来定义状态结点,使用集合存储状态结点,使用递归(深度优先查询)的思想来寻找目标状态。

实验内容程序执行流程

首先,包含状态(首次为初始状态)的结构体结点(已存入结构体数组)传入处理函数,然后判断该传入结点状态是否为目标状态。

是则遍历打印结构体数组,打印完成之后,返回递归调用处,顺序执行之后代码(此步骤关系到是否能找到所有过河路径);

否则继续判断是否该传入结点已存在于结构体数组当中,如存在,不再往下执行,返回递归调用处,顺序执行之后代码;

若不存在,则继续判断该传入状态的人数是否合理(是否出现人物数量小于0的情况等),若不合理,返回递归调用处,顺序执行之后代码;

若合理,则继续判断传教士和野人人数限制条件,即在传教士人数不为0的情况下,野人人数是否大于传教士人数,若大于则出现吃人的情况,也就是说该传入状态也不合理,则返回递归调用处,顺序执行之后代码;

若不满足大于条件,则说明该状态是路径转态,也就是合理的,那么进行五种渡河方案的依次变换,首先为第一种渡河方案,两个传教士过河(注意:此处的5中渡河方案没有固定顺序,也可以是其他渡河方案),那么对该传入状态的左岸和右岸的传教士人数和野人人数进行增减(若为左岸到右岸,则左岸人数减,右岸人数加,此处有一个小技巧见本段末尾)。

增减完成并改变船的状态(使用正负一表示,正一为左岸,负一为右岸)以后就产生了一个新的状态,将该状态存入结构体数组,之后此处又递归调用处理函数,将新产生的转态结点传入,再次进行上述条件限制判断。

若在该判断途中被返回至递归调用处,说明该状态不合理,则此时将已经存入结构体数组的状态结点移出结构体数组,然后程序顺序执行,进行下一个渡河方案的处理,也就是说,此时的处理是对上一个传入结点的操作(因为刚传入的已经移出了);

若在判断途中未被返回至递归调用处,也就是说,传入的结点合理了,那么又开始从第一种渡河方案开始对该传入状态进行操作。

按照上述过程循环执行,直到出现目标状态,回到本段开头,遍历结构体数组,打印渡河路径结点信息。

完成以后,返回递归调用处,顺序执行之后代码,此后的操作是在寻找其他渡河路径。

原理为:由于该处理函数末尾存在return语句(关键),所以在找到目标状态并返回之后,目标转态结点同样会被移出结构体数组,然后在其上一个结点开始顺序往下执行操作之后的一种渡河方案,查看是否在该结点处,还有其他渡河方案可以达到目标状态,若有则同样按上述方法执行(打印输出),若执行完后面的所有渡河方案,发现都没有能够达到目标状态的结点,则会执行末尾的返回语句,返回之后,该状态结点也会被移除(关键),那么此时操作的状态结点就是上上个结点状态,对其进行其后的渡河方案操作。按照此法,不断往后退,直到所有结点都被移除,此时说明已经完成所有渡河路径的搜索(深度)。至此,本程序的执行过程叙述完毕。

小技巧:从左岸到右岸,和从右岸到左岸的状态变化是不一样的,前者左岸的人数减,右岸的人数加;后者左岸的人数加,右岸的人数减。我们不应单独再写程序来处理,而是应该使用船的转态带入计算来处理,注意,此技巧在于船的转态使用正负一来表示,而不应该是1和0,以及其他表示方法。为什么这么说?因为任何数乘以一,其本身都不会改变(有我也不会承认)。而正负号在此起到关键作用,我们使用正负一去乘以五种渡河方案的改变数值,从而得到的就是我们变换的正确结果,不论左岸右岸,都是正确合理的。

原理推导

上述原理完全是按照传教士和野人数量为3人,船一次的载客量最大为2为前提所得。结合上述分析不难看出,当尚未规定传教士和野人具体数量以及船一次最大载客量为多少时,与之前分析的差别仅仅在于根据人数不同,从河一端到另一端一共有多少中载客方式,其他的原理流程与传教士和野人数量为3人,船一次的载客量最大为2的流程全部相同。

关键代码

主要用来判断这条方案是否可行。

//是否重复操作for(inti=0;i

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇