當前位置:首頁 » 操作系統 » 五子棋ai演算法

五子棋ai演算法

發布時間: 2022-04-29 00:15:27

㈠ 求 用於五子棋AI的 α—β 剪枝搜索演算法

int ab(int n,int a,int b)
{
int temp;
if(n<=0)
return (評價函數); /*評價函數*/
for(每一個走法)
{
(產生節點函數);
temp=-ab(n-1,-b,-a);
(撤消產生的節點函數);
if(temp>a)
a=temp;(此處可保留搜索的最佳位置)
if(a>b)
break;
}
return a;
}

㈡ 求vc簡單的五子棋AI演算法

我有個簡單的思路:

先定義一條線上棋子的各種布局,比如初步定義長度為五個子
◎◎◎◎●
◎◎●◎×
◎●◎××
◎×◎×◎
等等。白圈是自己的子,黑圈是對方的子,叉子是未走的格子。
程序里有個布局表,再定義各個布局的分數,比如連五最99分,連三30分等等。

當機器走時,在空格放入一子,然後掃描每條直線,匹配布局,然後累計得分。
逐個放子,得分最高的那個位置,作為下一步的走法。

不斷調整得分表,可以提高程序勝率。

大概是這個意思。拋磚引玉。

㈢ 有誰知道五子棋比較NB的人工智慧演算法,用VB實現,,急求!!!!

'在窗體上加入以下控制項
'image1(0),image1(0) - 黑白棋圖片
'image2,image3(0)
'form中的picture圖片為棋盤。因無法上傳,請自行領會。

Option Explicit
Dim I, J, K, Counter, Firstmoved, Rt, Gen, r, flag As Integer
Dim Grid(225), H(224), V(224), RL(224), LR(224), Tb(2), Order(225) As Integer

Private Sub Form_Initialize()
lblHelp.Top = 0
lblHelp.Left = 0
Image1(0).Top = -1000
Image1(1).Top = -1000
lblHelp.Left = -lblHelp.Width

lblHelp = vbCrLf + vbCrLf + " 游戲幫助" + vbCrLf _
+ vbCrLf + vbCrLf + "●游戲規則:黑方先行,輪流弈子,任一方向先連成五子者勝." _
+ vbCrLf + vbCrLf + vbCrLf + "●操作提示:①可選擇[先後]、[難度]和[對手]菜單設置游戲," _
+ vbCrLf + vbCrLf + " 只有按[游戲]->[開始]後才可在棋盤上落子." _
+ vbCrLf + vbCrLf + " ②按[游戲]->[清盤]可重玩並設置游戲." _
+ vbCrLf + vbCrLf + " ③落子後按[動作]菜單下的選擇可任意悔棋和恢復." _
+ vbCrLf + vbCrLf + " ④各功能菜單都提供了快捷鍵(Alt+相應字母)." _
+ vbCrLf + vbCrLf + vbCrLf + "●有什麼問題請與本人聯系.電子郵件:[email protected]." _
+ vbCrLf + vbCrLf + vbCrLf + "●本頁面單擊後隱藏."
End Sub

Private Sub Form_Resize()
Me.Height = 5800
Me.Width = 5100
End Sub

Private Sub lblHelp_Click()
lblHelp.Visible = False
End Sub

Private Sub mnuAfter_Click()
Firstmoved = 0
mnuAfter.Checked = True
mnuFirst.Checked = False
End Sub

Private Sub Form_Load()
Dim I As Integer
For I = 1 To 224
Load Image3(I) '載入棋子控制項
Image3(I).Top = (I \ 15) * 22 + 5
Image3(I).Left = (I Mod 15) * 22 + 5
Image3(I).Visible = True
Next
Ini
End Sub

'游戲初始化
Sub Ini()
For I = 0 To 224
Image3(I) = Image2
Image3(I).Enabled = False
Grid(I) = 0
V(I) = 0
H(I) = 0
LR(I) = 0
RL(I) = 0
Next I
mnuBack.Enabled = False
Counter = 0
Gen = 0
If mnuAfter.Checked = True Then
Firstmoved = 0
Else
Firstmoved = 1
End If
mnuStart.Enabled = True
End Sub

'一方是否可獲勝
Function LineWin(Piece As Integer) As Integer
Dim mun As Integer
LineWin = 225
'五子一線
mun = Piece * 5
For I = 0 To 224
If H(I) = mun Or V(I) = mun Or RL(I) = mun Or LR(I) = mun Then
LineWin = 225 + Piece
Exit Function
End If
Next I

'四子一線
mun = Piece * 4
For I = 0 To 224
If H(I) = mun Then
For K = 0 To 4
If Grid(I + K) = 0 Then LineWin = I + K: Exit Function
Next K
End If

