vb6.0人工只能五子棋算法.doc_第1页
vb6.0人工只能五子棋算法.doc_第2页
vb6.0人工只能五子棋算法.doc_第3页
vb6.0人工只能五子棋算法.doc_第4页
vb6.0人工只能五子棋算法.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Vb6 0 实现五子棋的人工智能算法 1 目录目录 目录目录 I 引言引言 2 第一部分第一部分 五子棋的五子棋的 AI 构想构想 3 1 1 求五子棋的获胜组合 3 1 2 建立和使用获胜表 3 1 3 分数的设定 3 1 4 攻击与防守 4 第二部分第二部分 使用使用 VB6 0 编写五子棋编写五子棋 4 2 1 编写前的准备 4 2 1 1 用计算机的思想描述整个下棋的过程 4 2 1 2 利用 vb6 0 窗体和图形工具建立五子棋的棋盘界面 5 2 1 3 设置整体框价 5 2 2 声明全局数组和变量 5 2 3 初始化游戏 6 2 4 处理鼠标事件 8 2 5 获胜检查算法 9 2 6 电脑算法 11 2 7 绘制棋子 13 Vb6 0 实现五子棋的人工智能算法 1 引言引言 五子棋游戏以其优秀的人工智能深受广大玩家的喜爱 而对于初步探究人 工智能的编程爱好者来说 编制五子棋程序因其规则简单而大受欢迎 然而它 却要求程序员对五子棋规则有相当深入的了解 程序员考虑得越周到 其五子 棋程序就越智能 五子棋游戏软件设计的主要内容是 根据五子棋的基本规则 要让电脑知 道该在哪一点下子 就要根据盘面的形势 为每一个可能落子的点分别计算其 重要程度 也就是该点的分值 然后通览全盘随机选出数值最大的一点 因为 有时候分值最大的一点可能不止一个 计算机随机选择分值最大的一点 可以 保证它在每盘棋中选择的落子点的位置有所不同 因此玩家不会用同一种棋局 反复赢计算机 人工智能也就是所谓的 AI Artificial Intelligence 它是一门很抽象的技术 AI 程序的编写不需要依据任何既定的思考模式或者规则 尤其是游戏中的 AI 可以完全依程序设计者本身的思考逻辑制作 我个人认为人工智能的核心应该 是使计算机具有自动的处理事件的能力 而我们的所有的研究也应该围绕着这 一方向 我们今天讨论的是策略类的人工智能 策略类人工智能可以说是 AI 中比较复杂的一种 最常见的策略类 AI 游戏 就是棋盘式游戏 在这类游戏中 通常的策略类 AI 程序都是使计算机判断目前 状况下所有可走的棋与可能的获胜状况 并计算当前计算机可走棋步的获胜分 数或者玩家可走棋步的获胜分数 然后再决定出一个最佳走法 下面我们先介 绍一下五子棋的 AI 构想 Vb6 0 实现五子棋的人工智能算法 1 第一部分第一部分 五子棋的五子棋的 AI 构想构想 有句话叫 当局者迷 旁观者清 但这句话在由 AI 所控制的计算机玩家 上是不成立的 因为计算机必须知道有那些获胜方式 并计算出每下一步棋到 棋盘上任一格子的获胜几率 也就是说 一个完整的五子棋的 AI 构想必须 1 能够知道所有的获胜组合 2 建立和使用获胜表 3 设定获胜的分数 4 使 电脑具有攻击和防守的能力 1 1 求五子棋的获胜组合求五子棋的获胜组合 在一场五子棋的游戏中 计算机必须要知道有那些的获胜组合 因此我们 必须求得获胜组合的总数 我们假定当前的棋盘为 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 1 2 建立和使用获胜表建立和使用获胜表 我们已经计算出了一个 10 10 的五子棋盘会有 192 种获胜方式 这样我们 可以利用数组建立获胜表 获胜表的主要作用是 1 判断当前的获胜方式是否 有效 2 判断当前的获胜方式中到底有多少子落入该获胜组合中 详细的使用 您将在后面的程序中可以看出 1 3 分数的设定分数的设定 在游戏中为了让计算机能够决定下一步最佳的走法 必须先计算出计算机 下到棋盘上任一空格的分数 而其中最高分数便是计算机下一步的最佳走法 原理 我们判定当前讨论的空格与当前讨论的点有几种获胜的方式 有几 Vb6 0 实现五子棋的人工智能算法 1 种该空格就加几分 这种原理初听起来似乎是无法入手 没关系 当您了解我 们后面的程序后您就会明白这种决策原理了 这种决策有一些缺陷 因为如果只根据这个模型设计 就有可能出现电脑 或玩家有三个子连成一线的时候 计算机却判断不出 它认为其他某些空格是 当前的获胜的最佳位置而不去攻击或防守 没关系我们完全可以通过一个加强 算法来改变当前的分值情况 也就是说当电脑或玩家有三个子或四个子连成一 线时 我们通过加强算法将当前与三个子或四个子有关的空格的分值提高 从 而可以弥补这一缺憾 1 4 攻击与防守攻击与防守 以上的方式 事实上计算机只是计算出了最佳的攻击位置 为了防守我们 还应计算当前玩家的最佳的攻击位置 这样有什么用呢 道理很简单 如果玩 家最佳攻击位置的分数大于计算机最佳攻击位置上的分数 那么计算机就将下 一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻 否则计算机便将棋子 下在自己的最佳攻击位置上进行攻击 事实上 这个 AI 构想是很强大的如果你不是很厉害的五子棋高手的话 可 能很快会被计算机打败 我在联众上可是中级棋手啊 跟这种构想打的时候胜 率也不是很高 Vb6 0 实现五子棋的人工智能算法 1 第二部分第二部分 使用使用 vb6 0 编写五子棋编写五子棋 2 1 编写前的准备编写前的准备 2 1 1 用计算机的思想描述整个下棋的过程 用计算机的思想描述整个下棋的过程 考虑步骤 1 为了简便我们可以先让电脑先走第一步棋 电脑每走一步就会封掉许 多玩家的获胜可能情况 2 当玩家走棋的时候我们首先应该考虑玩家走棋的合法性 3 如果合法 那么玩家也会封掉许多电脑的获胜的可能情况 4 电脑的思考路径 首先判断当前玩家和电脑的所有获胜组合是否需要 进行加强赋值 是进行加强赋值 否则进行普通的赋值 5 比较当前玩家和电脑谁的分值最大 将分值最大的点作为电脑的下一 步走法 2 1 2 利用利用 vb6 0 窗体和图形工具建立五子棋的棋盘界面 窗体和图形工具建立五子棋的棋盘界面 1 添加一个 picturebox 控件 作用 使用 picturebox 控件绘制棋子和棋盘 2 添加一个 label 控件 作用 显示当前的获胜标志 也就是当某一方获胜或和棋时显示此标签 3 添加一个 mainmenu 控件 作用 控制游戏的开始或结束 4 添加一个播放音乐组件 作用 使程序可以播放音乐 2 1 3 设置整体框价设置整体框价 我们采取 10 10 的棋盘 为主要的平台 利用数组定义整个棋盘桌面 利用数组定义 获胜组合以及获胜标志等 Vb6 0 实现五子棋的人工智能算法 1 2 2 声明全局数组和变量声明全局数组和变量 定义虚拟桌面 Dim table 9 9 As Integer 定义当前玩家桌面空格的分数 Dim pscore 9 9 As Integer 定义当前电脑桌面空格的分数 Dim cscore 9 9 As Integer 定义玩家的获胜组合 Dim pwin 9 9 191 As Boolean 定义电脑的获胜组合 Dim cwin 9 9 191 As Boolean 定义玩家的获胜组合标志 Dim pflag 191 As Boolean 定义电脑的获胜组合标志 Dim cflag 191 As Boolean 定义游戏有效标志 Dim theplayflag As Boolean 2 3 初始化游戏初始化游戏 模块名称 initplayenvironment 描述 此函数主要功能如下 1 设置背景音乐 2 设置游戏状态有效 3 初始化游戏状态标签 4 直接指定电脑的第一步走法 5 初始化基本得分桌面 6 电脑和玩家获胜标志初始化 7 初始化所有获胜组合 8 重新设定玩家的获胜标志 Vb6 0 实现五子棋的人工智能算法 1 Sub initplayenvironment CALL MUSICPLAY 音乐 theplayflag True 游戏有效 Label1 Visible False 游戏状态标签不显示 PictureBox1 Refresh 清空 picturebox1 的内容 yuandian 130 130 调用绘图函数绘制当前电脑先走的位置 Dim i j m n As Integer 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 获胜标志初始化 table 4 4 1 由于我们设定电脑先手 并下了 4 4 位所以将其值设为 1 初始化获胜组合 n 0 For i 0 To 9 For j 0 To 5 For m 0 To 4 pwin j m i n 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 n True cwin i j m n True Next n n 1 Next Vb6 0 实现五子棋的人工智能算法 1 Next For i 0 To 5 For j 0 To 5 For m 0 To 4 pwin j m i m n True cwin j m i m n True Next n n 1 Next Next For i 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 1 Next Next 初始化获胜组合结束 For i 0 To 191 If pwin 4 4 i True Then pflag i False End If Next 由于电脑已下了 4 4 位所以我们需要重新设定玩家的获胜标志 End Sub 2 4 处理鼠标事件处理鼠标事件 模块名称 themousedown 描述 此函数主要实行以下功能 1 判定当前游戏标志是否有效 2 将实际坐标转化成虚拟坐标 3 绘制玩家的棋子 4 执行检查获胜函数 5 执行电脑算法函数 Vb6 0 实现五子棋的人工智能算法 1 Sub themousedown ByVal x As Integer ByVal y As Integer If theplayflag False Then Exit Sub End If 检查游戏状态是否有效 Dim i j As Integer Dim 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 Exit Sub End If Next Next 检查当前鼠标点击的格子是否有效 Dim mycolor As Color Dim g As System Drawing Graphics g PictureBox1 CreateGraphics mycolor Color White Dim brush1 As System Drawing Brush New SolidBrush mycolor g FillEllipse brush1 zhx 30 10 zhy 30 10 30 30 绘制玩家的棋子 table zhx zhy 2 For i 0 To 191 If cwin zhx zhy i True Then cflag i False End If Next 重设电脑的获胜标志 checkwin 检查当前玩家是否获胜 diannao 调用电脑算法 End Sub 2 5 获胜检查算法获胜检查算法 模块名称 checkwin Vb6 0 实现五子棋的人工智能算法 1 描述 此模块执行以下功能 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 0 To 191 If cflag i False Then cnormal cnormal 1 End If Next If cnormal 190 Then Label1 Visible True Label1 Text 和棋 请重新开始 PictureBox1 Refresh 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 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 电脑获胜 请重新开始 PictureBox1 Refresh theplayflag False Exit Sub Vb6 0 实现五子棋的人工智能算法 1 End If End If Next 检查电脑是否获胜 For i 0 To 191 If pflag i True Then 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 End If Next Next If pa 5 Then Label1 Visible True Label1 Text 玩家获胜 请重新开始 PictureBox1 Refresh theplayflag False Exit Sub End If End If Next 检查玩家是否获胜 End Sub 2 6 电脑算法电脑算法 赋值系统 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 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 1 End If End If Vb6 0 实现五子棋的人工智能算法 1 Next Next End If End If Next Next End If Next For i 0 To 191 If pflag i True Then For 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 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 Next End If End If Next Next End If Next 赋值系统结束 分值比较算法 Dim a b c d As Intege Dim cs As Integer 0 Dim ps As Integer 0 For i 0 To 9 For j 0 To 9 If cscore i j cs Then cs cscore i j a i b j End If Next Next Vb6 0 实现五子棋的人工智能算法 1 For

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论