VB.NET实现五子棋的人工智能-1

VB.NET实现五子棋的人工智能-1,第1张

人工智能也就是所谓的AI(Artificial Intelligence) 是一门很抽象的技术 AI程序的编写不需要依据任何既定的思考模式或者规则 尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作 我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力 而我们的所有的研究也应该围绕着这一方向 主体是策略类的人工智能

策略类人工智能可以说是AI中比较复杂的一种 最常见的策略类AI游戏就是棋盘式游戏 在这类游戏中 通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况 并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数 然后再决定出一个最佳走法 下面先介绍一下五子棋的AI构想

五子棋的AI构想

有句话叫 当局者迷 旁观者清 但这句话在由AI所控制的计算机玩家上是不成立的 因为计算机必须知道有那些获胜方式 并计算出每下一步棋到棋盘上任一格子的获胜几率 也就是说 一个完整的五子棋的AI构想必须   能够知道所有的获胜组合

建立和使用获胜表

设定获胜的分数

使电脑具有攻击和防守的能力

一 求五子棋的获胜组合

在一场五子棋的游戏中 计算机必须要知道有那些的获胜组合 因此我们必须求得获胜组合的总数 我们假定当前的棋盘为 *

( )计算水平方向的获胜组合数 每一列的获胜组合是 共 列 所以水平方向的获胜组合数为 * =

( )计算垂直方向的获胜组合总数 每一行的获胜组合是 共 行 则垂直方向的获胜组合数为 * =

( )计算正对角线方向的获胜组合总数 正对角线上的获胜组合总数为

+( + + + + )* =

( )计算反对角线方向的获胜组合总数 反对角线上的获胜组合总数为   +( + + + + )* = 这样所有的获胜组合数为 + + + =

二 建立和使用获胜表

我们已经计算出了一个 * 的五子棋盘会有 种获胜方式 这样我们可以利用数组建立获胜表 获胜表的主要作用是 判断当前的获胜方式是否有效 判断当前的获胜方式中到底有多少子落入该获胜组合中 详细的使用您将在后面的程序中可以看出

三 分数的设定

在游戏中为了让计算机能够决定下一步最佳的走法 必须先计算出计算机下到棋盘上任一空格的分数 而其中最高分数便是计算机下一步的最佳走法

原理 我们判定当前讨论的空格与当前讨论的点有几种获胜的方式 有几种该空格就加几分 这种原理初听起来似乎是无法入手 没关系 当您了解我们后面的程序后您就会明白这种决策原理了

这种决策有一些缺陷 因为如果只根据这个模型设计 就有可能出现电脑或玩家有三个子连成一线的时候 计算机却判断不出 它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守 没关系我们完全可以通过一个加强算法来改变当前的分值情况 也就是说当电脑或玩家有三个子或四个子连成一线时 我们通过加强算法将当前与三个子或四个子有关的空格的分值提高 从而可以弥补这一缺憾

四 攻击与防守

以上的方式 事实上计算机只是计算出了最佳的攻击位置 为了防守我们还应计算当前玩家的最佳的攻击位置 这样有什么用呢?道理很简单 如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数 那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻 否则计算机便将棋子下在自己的最佳攻击位置上进行攻击

事实上 这个AI构想是很强大的如果你不是很厉害的五子棋高手的话 可能很快会被计算机打败 我在联众上可是中级棋手啊 跟这种构想打的时候胜率也不是很高

使用编写五子棋

一 编写前的准备

用计算机的思想描述整个下棋的过程

考虑步骤

( )为了简便我们可以先让电脑先走第一步棋 电脑每走一步就会封掉许多玩家的获胜可能情况

( )当玩家走棋的时候我们首先应该考虑玩家走棋的合法性

( )如果合法 那么玩家也会封掉许多电脑的获胜的可能情况

( )电脑的思考路径 首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值 是进行加强赋值 否则进行普通的赋值

( )比较当前玩家和电脑谁的分值最大 将分值最大的点作为电脑的下一步走法

利用窗体和图形工具建立五子棋的棋盘界面

( )添加一个picturebox控件

作用 使用picturebox控件绘制棋子和棋盘

( )添加一个label控件

作用 显示当前的获胜标志 也就是当某一方获胜或和棋时显示此标签

( )添加一个mainmenu控件

作用 控制游戏的开始或结束

( )添加一个mediaplay组件

作用 使程序可以播放音乐

设置整体框价

我们采取 * 的棋盘 为主要的平台 利用数组定义整个棋盘桌面 利用数组定义获胜组合以及获胜标志等

二 声明全局数组和变量

定义虚拟桌面

Dim table( ) As Integer定义当前玩家桌面空格的分数

Dim pscore( ) As Integer定义当前电脑桌面空格的分数

Dim cscore( ) As Integer定义玩家的获胜组合

Dim pwin( ) As Boolean定义电脑的获胜组合

Dim cwin( ) As Boolean定义玩家的获胜组合标志

Dim pflag( ) As Boolean定义电脑的获胜组合标志

Dim cflag( ) As Boolean定义游戏有效标志

lishixinzhi/Article/program/ASP/201311/21668