If V(I) = mun Then
For K = 0 To 4
If Grid(I + K * 15) = 0 Then LineWin = I + K * 15: Exit Function
Next K
End If

If RL(I) = mun Then
For K = 0 To 4
If Grid(I + K * 14) = 0 Then LineWin = I + K * 14: Exit Function
Next K
End If

If LR(I) = mun Then
For K = 0 To 4
If Grid(I + K * 16) = 0 Then LineWin = I + K * 16: Exit Function
Next K
End If
Next I
End Function

'計算機走棋
Sub ComputerMove()
Dim ToMove As Integer
If Counter = 0 Then
Randomize
I = Int(Rnd * 7 + 4)
J = Int(Rnd * 7 + 4)
If Grid(I * 15 + J) = 0 Then ToMove = I * 15 + J
Else
If mnuLower.Checked = True Then ToMove = Defend Else ToMove = Attempt
End If
Counter = Counter + 1
If Firstmoved = 0 Then Image3(ToMove) = Image1(0) Else Image3(ToMove) = Image1(1)
Grid(ToMove) = 2
Order(Counter) = ToMove
LineGen ToMove, 6
If LineWin(6) = 231 Then
MsgBox "您輸了!"
Ini
Exit Sub
End If
If Counter = 225 Then
MsgBox "和棋"
Ini
Exit Sub
End If
End Sub

'低級模式
Function Defend() As Integer
Rt = LineWin(6)
If Rt < 225 Then Defend = Rt: Exit Function
Rt = LineWin(1)
If Rt < 225 Then Defend = Rt: Exit Function
'查找落子位置
Rt = FindBlank
If Rt < 225 Then Defend = Rt: Exit Function
End Function

'悔棋
Private Sub mnuBack_Click()
mnuComeback.Enabled = True
If (Counter + Firstmoved) Mod 2 = 0 Then Rt = -1 Else Rt = -6
Grid(Order(Counter)) = 0
Image3(Order(Counter)) = Image2
LineGen Order(Counter), Rt
Counter = Counter - 1
If mnuComputer.Checked = True Then
Grid(Order(Counter)) = 0
Image3(Order(Counter)) = Image2
LineGen Order(Counter), -1
Counter = Counter - 1
Else
flag = 1 - flag
End If
r = r + 1
If Counter = 1 And Firstmoved = 0 And mnuComputer.Checked = True Then mnuBack.Enabled = False
If Counter = 0 Then mnuBack.Enabled = False
End Sub

'恢復棋子
Private Sub mnuComeback_Click()
mnuBack.Enabled = True
Counter = Counter + 1
If (Counter + Firstmoved) Mod 2 = 0 Then
Grid(Order(Counter)) = 1
Image3(Order(Counter)) = Image1(1 - Firstmoved)
LineGen Order(Counter), 1
Else
Grid(Order(Counter)) = 2
Image3(Order(Counter)) = Image1(Firstmoved)
LineGen Order(Counter), 6
End If
If mnuComputer.Checked = True Then
Counter = Counter + 1
Grid(Order(Counter)) = 2
Image3(Order(Counter)) = Image1(Firstmoved)
LineGen Order(Counter), 6
Else
flag = 1 - flag
End If
r = r - 1
If r = 0 Then mnuComeback.Enabled = False
End Sub

Private Sub mnuComputer_Click() '對手
mnuComputer.Checked = True '電腦
mnuHuman.Checked = False '棋手
End Sub

Private Sub mnuClear_Click() '清盤
Ini
mnuFirst.Enabled = True
mnuAfter.Enabled = True
mnuLower.Enabled = True
mnuHigher.Enabled = True
mnuComputer.Enabled = True
mnuHuman.Enabled = True
End Sub

Private Sub mnuHuman_Click()
mnuHuman.Checked = True
mnuComputer.Checked = False
End Sub

Private Sub mnuStart_Click() '開始
lblHelp.Visible = False
For I = 0 To 224
Image3(I).Enabled = True
Next I
mnuFirst.Enabled = False
mnuAfter.Enabled = False
mnuLower.Enabled = False
mnuHigher.Enabled = False
mnuComputer.Enabled = False
mnuHuman.Enabled = False
If Firstmoved = 0 And mnuComputer.Checked = True Then ComputerMove
If Firstmoved = 0 And mnuHuman.Checked = True Then flag = 1 Else flag = 0
mnuStart.Enabled = False
End Sub

