版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、人工智能课程设计 -五子棋 一引言31.1五子棋简介31.2五子棋的ai构想3二.开发工具可行性分析5三需求分析6四程序设计64.1程序设计特点64.2.程序总体设计7五代码分析85.1 初始化赋值系统85.2初始化获胜组合95.3重新设定玩家的获胜标志95.4处理鼠标事件105.5 获胜检查算法125.6电脑算法(1)145.7电脑算法(2)17六心得体会20七参考文献20一引言人工智能也就是所谓的ai(artificial intelligence),它是一门很抽象的技术,ai程序的编写不需要依据任何既定的思考模式或者规则。尤其是游戏中的ai可以完全依程序设计者本身的思考逻辑制作
2、。我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力,而我们的所有的研究也应该围绕着这一方向。我们今天讨论的是策略类的人工智能。 策略类人工智能可以说是ai中比较复杂的一种,最常见的策略类ai游戏就是棋盘式游戏。在这类游戏中,通常的策略类ai程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。下面我们先介绍一下五子棋的ai构想。 1.1五子棋简介下面就五子棋的背景和规则做一些简单的介绍。五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“renju”,英文称之
3、为“gobang”或“fir”(five in a row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋的规则如下:棋盘:采用同围棋盘一
4、样的15 路或19 路线的棋盘,为了减小问题的规模,本系统将采用15 路线的棋盘。下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。无子的交叉点又被称为空点。输赢判断:黑、白双方有一方的5个棋子在横、竖或斜方向上连接成一线即为该方赢。1.2五子棋的ai构想在由ai所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率。一个完整的五子棋的ai构想必须:1、能够知道所有的获胜组合2、建立和使用获胜表3、设定获胜的分数4、使电脑具有攻击和防守的能力 (一),求五子棋的获胜组合 在一场五子棋的游戏中,计算机必须要知道有那些的获胜
5、组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为10*10: 1、计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:6*10=60 2、计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:6*10=60 3、计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 4、计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 这样所有的获胜组合数为:60+60+36+36=192 (二)、建立和使用获胜表 我们
6、已经计算出了一个10*10的五子棋盘会有192种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要作用是:1、判断当前的获胜方式是否有效;2、判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 (三)、分数的设定 在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 原理:我们判定当前讨论的空格与当前讨论的点有几种获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 这种决策有一些缺陷,因为如果只根据这
7、个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 (四)、攻击与防守 以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的
8、进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 事实上,这个ai构想是很强大的如果你不是很厉害的五子棋高手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。二.开发工具可行性分析本程序采用开发工具它是visual b的简称。提到,就不能不先提一下visual basic是windows环境下的一种简单、易学的编程语言,由于其开发程序的快速、高效,深受程序员的喜爱。vb.net的特点:1、真正成为面向对象以及支持继承性的语言。2、窗体设计器支持可视化继承,并且包含了许多新的特性,比如自动改变窗体大小、资源本地化支持、数据类工具内在支持xml数据
9、。3、直接建立在.net的框架结构上,因此开发人员可以充分利用所有.net平台特性,也可以与其他的.net语言交互。4、为windows应用程序提供了xcopy部署,开发者不再需要为dll的版本问题担忧。 三需求分析 人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。今天的计算机程序已能够达到下各种方盘棋和国际象棋的锦标赛水平。但是,尚未解决包括人类棋手具有的但尚不能明确表达的能力。如国际象棋大师们洞察棋局的能力。另一个问题是涉及问题的原概念,在人工智能中叫问题表示的选择,人们常能找到某
10、种思考问题的方法,从而使求解变易而解决该问题。到目前为止,人工智能程序已能知道如何考虑它们要解决的问题,即搜索解答空间,寻找较优解答。 在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件。同时要提供人机和人人这样的功能。特别是人机部分,要考虑到不同级别的用户。电脑智能不能太低需要有一定的智能下棋功能。 人机对战:选择和电脑对弈的等级操作,同样也可以执行网络联机的悔棋等功能,只是因为是人机所以无需通过确认。四程序设计游戏中提供两种选择模式:人机对战和人人对战。在人机对战中玩家通过选择不同的等级和电脑一决高下,可以向后悔棋。在人人对战中双方通过选择一方作为服务器,通过弹出对话框设置本地
11、应用程序监听端口,而另外一方则作为客户端,通过连接服务器选项,在弹出的对话框中设置要连接的服务器的ip地址和端口号。当双方都提示连接成功后,两方才可以进行下棋。如要悔棋则需要通过对方的同意。同时还可以实现在线聊天。ai的不同等级是以不同的搜索深度确定的。4.1程序设计特点五子棋游戏程序由于规则简单操作简便等特点,自然就成为程序员对人工智能研究的首选对象。所以网络上关于这类的程序很多,但是由于主要都是采用搜索穷举技术作为解决方案,这将使得问题的规模变的很庞大如当搜索深度为3时,每走一步电脑在将最坏的情况下需要搜索的点将达225*225*225=11390625个。即使采用的剪枝技术,其某些点的响
12、应的时间也是让人无法忍受的,如开局时,因为这个时候每个点都是空的,没有可以剪枝的点,必须遍历真个盘面,所以很耗时间,大约需要30多秒的时间,这个显然是不可接受的。为了程序设计和玩家的忍受时间的需要。不得不减小深度,所以绝大部分都采用深度为2的检索,很明显深度越低系统的智力也相对的降低,需要代价的。本程序的一个主要特点是,采用了高效的优化方法,使得在相同的搜索规模中所花费的计算时间大幅度的减小。响应时间明显得到提高。即使搜索深度达到4的时候,其响应时间在绝大部分的情况下还是可以接受的。4.2.程序总体设计结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层
13、次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。1、系统模型主界面用户选择操作 调用系统功能单机模式2、结构图初级模块人机模块界面模块中级模块用户高级模块五代码分析这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。下面对该次设计中的主要代码进行做个分析:5.1 初始化赋值系统sub initplayenvironment() player.filena
14、me = ".musiczhyu01.mid" player.play() theplayflag = true /游戏有效 label1.visible = false /游戏状态标签不显示 picturebox1.refresh() /清空picturebox1的内容 yuandian(130, 130) /调用绘图函数绘制当前电脑先走的位置 dim i, j, m, n as integer
15、 for i = 0 to 9 for j = 0 to 9 table(i, j) = 0 next next /桌面初始化 for i = 0 to 191 pflag(i) = true cflag(i) = true next
16、 /获胜标志初始化 table(4, 4) = 1 /由于我们设定电脑先手,并下了4,4位所以将其值设为1 5.2初始化获胜组合 n = 0 for i = 0 to 9 for j = 0 to 5 for m = 0 to 4 pwin(j + m, i, n)
17、;= true cwin(j + m, i, n) = true next n = n + 1 next next for i = 0 to 9 for j = 0 to 5 for m = 0 to 4 pwin(i, j + m,
18、160;n) = true cwin(i, j + m, n) = true next n = n + 1 next next for i = 0 to 5 for j = 0 to 5 for m = 0 to 4
19、160;pwin(j + m, i + m, n) = true cwin(j + m, i + m, n) = true next n = n + 1 next next 5.3重新设定玩家的获胜标志由于电脑已下了4,4位所以我们需要重新设定玩家的获胜标志 for i = 0
20、0;to 5 for j = 9 to 4 step -1 for m = 0 to 4 pwin(j - m, i + m, n) = true cwin(j - m, i + m, n) = true next n = n
21、160;+ 1 next next for i = 0 to 191 if pwin(4, 4, i) = true then pflag(i) = false end if next end sub5.4处理鼠标事件 1、模块名称: themousedown 2、描述:此函数主要实行以下功能: (1)判定当前游戏标志是否有效。 (2)将实际坐
22、标转化成虚拟坐标。 (3)绘制玩家的棋子。 (4)执行检查获胜函数。 (5)执行电脑算法函数。 sub themousedown(byval x as integer, byval y as integer) if theplayflag = false then exit sub end if /检查游戏状态是否有效 dim i, j as integer dim&
23、#160;zhx, zhy as integer zhx = int(x - 10) / 30) zhy = int(y - 10) / 30) for i = 0 to 9 for j = 0 to 9 if table(zhx, zhy) > 0 then
24、0;exit sub end if next next /检查当前鼠标点击的格子是否有效 dim mycolor as color dim g as system.drawing.graphics g = picturebox1.creategraphics mycolor = color.white dim
25、 brush1 as system.drawing.brush = new solidbrush(mycolor) g.fillellipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) /绘制玩家的棋子 table(zhx, zhy) = 2
26、;for i = 0 to 191 if cwin(zhx, zhy, i) = true then cflag(i) = false end if next /重设电脑的获胜标志 checkwin() /检查当前玩家是否获胜 diannao() /调用电脑算法 end sub 5.5 获胜检查算法1、模块名称: checkwi
27、n 2、描述: 此模块执行以下功能:(1)检查是否和棋。 (2)检查电脑是否获胜。 (3)检查玩家是否获胜。 sub checkwin() dim i, j, k, m, n as integer dim ca as integer dim pa as integer dim cnormal as integer = 0 for i
28、0;= 0 to 191 if cflag(i) = false then cnormal = cnormal + 1 end if next if cnormal = 190 then label1.visible = true label1.text = "和棋,请重新开始!" picturebox1.refres
29、h() theplayflag = false exit sub end if /设定和棋规则 for i = 0 to 191 if cflag(i) = true then ca = 0 for j = 0 to 9 for k = 0 to 9 if table(j,
30、60;k) = 1 then if cwin(j, k, i) = true then ca = ca + 1 end if end if next next if ca = 5 then label1.visible = true label1.text =
31、"电脑获胜,请重新开始" picturebox1.refresh() theplayflag = false exit sub end if end if next /检查电脑是否获胜 for i = 0 to 191 if pflag(i) = true then &
32、#160; pa = 0 for j = 0 to 9 for k = 0 to 9 if table(j, k) = 2 then if pwin(j, k, i) = true then pa = pa + 1 end if
33、 end if next next if pa = 5 then label1.visible = true label1.text = "玩家获胜,请重新开始" picturebox1.refresh() theplayflag = false exit sub en end if
34、 next /检查玩家是否获胜 end sub5.6电脑算法(1)1、模块名称:diannao 2描述: 此程序主要执行以下功能: (1)初始化赋值系统。 (2)赋值加强算法。 (3)计算电脑和玩家的最佳攻击位。 (4)比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 (5)执行检查获胜函数。 sub diannao() dim i, j, k, m, n as integer dim dc as inte
35、ger dim cab as integer dim pab as integer for i = 0 to 9 for j = 0 to 9 pscore(i, j) = 0 cscore(i, j) = 0 next next /初始化赋值数组 for i = 0
36、;to 191 if cflag(i) = true then cab = 0 for j = 0 to 9 for k = 0 to 9 if table(j, k) = 1 then if cwin(j, k, i) = true
37、then cab = cab + 1 end if next next select case cab case 3 for m = 0 to 9 for n = 0 to 9 if table(m, n)&
38、#160;= 0 then if cwin(m, n, i) = true then cscore(m, n) = cscore(m, n) + 5 end if end if next next case 4 for m =
39、160;0 to 9 for n = 0 to 9 if table(m, n) = 0 then if cwin(m, n, i) = true then yuandian(m * 30 + 10, n * 30 + 10) tab
40、le(m, n) = 1 for dc = 0 to 191 if pwin(m, n, dc) = true then pflag(dc) = false checkwin() exit sub end if next end if end
41、 if next next end select end if next for i = 0 to 191 if pflag(i) = true then pab = 0 for j = 0 to 9
42、160;for k = 0 to 9 if table(j, k) = 2 then if pwin(j, k, i) = true then pab = pab + 1 end if end if next next
43、160; select case pab case 3 for m = 0 to 9 for n = 0 to 9 if table(m, n) = 0 then if pwin(m, n, i) = t
44、rue then pscore(m, n) = pscore(m, n) + 30 end if end if next next case 4 for m = 0 to 9 for n = 0 to 9 if table(m,
45、60;n) = 0 then if pwin(m, n, i) = true then yuandian(m * 30 + 10, n * 30 + 10) table(m, n) = 1 for dc = 0 to 191 if pwin(m,
46、 n, dc) = true then pflag(dc) = false checkwin() exit sub end if next end if end if next next end select end if
47、60;next 5.7电脑算法(2)1、赋值系统 for i = 0 to 191 if cflag(i) = true then for j = 0 to 9 for k = 0 to 9 if table(j, k) = 0 then if cwin(j, k, i) =
48、;true then for m = 0 to 9 for n = 0 to 9 if table(m, n) = 1 then if cwin(m, n, i) = true then cscore(j, k) = cscore(j, k) +
49、 1 end if end if next next end if end if next next end if next for i = 0 to 191 if pflag(i) = true then f
50、or j = 0 to 9 for k = 0 to 9 if table(j, k) = 0 then if pwin(j, k, i) = true then for m = 0 to 9 for n = 0&
51、#160;to 9 if table(m, n) = 2 then if pwin(m, n, i) = true then pscore(j, k) = pscore(j, k) + 1 end if end if next
52、160; next end if end if next next end if next 2、分值比较算法 dim a, b, c, d as integer dim cs as integer = 0 dim ps as integer = 0 for i = 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论