一个五子棋(RenjuFive-in-a-rowGobangGomoku)游戏程序大概需要以下要素:

图形界面:绘制窗体(Form)、棋盘(Board)、棋子(Piece)、赢棋(Win)输棋(Lose)和棋(Draw)提示,以及各种功能按钮(Function Button)。

走棋方式规定:黑方(Black)先走。单击棋盘上某一个十字交叉点落黑子或白子,如果某一方已成五,则不能再落子。如果该游戏支持禁手(Forbidden Move),即黑方不可以下“三三”、“四四”、“长连”,白方(White)无禁手。

(单人游戏(Single Game))电脑走棋策略:电脑计算哪种走棋方法最优。

(可选)游戏设置(Game Settings)、悔棋(Retract)、导出(ExportOutput)棋谱(Manual)、与网友下棋等。

如果能做一个像五子棋终结者那样的无敌软件,算你厉害。

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim X As String

Dim Y As String

Dim m As Integer

Dim n As Integer

Private Sub Command1_Click()

Label1.Caption = "该黑棋" &gamer1 &"走"

blackwhite = True

heibaiqi = True

Picture1.Cls

For i = 5 To -5 Step -1

Picture1.Line (-4.5, i - 0.5)-(4.5, i - 0.5)

QBColor (0)

Picture1.Line (i - 0.5, -4.5)-(i - 0.5, 4.5)

QBColor (0)

Next

For j = -4 To 4 Step -1

For k = -4 To 4 Step -1

a(j, k) = 0

Next

Next

a(j, k) = 0

Picture1.FillStyle = 0

Picture1.FillColor = QBColor(0)

Picture1.Circle (0, 0), 0.3, QBColor(0)

Picture1.Circle (1, 1), 0.3, QBColor(0)

Picture1.FillColor = QBColor(15)

Picture1.Circle (0, 1), 0.3, QBColor(15)

Picture1.Circle (1, 0), 0.3, QBColor(15)

End Sub

Private Sub Form_Load()

Form2.Picture1.Scale (-5, 5)-(5, -5)

Text1.Text = ""

End Sub

Private Sub kaishi_Click()

Label1.Caption = "该黑棋" + gamer1 + "走"

blackwhite = True

heibaiqi = True

Picture1.Cls

For i = 5 To -5 Step -1

Picture1.Line (-4.5, i - 0.5)-(4.5, i - 0.5)

QBColor (0)

Picture1.Line (i - 0.5, -4.5)-(i - 0.5, 4.5)

QBColor (0)

Next

For j = -4 To 4 Step -1

For k = -4 To 4 Step -1

a(j, k) = 0

Next

Next

a(j, k) = 0

Picture1.FillStyle = 0

Picture1.FillColor = QBColor(0)

Picture1.Circle (0, 0), 0.3, QBColor(0)

Picture1.Circle (1, 1), 0.3, QBColor(0)

Picture1.FillColor = QBColor(15)

Picture1.Circle (0, 1), 0.3, QBColor(15)

Picture1.Circle (1, 0), 0.3, QBColor(15)

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If CInt(X) >= -4 And CInt(Y) >= -4 And heibaiqi = True Then

m = CInt(X)

n = CInt(Y)

Picture1.FillStyle = 0

If blackwhite = True And a(CInt(X), CInt(Y)) = 0 Then

Picture1.FillColor = QBColor(0)

Picture1.Circle (CInt(X), CInt(Y)), 0.3, QBColor(0)

a(CInt(X), CInt(Y)) = 1

Label1.Caption = "该白棋" &gamer2 &"走"

blackwhite = Not blackwhite

End If

If blackwhite = False And a(CInt(X), CInt(Y)) = 0 Then

Picture1.FillColor = QBColor(15)

Picture1.Circle (CInt(X), CInt(Y)), 0.3, QBColor(15)

a(CInt(X), CInt(Y)) = 2

Label1.Caption = "该黑棋" &gamer1 &"走"

blackwhite = Not blackwhite

End If

End If

'反转棋子

For i = 1 To 7

For j = 0 To i - 1

If a(CInt(X), CInt(Y)) = 1 And a(CInt(X) - i, CInt(Y)) = 1 And a(CInt(X) - i + j, CInt(Y)) = 2 Then

a(CInt(X) - i + j, CInt(Y)) = 1

End If

If a(CInt(X), CInt(Y)) = 1 And a(CInt(X), CInt(Y) - i) = 1 And a(CInt(X), CInt(Y) - i + j) = 2 Then

a(CInt(X), CInt(Y) - i + j) = 1

End If

If a(CInt(X), CInt(Y)) = 2 And a(CInt(X) - i, CInt(Y)) = 2 And a(CInt(X) - i + j, CInt(Y)) = 1 Then

a(CInt(X) - i + j, CInt(Y)) = 2

End If

If a(CInt(X), CInt(Y)) = 2 And a(CInt(X), CInt(Y) - i) = 2 And a(CInt(X), CInt(Y) - i + j) = 1 Then

a(CInt(X), CInt(Y) - i + j) = 2

End If

Next

Next


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11458486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存