'玩家走棋
Private Sub image3_Click(Index As Integer)
If Grid(Index) <> 0 Then Exit Sub
Counter = Counter + 1
If Firstmoved = 0 Then
Image3(Index) = Image1(1 - flag)
Else
Image3(Index) = Image1(flag)
End If
Grid(Index) = 1 + flag
Order(Counter) = Index
mnuBack.Enabled = True
mnuComeback.Enabled = False
r = 0
LineGen Index, (1 + flag * 5)
If LineWin(1 + flag * 5) = 226 + flag * 5 Then
If flag = 0 Then MsgBox "您贏了!" Else MsgBox "您輸了!"
Ini
Exit Sub
End If
If Counter = 225 Then
MsgBox "和棋"
Ini
Exit Sub
End If

If mnuComputer.Checked = True Then ComputerMove Else flag = 1 - flag
End Sub

'查找可以落子的空位
Function FindBlank() As Integer
Dim wz, fs, lz, RndNum As Integer
fs = -10000
For wz = 0 To 224
If Grid(wz) = 0 Then
Grid(wz) = 2
LineGen wz, 6
Rt = Gen
If Rt > fs Then fs = Rt: lz = wz
Grid(wz) = 0
LineGen wz, -6
End If
Next wz
FindBlank = lz
End Function

'高級模式
Function Attempt() As Integer
Dim wz As Integer
Rt = LineWin(6)
If Rt < 225 Then Attempt = Rt: Exit Function
Rt = LineWin(1)
If Rt < 225 Then Attempt = Rt: Exit Function
'查找落子位置
Rt = linethree(6)
If Rt < 225 Then Attempt = Rt: Exit Function

Rt = linethree(1)
If Rt < 225 Then
Grid(Tb(0)) = 2
LineGen Tb(0), 6
Rt = Gen: wz = Tb(0)
Grid(Tb(0)) = 0
LineGen Tb(0), -6
Grid(Tb(1)) = 2
LineGen Tb(1), 6
If Rt < Gen Then Rt = Gen: wz = Tb(1)
Grid(Tb(1)) = 0
LineGen Tb(1), -6
Grid(Tb(2)) = 2
LineGen Tb(2), 6
If Rt < Gen Then Rt = Gen: wz = Tb(2)
Grid(Tb(2)) = 0
LineGen Tb(2), -6
Attempt = wz
Exit Function
End If

Rt = FindBlank
If Rt < 225 Then Attempt = Rt: Exit Function
End Function

Private Sub mnuFirst_Click() '先後手
Firstmoved = 1
mnuAfter.Checked = False
mnuFirst.Checked = True
End Sub

Private Sub mnuHigher_Click()
mnuLower.Checked = False
mnuHigher.Checked = True
End Sub

Private Sub mnuLower_Click() '難度
mnuLower.Checked = True
mnuHigher.Checked = False
End Sub

'局勢評估
Function LineGen(ij, Piece)
Dim b, e, mun As Integer
I = ij \ 15
J = ij Mod 15
'橫線影響
b = IIf(J - 4 > 0, J - 4, 0)
e = IIf(J > 10, 10, J)
For K = b To e
mun = H(I * 15 + K)
If mun < 6 Then Gen = Gen + mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen - mun * 2 ^ mun
H(I * 15 + K) = H(I * 15 + K) + Piece
mun = H(I * 15 + K)
If mun < 6 Then Gen = Gen - mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen + mun * 2 ^ mun
Next K

'豎線影響
b = IIf(I - 4 > 0, I - 4, 0)
e = IIf(I > 10, 10, I)
For K = b To e
mun = V(K * 15 + J)
If mun < 6 Then Gen = Gen + mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen - mun * 2 ^ mun
V(K * 15 + J) = V(K * 15 + J) + Piece
mun = V(K * 15 + J)
If mun < 6 Then Gen = Gen - mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen + mun * 2 ^ mun
Next K

'撇線影響
b = IIf(I - 4 > 0, I - 4, 0)
e = IIf(I > 10, 10, I)
b = IIf(b > J + I - IIf(J + 4 > 14, 14, J + 4), b, J + I - IIf(J + 4 > 14, 14, J + 4))
e = IIf(e > J + I - IIf(J > 4, J, 4), J + I - IIf(J > 4, J, 4), e)
For K = b To e
mun = RL(K * 15 + I + J - K)
If mun < 6 Then Gen = Gen + mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen - mun * 2 ^ mun
RL(K * 15 + I + J - K) = RL(K * 15 + I + J - K) + Piece
mun = RL(K * 15 + I + J - K)
If mun < 6 Then Gen = Gen - mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen + mun * 2 ^ mun
Next K

'捺線影響
b = IIf(I - 4 > 0, I - 4, 0)
e = IIf(I > 10, 10, I)
b = IIf(b > I - J + IIf(J - 4 > 0, J - 4, 0), b, I - J + IIf(J - 4 > 0, J - 4, 0))
e = IIf(e > I - J + IIf(J > 10, 10, J), I - J + IIf(J > 10, 10, J), e)
For K = b To e
mun = LR(K * 15 - I + J + K)
If mun < 6 Then Gen = Gen + mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen - mun * 2 ^ mun
LR(K * 15 - I + J + K) = LR(K * 15 - I + J + K) + Piece
mun = LR(K * 15 - I + J + K)
If mun < 6 Then Gen = Gen - mun * 2 ^ mun
If mun > 5 And mun Mod 6 = 0 Then mun = mun \ 6 - 1: Gen = Gen + mun * 2 ^ mun
Next K
End Function

'是否存在三子一線(可發展成五子聯線)
Function linethree(Piece As Integer) As Integer
Dim mun As Integer
linethree = 225
'三子一線
mun = Piece * 3
For I = 0 To 224
If H(I) = mun Then
If Grid(I) = 0 Then
If I Mod 15 < 10 Then
If Grid(I + 5) = 0 Then
For K = 1 To 4
If Grid(I + K) = 0 Then
Tb(0) = I + K
Tb(1) = I
Tb(2) = I + 5
linethree = Tb(0)
Exit Function
End If
Next K
End If
End If
End If
End If

If V(I) = mun Then
If Grid(I) = 0 Then
If (I \ 15) < 10 Then
If Grid(I + 75) = 0 Then
For K = 1 To 4
If Grid(I + K * 15) = 0 Then
Tb(0) = I + K * 15
Tb(1) = I
Tb(2) = I + 75
linethree = Tb(0)
Exit Function
End If
Next K
End If
End If
End If
End If

If RL(I) = mun Then
If Grid(I) = 0 Then
If (I \ 15) < 10 And I Mod 15 > 4 Then
If Grid(I + 70) = 0 Then
For K = 1 To 4
If Grid(I + K * 14) = 0 Then
Tb(0) = I + K * 14
Tb(1) = I
Tb(2) = I + 70
linethree = Tb(0)
Exit Function
End If
Next K
End If
End If
End If
End If

If LR(I) = mun Then
If Grid(I) = 0 Then
If (I \ 15) < 10 And I Mod 15 < 10 Then
If Grid(I + 80) = 0 Then
For K = 1 To 4
If Grid(I + K * 16) = 0 Then
Tb(0) = I + K * 16
Tb(1) = I
Tb(2) = I + 80
linethree = Tb(0)
Exit Function
End If
Next K
End If
End If
End If
End If
Next I
End Function

Private Sub munHelp_Click() '幫助
lblHelp.Visible = True
End Sub

㈣ 求五子棋的人工智慧的演算法描述~~~

可以採用這樣的笨演算法,運行起來慢點,但是很簡單易懂,而且效果很好。如果能夠加以優化,則其實是很好的演算法:

1、首先遍歷整個棋盤,找到一個可以落子的點,然後假設自己在該點落子,再然後判斷如果棋子落到這個點上後會對自己有什麼利益,比如會不會形成沖4活三、雙活三等等,(事先將沖四活三、雙活三等效果定義上利益值,當然,如果是五個子連起來了的話,利益值要被定義成最高,最好是無窮大的),將各種效果的利益值相加,得到己方的利益值。
2、將角色互換一下,重復第一步,得到對方的利益值(其實是遞桂演算法)。
3、將己方的利益值減去對方的利益值,得到該點的總利益值。
4、整個棋盤所有能落子的點都計算出利益值之後,找出利益值最大的那個點,將棋子落到該點。

當然,這個演算法可以有很大程度的優化,比如,如果沒有相鄰的棋子,可以放棄該點。還有一旦找出可以勝利的點,就不再繼續往下計算。。。。

模擬演算法:
int liyi(角色, 層次)
{
if(層次=0)
return 0;

for(第一個可以落子的點 到 最後一個可以落子的點)
{
int 利益,最大利益;

//遞桂...
利益 = 獲取本角色利益值() - liyi(角色=相反角色,層次-1);

if(利益>最大利益)
{
最大利益 = 利益;
保存該點。
}
落子到所保存的點。
}

㈤ 我想了解一下五子棋AI A*演算法,可是怎麼都看不明白啊~誰能詳細講講啊

/*源程序太多了,要的話給油箱*/
#DEFINE NROW 15
tmpzth="" && 行狀態
tmpztl="" && 列狀態
for i=1 to NROW
for j=1 to NROW
tmpzth=tmpzth+Azt(i,j)
tmpztl=tmpztl+Azt(j,i)
endfor
&& 行判斷
do case
********** y 連 5 ***********
case "nyyyy" $ tmpzth
thisform.plc_h(i,j,at("nyyyy",tmpzth),0 ,1) && 1 的得出方法 :at("n","nyyyy")
case "ynyyy" $ tmpzth
thisform.plc_h(i,j,at("ynyyy",tmpzth),1 ,1)
case "yynyy" $ tmpzth
thisform.plc_h(i,j,at("yynyy",tmpzth),2 ,1)
case "yyyny" $ tmpzth
thisform.plc_h(i,j,at("yyyny",tmpzth),3 ,1)
case "yyyyn" $ tmpzth
thisform.plc_h(i,j,at("yyyyn",tmpzth),4 ,1)
********** b 連 5 **********
case "nbbbb" $ tmpzth
thisform.plc_h(i,j,at("nbbbb",tmpzth),0 ,2)
case "bnbbb" $ tmpzth
thisform.plc_h(i,j,at("bnbbb",tmpzth),1 ,2)
case "bbnbb" $ tmpzth
thisform.plc_h(i,j,at("bbnbb",tmpzth),2 ,2)
case "bbbnb" $ tmpzth
thisform.plc_h(i,j,at("bbbnb",tmpzth),3 ,2)
case "bbbbn" $ tmpzth
thisform.plc_h(i,j,at("bbbbn",tmpzth),4 ,2)
********** y 沖 4 ***********
case "nynyyn" $ tmpzth
thisform.plc_h(i,j,at("nynyyn",tmpzth),2 ,3)
case "nyynyn" $ tmpzth
thisform.plc_h(i,j,at("nyynyn",tmpzth),3 ,3)
case "nyyynn" $ tmpzth
thisform.plc_h(i,j,at("nyyynn",tmpzth),4 ,3)
case "nnyyyn" $ tmpzth
thisform.plc_h(i,j,at("nnyyyn",tmpzth),1 ,3)
********* b 沖 4 ************
case "nbnbbn" $ tmpzth
thisform.plc_h(i,j,at("nbnbbn",tmpzth),2 ,5)
case "nbbnbn" $ tmpzth
thisform.plc_h(i,j,at("nbbnbn",tmpzth),3 ,5)
case "nbbbnn" $ tmpzth
thisform.plc_h(i,j,at("nbbbnn",tmpzth),4 ,5)
case "nnbbbn" $ tmpzth
thisform.plc_h(i,j,at("nnbbbn",tmpzth),1 ,5)
********** y 連 4 ***********
case "nnyyyb" $ tmpzth
thisform.plc_h(i,j,at("nnyyyb",tmpzth),1 ,4)
case "nynyyb" $ tmpzth
thisform.plc_h(i,j,at("nynyyb",tmpzth),2 ,4)
case "nyynyb" $ tmpzth
thisform.plc_h(i,j,at("nyynyb",tmpzth),3 ,4)
case "nyyynb" $ tmpzth
thisform.plc_h(i,j,at("nyyynb",tmpzth),1 ,4)
case "byyynn" $ tmpzth
thisform.plc_h(i,j,at("byyynn",tmpzth),4 ,4)
case "byynyn" $ tmpzth
thisform.plc_h(i,j,at("byynyn",tmpzth),3 ,4)
case "bynyyn" $ tmpzth
thisform.plc_h(i,j,at("bynyyn",tmpzth),2 ,4)
case "bnyyyn" $ tmpzth
thisform.plc_h(i,j,at("bnyyyn",tmpzth),1 ,4)
********** b 連 4 ***********
case "nnbbby" $ tmpzth
thisform.plc_h(i,j,at("nnbbby",tmpzth),1 ,9)
case "nbnbby" $ tmpzth
thisform.plc_h(i,j,at("nbnbby",tmpzth),2 ,9)
case "nbbnby" $ tmpzth
thisform.plc_h(i,j,at("nbbnby",tmpzth),3 ,9)
case "nbbbny" $ tmpzth
thisform.plc_h(i,j,at("nbbbny",tmpzth),1 ,9)
case "ybbbnn" $ tmpzth
thisform.plc_h(i,j,at("ybbbnn",tmpzth),4 ,9)
case "ybbnbn" $ tmpzth
thisform.plc_h(i,j,at("ybbnbn",tmpzth),3 ,9)
case "ybnbbn" $ tmpzth
thisform.plc_h(i,j,at("ybnbbn",tmpzth),2 ,9)
case "ynbbbn" $ tmpzth
thisform.plc_h(i,j,at("ynbbbn",tmpzth),1 ,9)
********** y 沖 3 ***********
case "nynynn" $ tmpzth
thisform.plc_h(i,j,at("nynynn",tmpzth),2 ,6)
case "nnyynn" $ tmpzth
thisform.plc_h(i,j,at("nnyynn",tmpzth),4 ,6)
********* b 沖 3 ************
case "nbnbnn" $ tmpzth
thisform.plc_h(i,j,at("nbnbnn",tmpzth),2 ,8)
case "nnbbnn" $ tmpzth
thisform.plc_h(i,j,at("nnbbnn",tmpzth),4 ,8)
********** 1個 ***********
case "nnynnn" $ tmpzth
thisform.plc_h(i,j,at("nnynnn",tmpzth),3, 7)
case "nnnynn" $ tmpzth
thisform.plc_h(i,j,at("nnnynn",tmpzth),2 ,7)
case "nnbnnn" $ tmpzth
thisform.plc_h(i,j,at("nnbnnn",tmpzth),3 ,10)
case "nnnbnn" $ tmpzth
thisform.plc_h(i,j,at("nnnbnn",tmpzth),2 ,10)
endcase

&& 列判斷
do case
********** 5個 ***********
case "nyyyy" $ tmpztl
thisform.plc_l(i,j,at("nyyyy",tmpztl),0 ,1) && 1 的得出方法 :at("n","nyyyy")
case "ynyyy" $ tmpztl
thisform.plc_l(i,j,at("ynyyy",tmpztl),1 ,1)
case "yynyy" $ tmpztl
thisform.plc_l(i,j,at("yynyy",tmpztl),2 ,1)
case "yyyny" $ tmpztl
thisform.plc_l(i,j,at("yyyny",tmpztl),3 ,1)
case "yyyyn" $ tmpztl
thisform.plc_l(i,j,at("yyyyn",tmpztl),4 ,1)
case "nbbbb" $ tmpztl
thisform.plc_l(i,j,at("nbbbb",tmpztl),0 ,2)
case "bnbbb" $ tmpztl
thisform.plc_l(i,j,at("bnbbb",tmpztl),1 ,2)
case "bbnbb" $ tmpztl
thisform.plc_l(i,j,at("bbnbb",tmpztl),2 ,2)
case "bbbnb" $ tmpztl
thisform.plc_l(i,j,at("bbbnb",tmpztl),3 ,2)
case "bbbbn" $ tmpztl
thisform.plc_l(i,j,at("bbbbn",tmpztl),4 ,2)
********** 4個 ***********
case "nynyyn" $ tmpztl
thisform.plc_l(i,j,at("nynyyn",tmpztl),2 ,3)
case "nyynyn" $ tmpztl
thisform.plc_l(i,j,at("nyynyn",tmpztl),3 ,3)
case "nyyynn" $ tmpztl
thisform.plc_l(i,j,at("nyyynn",tmpztl),4 ,3)
case "nnyyyn" $ tmpztl
thisform.plc_l(i,j,at("nnyyyn",tmpztl),1 ,3)
case "nbnbbn" $ tmpztl
thisform.plc_l(i,j,at("nbnbbn",tmpztl),2 ,5)
case "nbbnbn" $ tmpztl
thisform.plc_l(i,j,at("nbbnbn",tmpztl),3 ,5)
case "nbbbnn" $ tmpztl
thisform.plc_l(i,j,at("nbbbnn",tmpztl),4 ,5)
case "nnbbbn" $ tmpztl
thisform.plc_l(i,j,at("nnbbbn",tmpztl),1 ,5)
********** 3個 ***********
case "nnyyyb" $ tmpztl
thisform.plc_l(i,j,at("nnyyyb",tmpztl),1 ,4)
case "nynyyb" $ tmpztl
thisform.plc_l(i,j,at("nynyyb",tmpztl),2 ,4)
case "nyynyb" $ tmpztl
thisform.plc_l(i,j,at("nyynyb",tmpztl),3 ,4)
case "nyyynb" $ tmpztl
thisform.plc_l(i,j,at("nyyynb",tmpztl),1 ,4)
case "byyynn" $ tmpztl
thisform.plc_l(i,j,at("byyynn",tmpztl),4 ,4)
case "byynyn" $ tmpztl
thisform.plc_l(i,j,at("byynyn",tmpztl),3 ,4)
case "bynyyn" $ tmpztl
thisform.plc_l(i,j,at("bynyyn",tmpztl),2 ,4)
case "bnyyyn" $ tmpztl
thisform.plc_l(i,j,at("bnyyyn",tmpztl),1 ,4)
case "nnbbby" $ tmpztl
thisform.plc_l(i,j,at("nnbbby",tmpztl),1 ,9)
case "nbnbby" $ tmpztl
thisform.plc_l(i,j,at("nbnbby",tmpztl),2 ,9)
case "nbbnby" $ tmpztl
thisform.plc_l(i,j,at("nbbnby",tmpztl),3 ,9)
case "nbbbny" $ tmpztl
thisform.plc_l(i,j,at("nbbbny",tmpztl),1 ,9)
case "ybbbnn" $ tmpztl
thisform.plc_l(i,j,at("ybbbnn",tmpztl),4 ,9)
case "ybbnbn" $ tmpztl
thisform.plc_l(i,j,at("ybbnbn",tmpztl),3 ,9)
case "ybnbbn" $ tmpztl
thisform.plc_l(i,j,at("ybnbbn",tmpztl),2 ,9)
case "ynbbbn" $ tmpztl
thisform.plc_l(i,j,at("ynbbbn",tmpztl),1 ,9)
********** 2個 ***********
case "nynynn" $ tmpztl
thisform.plc_l(i,j,at("nynynn",tmpztl),2 ,6)
case "nnyynn" $ tmpztl
thisform.plc_l(i,j,at( "nnyynn",tmpztl),4 ,6)
case "nbnbnn" $ tmpztl
thisform.plc_l(i,j,at("nbnbnn",tmpztl),2 ,8)
case "nnbbnn" $ tmpztl
thisform.plc_l(i,j,at("nnbbnn",tmpztl),4 ,8)
********** 1個 ***********
case "nnynnn" $ tmpztl
thisform.plc_l(i,j,at("nnynnn",tmpztl),3, 7)
case "nnnynn" $ tmpztl
thisform.plc_l(i,j,at("nnnynn",tmpztl),2 ,7)
case "nnbnnn" $ tmpztl
thisform.plc_l(i,j,at("nnbnnn",tmpztl),3 ,10)
case "nnnbnn" $ tmpztl
thisform.plc_l(i,j,at("nnnbnn",tmpztl),2 ,10)
endcase
tmpzth=""
tmpztl=""
endfor

㈥ 求五子棋AI演算法,空棋位打分那個value函數,打分規則不用說了額,主要是怎麼判斷活4,沖4,活3等棋局形式

正常一點的想法:

  1. 判斷自己有沒有馬上贏的點;

  2. 判斷對方馬上贏的點;

  3. 判斷己方活三;

  4. 判斷敵方活三;

  5. 判斷己方潛在(雙活三、雙活四、三叉四、……);

  6. 判斷對方潛在(……)。

  7. 判斷己方潛在活三;

  8. 判斷敵方潛在活三;

  9. 任意落子。

瘋狂的:

深搜或寬搜,找出贏的幾率最大的點。

㈦ C語言五子棋演算法

任何一種棋類游戲其關鍵是對當前棋局是否有正確的評分,評分越准確則電腦的AI越高。五子棋游戲也是如此,但在打分之前,我們先掃描
整個棋盤,把每個空位從八個方向上的棋型填入數組gStyle(2, 15, 15, 8, 2),其中第一個下標為1時表示黑棋,為2時表示白棋,第二和第三
個下標表示(x,y),第四個下標表示8個方向,最後一個下標為1時表示棋子數,為2時表示空格數,如:gStyle(1,2,2,1,1)=3表示與坐標(2,2)在第1個方向上相鄰的黑棋棋子數為3
gstyle(1,2,2,1,2)=4表示與坐標(2,2)在第1個方向上的最近的空格數為4
在定義方向時,也應該注意一定的技巧,表示兩個相反的方向的數應該差4,在程序中我是這樣定義的:
Const DIR_UP = 1
Const DIR_UPRIGHT = 2
Const DIR_RIGHT = 3
Const DIR_RIGHTDOWN = 4
Const DIR_DOWN = 5
Const DIR_DOWNLEFT = 6
Const DIR_LEFT = 7
Const DIR_LEFTUP = 8
這樣我們前四個方向可以通過加四得到另一個方向的值。如果你還是不太明白,請看下面的圖:
---------
---------
---oo----
-ox*xx---
---------
---------
圖中的*點從標為(4,4),(打*的位置是空位),則:
gStyle(2,4,4,1,1)=1在(4,4)點相鄰的上方白棋數為1
gStyle(2,4,4,1,2)=2在(4,4)點的上方距上方白棋最近的空格數為2
gStyle(1,4,4,3,1)=2在(4,4)點相鄰的右方黑棋數為2
gStyle(1,4,4,3,2)=1在(4,4)點的右方距右方黑棋最近的空格數為3
...一旦把所有空點的棋型值填完,我們很容易地得出黑棋水平方向上點(4,4)的價值,由一個沖1(我把有界的棋稱為沖)和活2(兩邊無界的
棋稱為活)組成的。對於而白棋在垂直方向上點(4,4)的價值是一個活1,而在/方向也是活1所以,只要我們把該點的對於黑棋和白棋的價值算出
來,然後我們就取棋盤上各個空點的這兩個值的和的最大一點作為下棋的點。然而,對各種棋型應該取什麼值呢?我們可以先作如下假設:
Fn 表示先手n個棋子的活棋型,如:F4表示先手活四
Fn'表示先手n個棋子的沖棋型,如:F4'表示先手沖四
Ln 表示後手n個棋子的活棋型,如:L3表示後手活三
Ln'表示後手n個棋子的沖棋型,如:L3'表示後手沖三
.
.
.
根據在一行中的棋型分析,得到如下關系:
L1'<=F1'<L2'<=F2'<=L1<F1<L2<F2<L3'<=F3'<L4'<F4'=F4
從這個關系包含了進攻和防守的關系(當然,這個關系是由我定的,你可以自己定義這些關系)。對這些關系再進一步細化,如在一個可下
棋的點,其四個方向上都有活三,也比不上一個沖四,所以我們可以又得到4*F3<L4'這個關系,同樣,我們還可以得到其它的關系,如:4*F2<L3、4*L3<F3...,這些的關系由於你的定法和我的定法制可能不一樣,這樣計算機的AI也就不一樣,最後我們把分值最小的L1'值定為1,則我們就得
到了下面各種棋型的分值,由C語言表示為:
F[2][5]={{0,2,5,50,16000},{0,10,30,750,16000}};
L[2][5]={{0,1,5,50,3750},{0,10,30,150,4000}};
F數組表示先手,第一個下標為0時表示沖型,第二個下標表示棋子數,則F2'對應F[0][2]L數組表示後手,第一個下標為0時表示沖型,第二
個下標表示棋子數,則L2對應F[1][2]Ok,棋型的分值關系確定好了以後,我們把每一個可下點的四個方向的棋型值相加(包括先手和後手的分
值),最後選擇一個最大值,並把這一點作為計算機要下的點就OK了:)。後話:
1、得到最大值也許不止一個點,但在我的程序中只選擇第一個最大點,當然你可以用於個隨機數來決定
選擇那一個最大值點,也可以對這些最大值點再作進一步的分析。
2、在這個演算法中我只考慮了周圍有棋子的點,而其它點我沒有考慮。
3、可以再更進一步,用這個演算法來預測以後的幾步棋,再選擇預測值最好的一步,這樣電腦的AI就更高了
4、這個演算法沒有考慮黑棋的禁手(雙3、雙四和多於五子的連棋)。因為在平時我下的五子棋是沒有這些
禁手的。

㈧ 五子棋人工智慧演算法講解

五子棋演算法可簡可繁,要看你對自己五子棋程序智能的要求, 人機對戰的意思就是人和電腦下,也就是說電腦會思考如何下棋....其實這才是五子棋程序的核心.如果只實現人與人對戰的話,是一件很簡單的事情,無非就是繪制棋盤,然後繪制下棋的效果,再寫個下棋合法性判斷,勝負判斷....大概就搞定了....所以核心其實是人機對戰的電腦那部分人工智慧.這東西吧,可以研究的很多,不過主要的幾個設計要點就是搜索演算法和估值演算法,這兩個是最主要的,還有提高電腦思考銷率的方法就有多cpu的計算機多線程思考的設計....通過一些手段讓電腦變得更像人類棋手的,例如利用一些遺傳演算法之類的讓電腦具有學習能力,可以在失敗中吸取教訓,開局庫,歷史啟發之類的一大堆......但是總而言之,這一系列演算法的設計沒有一個標准,只要能讓你的電腦下棋下的更聰明,更快那就是好演算法.國內有一個叫王曉春的寫過一本叫<<pc游戲編程( 人機博弈)>>的書,這是一本研究人機博弈程序很經典的書,書的後面還附了一個五子棋的程序實例,你可以參考一下.下面是csdn的下載地址,你也可以自己去搜一下.http://download.csdn.net/source/1925326

熱點內容
如何把復制存儲刪了 發布:2024-10-04 21:07:59 瀏覽:202
我的解壓神器 發布:2024-10-04 21:06:06 瀏覽:110
西門子編程100例 發布:2024-10-04 21:05:28 瀏覽:326
樂高機器人ev3編程 發布:2024-10-04 20:56:10 瀏覽:990
演算法左神 發布:2024-10-04 20:23:55 瀏覽:910
lol手游如何配置技能 發布:2024-10-04 20:17:11 瀏覽:861
伺服器兩根心跳線ip一樣嗎 發布:2024-10-04 20:17:03 瀏覽:554
java無狀態 發布:2024-10-04 20:15:40 瀏覽:729
電信為什麼限制上傳速度 發布:2024-10-04 20:11:28 瀏覽:816
編程哪個培訓機構好 發布:2024-10-04 19:55:14 瀏覽:60