vb.net五子棋,用vb編寫五子棋
算術運算導致溢出 vb.net
第一問題好理解,?可能 key 是integer類型緣故吧,把它改為Byte。
創(chuàng)新互聯(lián)長期為1000多家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為疊彩企業(yè)提供專業(yè)的成都做網站、成都網站建設,疊彩網站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
第二個沒讀懂,你換個方式試試,如:
'Dim?bts()?As?Byte?=?My.Computer.FileSystem.ReadAllBytes("")
Dim?bst?As?System.IO.BinaryReader?=?New?System.IO.BinaryReader(System.IO.File.OpenRead("D:\Program?Files(Green)\人機對戰(zhàn)五子棋-綠色免安裝單機版v1.0.exe"))
Dim?bs()?As?Byte
Const?aLength?As?Integer?=?50000
Do
bs?=?bst.ReadBytes(aLength)
Console.WriteLine(bs.Length)
Loop?Until?bs.Length??aLength
bst.Close()
文件讀到最后一塊總會小于指定長度的,你的代碼先定義數組長度,然后再讀取,這樣最后讀取的一塊二進制數組必然有一部分無效的。
五子棋游戲程序設計(VB)
五子棋的AI構想 有句話叫“當局者迷,旁觀者清。”,但這句話在由AI所控制的計算機玩家上是不成立的,因為計算機必須知道有那些獲勝方式,并計算出每下一步棋到棋盤上任一格子的獲勝幾率,也就是說,一個完整的五子棋的AI構想必須:
1、能夠知道所有的獲勝組合; 2、建立和使用獲勝表; 3、設定獲勝的分數; 4、使電腦具有攻擊和防守的能力; 一、求五子棋的獲勝組合 在一場五子棋的游戲中,計算機必須要知道有那些的獲勝組合,因此我們必須求得獲勝組合的總數。我們假定當前的棋盤為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 二、建立和使用獲勝表 我們已經計算出了一個10*10的五子棋盤會有192種獲勝方式,這樣我們可以利用數組建立獲勝表,獲勝表的主要作用是:1,判斷當前的獲勝方式是否有效;2,判斷當前的獲勝方式中到底有多少子落入該獲勝組合中。詳細的使用您將在后面的程序中可以看出。 三,分數的設定 在游戲中為了讓計算機能夠決定下一步最佳的走法,必須先計算出計算機下到棋盤上任一空格的分數,而其中最高分數便是計算機下一步的最佳走法。 原理:我們判定當前討論的空格與當前討論的點有幾種獲勝的方式,有幾種該空格就加幾分。這種原理初聽起來似乎是無法入手,沒關系,當您了解我們后面的程序后您就會明白這種決策原理了。 這種決策有一些缺陷,因為如果只根據這個模型設計,就有可能出現(xiàn)電腦或玩家有三個子連成一線的時候,計算機卻判斷不出,它認為其他某些空格是當前的獲勝的最佳位置而不去攻擊或防守。沒關系我們完全可以通過一個加強算法來改變當前的分值情況,也就是說當電腦或玩家有三個子或四個子連成一線時,我們通過加強算法將當前與三個子或四個子有關的空格的分值提高,從而可以彌補這一缺憾。 四、攻擊與防守 以上的方式,事實上計算機只是計算出了最佳的攻擊位置,為了防守我們還應計算當前玩家的最佳的攻擊位置。這樣有什么用呢?道理很簡單,如果玩家最佳攻擊位置的分數大于計算機最佳攻擊位置上的分數,那么計算機就將下一步的棋子擺在玩家的最佳攻擊位上以阻止玩家的進攻,否則計算機便將棋子下在自己的最佳攻擊位置上進行攻擊。 事實上,這個AI構想是很強大的如果你不是很厲害的五子棋高手的話,可能很快會被計算機打敗。我在聯(lián)眾上可是中級棋手啊,跟這種構想打的時候勝率也不是很高。 使用vb.net編寫五子棋 一、編寫前的準備: 1、用計算機的思想描述整個下棋的過程 考慮步驟: (1)為了簡便我們可以先讓電腦先走第一步棋,電腦每走一步就會封掉許多玩家的獲勝可能情況。 (2)當玩家走棋的時候我們首先應該考慮玩家走棋的合法性。 (3)如果合法,那么玩家也會封掉許多電腦的獲勝的可能情況。 (4)電腦的思考路徑:首先判斷當前玩家和電腦的所有獲勝組合是否需要進行加強賦值,
是進行加強賦值,否則進行普通的賦值。 (5)比較當前玩家和電腦誰的分值最大。將分值最大的點作為電腦的下一步走法。 2、利用vb.net窗體和圖形工具建立五子棋的棋盤界面 (1)添加一個picturebox控件 作用:使用picturebox控件繪制棋子和棋盤 (2)添加一個label控件 作用:顯示當前的獲勝標志,也就是當某一方獲勝或和棋時顯示此標簽。 (3)添加一個mainmenu控件 作用:控制游戲的開始或結束 (4)添加一個mediaplay組件 作用:使程序可以播放音樂。 3、設置整體框價 我們采取10*10的棋盤,為主要的平臺。利用數組定義整個棋盤桌面,利用數組定義獲勝組合以及獲勝標志等。 二,聲明全局數組和變量 定義虛擬桌面: 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 三、初始化游戲 '*****************************************************************************
'** 模塊名稱: initplayenvironment
'**
'** 描述: 此函數主要功能如下:
'** 1. 設置背景音樂。
'** 2. 設置游戲狀態(tài)有效。
'** 3. 初始化游戲狀態(tài)標簽。
'** 4. 直接指定電腦的第一步走法。
'** 5. 初始化基本得分桌面。
'** 6. 電腦和玩家獲勝標志初始化。
'** 7. 初始化所有獲勝組合。
'** 8. 重新設定玩家的獲勝標志。
'**
'*****************************************************************************
Sub initplayenvironment()
player.FileName = ".\music\zhyu01.mid"
player.Play()
theplayflag = True
'游戲有效
Label1.Visible = False
'游戲狀態(tài)標簽不顯示
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
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
四,處理鼠標事件 '*****************************************************************************
'** 模塊名稱: themousedown
'**
'** 描述: 此函數主要實行以下功能:
'** 1. 判定當前游戲標志是否有效。
'** 2. 將實際坐標轉化成虛擬坐標。
'** 3. 繪制玩家的棋子。
'** 4. 執(zhí)行檢查獲勝函數。
'** 5. 執(zhí)行電腦算法函數。
'**
'*****************************************************************************
Sub themousedown(ByVal x As Integer, ByVal y As Integer)
If theplayflag = False Then
Exit Sub
End If
'檢查游戲狀態(tài)是否有效
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 五、獲勝檢查算法。 '*****************************************************************************
'** 模塊名稱: checkwin
'**
'** 描述: 此模塊執(zhí)行以下功能:
'** 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
'設定和棋規(guī)則
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
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 六、電腦算法 '*****************************************************************************
'** 模塊名稱: diannao
'**
'** 描述: 此程序主要執(zhí)行以下功能:
'** 1. 初始化賦值系統(tǒng)。
'** 2. 賦值加強算法。
'** 3. 計算電腦和玩家的最佳攻擊位。
'** 4. 比較電腦和玩家的最佳攻擊位并決定電腦的最佳策略。
'** 5. 執(zhí)行檢查獲勝函數。
'**
'***************************************************************************** Sub diannao()
Dim i, j, k, m, n As Integer
Dim dc As Integer
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 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 Then
cab = cab + 1
End If
End If
Next
Next
Select Case cab
Case 3
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 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 = 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)
table(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 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
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
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) = True 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, 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, n, dc) = True Then
pflag(dc) = False
checkwin()
Exit Sub
End If
Next
End If
End If
Next
Next
End Select
End If
Next
''' ******** 電腦加強算法結束 ******** ' ******** 賦值系統(tǒng) ********
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
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
''' ******** 賦值系統(tǒng)結束 ********
''' ******** 分值比較算法 ********
Dim a, b, c, d As Integer
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
For i = 0 To 9
For j = 0 To 9
If pscore(i, j) ps Then
ps = pscore(i, j)
c = i
d = j
End If
Next
Next
If cs ps Then
yuandian(a * 30 + 10, b * 30 + 10)
table(a, b) = 1
For i = 0 To 191
If pwin(a, b, i) = True Then
pflag(i) = False
End If
Next
Else
yuandian(c * 30 + 10, d * 30 + 10)
table(c, d) = 1
For i = 0 To 191
If pwin(c, d, i) = True Then
pflag(i) = False
End If
Next
End If
''' ******** 分值比較算法結束 ********
checkwin()
End Sub 七、繪制棋子 '*****************************************************************************
'** 模塊名稱: yuandian
'**
'** 描述: 此函數主要進行電腦棋子的繪制。
'**
'***************************************************************************** Sub yuandian(ByVal x As Integer, ByVal y As Integer)
Dim mycolor As Color
Dim g As System.Drawing.Graphics
g = PictureBox1.CreateGraphics
Dim zhx, zhy As Integer
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
mycolor = Color.Black
Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor)
g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30)
End Sub
急求vb雙人對戰(zhàn)五子棋源代碼
Option Explicit
'五子棋程序 人機對戰(zhàn)版本
'需要2個Label控件 2個CommandButton控件
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
'Dim PlayStep() As String '記錄棋譜的數組
'Dim Label2Cap As String
Private Const BoxL As Single = 50, BoxT As Single = 50, BoxW As Single = 25, BoxN As Integer = 18
Dim Table() As Long '棋盤(0-BoxN,0-BoxN) 0-空 1-黑子 2-白子
Dim PsCore() As Long '定義當前玩家桌面空格的分數
Dim CsCore() As Long '定義當前電腦桌面空格的分數
Dim pWin() As Boolean '定義玩家的獲勝組合
Dim cWin() As Boolean '定義電腦的獲勝組合
Dim pFlag() As Boolean '定義玩家的獲勝組合標志
Dim cFlag() As Boolean '定義電腦的獲勝組合標志
Dim ThePlayFlag As Boolean '定義游戲有效標志
Private Sub Command1_Click()
If Not ThePlayFlag Then Call InitPlayEnvironment: Exit Sub
If MsgBox("本局還沒有下完,是否重新開始?(Y/N)", vbYesNo) = vbNo Then Exit Sub
Call InitPlayEnvironment
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_Load()
Dim i As Long, lw As Long, lh As Long
'Label2Cap = "000 黑方 行 00 列 00"
Me.Width = 10815: Me.Height = 8040
' Me.Caption = "五子棋 - 人機對戰(zhàn)": Me.Show
lw = Me.Width \ Screen.TwipsPerPixelX: lh = Me.Height \ Screen.TwipsPerPixelY
SetWindowRgn Me.hWnd, CreateRoundRectRgn(0, 0, lw, lh, 60, 60), True
With Label1
.Alignment = vbCenter: .FontSize = 12: .FontBold = True
.ForeColor = vbRed: .BackStyle = 0: .AutoSize = True: .Move 8910, 510
End With
Label2.AutoSize = True: Label2.WordWrap = True
Label2.BackStyle = 0: Label2.Move 8040, 1050, 2280
Command1.Move 8025, 7035, 1020, 435: Command1.Caption = "再來一局"
Command2.Move 9300, 7035, 1020, 435: Command2.Caption = "不玩了"
Call DrawChessBoard: Me.FillStyle = 0: Call InitPlayEnvironment
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim iRow As Long, iCol As Long, i As Long, k As Long, t As String
If Not ThePlayFlag Then Exit Sub
If Button = vbLeftButton Then '左鍵下棋
iRow = -1: iCol = -1
For i = 0 To BoxN '鼠標必須落在交叉點 半徑10以內 若是則給出行列號
If (Y + 10) (BoxT + i * BoxW) And (Y - 10) = (BoxT + i * BoxW) Then iRow = i
If (X + 10) (BoxL + i * BoxW) And (X - 10) = (BoxL + i * BoxW) Then iCol = i
Next
If (iRow = -1) Or (iCol = -1) Then Beep: Exit Sub
If Table(iCol, iRow) 0 Then Exit Sub
Table(iCol, iRow) = 2: Label1.Caption = "下一步 黑方"
Me.FillColor = vbWhite: Me.Circle (iCol * BoxW + BoxT, iRow * BoxW + BoxL), 8
For i = 0 To UBound(cWin, 3)
If cWin(iCol, iRow, i) = True Then cFlag(i) = False
Next
Call CheckWin: Call DianNao '檢查當前玩家是否獲勝 調用電腦算法
End If
End Sub
Public Sub InitPlayEnvironment()
'*****************************************************************************
' 模塊名稱: InitPlayEnvironment [初始化過程]
'
' 描述: 1. 設置背景音樂。 2. 設置游戲狀態(tài)有效。
' 3. 初始化游戲狀態(tài)標簽。 4. 直接指定電腦的第一步走法。
' 5. 初始化基本得分桌面。 6. 電腦和玩家獲勝標志初始化。
' 7. 初始化所有獲勝組合。 8. 重新設定玩家的獲勝標志。
'*****************************************************************************
Dim i As Long, j As Long, m As Long, n As Long
ThePlayFlag = True: Label1.Caption = "下一步 白方": Label2.Caption = ""
Me.FillColor = vbBlack: Me.FillStyle = 0: Me.AutoRedraw = True
Me.Cls: Me.Circle (9 * BoxW + BoxL, 9 * BoxW + BoxT), 8
ReDim Table(0 To BoxN, 0 To BoxN) As Long
ReDim pFlag(NumsWin(BoxN + 1) - 1) As Boolean
ReDim cFlag(UBound(pFlag)) As Boolean
ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long
ReDim pWin(BoxN, BoxN, UBound(pFlag)) As Boolean
ReDim cWin(BoxN, BoxN, UBound(pFlag)) As Boolean
For i = 0 To UBound(pFlag): pFlag(i) = True: cFlag(i) = True: Next
Table(9, 9) = 1 '假定電腦先手 并下了(9, 9)位 將其值設為1
'******** 初始化獲勝組合 ****************************************
For i = 0 To BoxN: For j = 0 To BoxN - 4
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 BoxN: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(i, j + m, n) = True: cWin(i, j + m, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN - 4: For j = 0 To BoxN - 4
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 BoxN - 4: For j = BoxN 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 UBound(pWin, 3) '由于電腦已下了(9, 9)位 所以需要重新設定玩家的獲勝標志
If pWin(9, 9, i) = True Then pFlag(i) = False
Next
End Sub
Public Function DrawChessBoard() As Long
'容器的(BoxL, BoxT)為左上角坐標畫一個 BoxN*BoxN, 每格邊長為 BoxW 象素的棋盤
Dim i As Long, j As Long, cx As Long, cy As Long
Me.ScaleMode = 3: Me.FillStyle = 1: Me.AutoRedraw = True: Me.Cls
For i = 0 To BoxN '畫棋盤
Me.Line (BoxL + i * BoxW, BoxT)-(BoxL + i * BoxW, BoxT + BoxN * BoxW)
Me.Line (BoxL, BoxT + i * BoxW)-(BoxL + BoxN * BoxW, BoxT + i * BoxW)
Me.CurrentX = BoxL + i * BoxW - IIf(i 9, 6, 2)
Me.CurrentY = BoxT - 20: Me.Print Format(i)
Me.CurrentX = BoxL - IIf(i 9, 23, 20)
Me.CurrentY = BoxT + i * BoxW - 6: Me.Print Format(i)
Next
For i = 3 To 16 Step 6: For j = 3 To 16 Step 6 '畫小標志
cx = BoxL + j * BoxW - 3: cy = BoxT + i * BoxW - 3
Me.Line (cx, cy)-(cx + 6, cy + 6), , B
Next: Next
Me.AutoRedraw = False: Set Me.Picture = Me.Image
End Function
Public Sub CheckWin()
'*****************************************************************************
' 模塊名稱: CheckWin [獲勝檢查算法]
'
' 描述: 1. 檢查是否和棋。 2. 檢查電腦是否獲勝。 3. 檢查玩家是否獲勝。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim cA As Long, pA As Long, cN As Long
For i = 0 To UBound(cFlag): cN = IIf(cFlag(i) = False, cN + 1, cN): Next
If cN = UBound(cFlag) - 1 Then '設定和棋規(guī)則
Label1.Caption = "雙方和棋!": ThePlayFlag = False: Exit Sub
End If
For i = 0 To UBound(cFlag) '檢查電腦是否獲勝
If cFlag(i) = True Then
cA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cA = cA + 1
Next: Next
If cA = 5 Then Label1.Caption = "電腦獲勝!": ThePlayFlag = False: Exit Sub
End If
Next
For i = 0 To UBound(pFlag) '檢查玩家是否獲勝
If pFlag(i) = True Then
pA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pA = pA + 1
Next: Next
If pA = 5 Then Label1.Caption = "玩家獲勝!": ThePlayFlag = False: Exit Sub
End If
Next
End Sub
Public Sub DianNao()
'*****************************************************************************
' 模塊名稱: DianNao [電腦算法]
' 描述: 1. 初始化賦值系統(tǒng)。 2. 賦值加強算法。 3. 計算電腦和玩家的最佳攻擊位。
' 4. 比較電腦和玩家的最佳攻擊位并決定電腦的最佳策略。 5. 執(zhí)行檢查獲勝函數。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim Dc As Long, cAb As Long, pAb As Long
ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long '初始化賦值數組
'******** 電腦加強算法 ********
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
cAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cAb = cAb + 1
Next: Next
Select Case cAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then CsCore(m, n) = CsCore(m, n) + 5
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next
For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
pAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pAb = pAb + 1
Next: Next
Select Case pAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then PsCore(m, n) = PsCore(m, n) + 30
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next
'******** 電腦加強算法結束 ********
'******** 賦值系統(tǒng) ****************
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And cWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 1) And cWin(m, n, i) Then CsCore(j, k) = CsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next
For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And pWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 2) And pWin(m, n, i) Then PsCore(j, k) = PsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next
'******** 賦值系統(tǒng)結束 ************
'******** 分值比較算法 ************
Dim a As Long, b As Long, c As Long, d As Long
Dim cS As Long, pS As Long
For i = 0 To BoxN: For j = 0 To BoxN
If CsCore(i, j) cS Then cS = CsCore(i, j): a = i: b = j
Next: Next
For i = 0 To BoxN: For j = 0 To BoxN
If PsCore(i, j) pS Then pS = PsCore(i, j): c = i: d = j
Next: Next
If cS pS Then
Table(a, b) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (a * BoxW + BoxL, b * BoxW + BoxT), 8
For i = 0 To UBound(pWin, 3)
If pWin(a, b, i) = True Then pFlag(i) = False
Next
Else
Table(c, d) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (c * BoxW + BoxL, d * BoxW + BoxL), 8
For i = 0 To UBound(pWin, 3)
If pWin(c, d, i) = True Then pFlag(i) = False
Next
End If
'******** 分值比較算法結束 ********
Call CheckWin
End Sub
Public Function NumsWin(ByVal n As Long) As Long
'根據輸入的棋盤布局 n*n 計算總共有多少種獲勝組合
'假定棋盤為 10 * 10 相應的棋盤數組就是 Table(9, 9)
'水平方向 每一列獲勝組合是6 共10列 6*10=60
'垂直方向 每一行獲勝組合是6 共10行 8*10=60
'正對角線方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'反對角線方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'總的獲勝組合數為 60 + 60 + 36 + 36 = 192
Dim i As Long, t As Long
For i = n - 5 To 1 Step -1: t = t + i: Next
NumsWin = 2 * (2 * t + n - 4) + 2 * n * (n - 4)
End Function
C#寫五子棋,如何實現(xiàn),落子
軟糖有一個五子棋源碼,不過是VB.net的。
棋盤是用int[,]二維數組做的,值為0就是空,1是白方,2是黑方。
落子判斷值是否為0,然后根據當前玩家的賦值為1或2。
'''?summary
'''?返回玩家能否在棋盤(X,Y)的位置下棋
'''?/summary
'''?param?name="X"橫向坐標/param
'''?param?name="Y"縱向坐標/param
'''?returns如果已經有棋子或不在棋盤上,則返回False/returns
'''?remarks本函數會調用檢查五子并對檢查結果進行判斷/remarks
Public?Function?下棋(ByVal?X?As?Integer,?ByVal?Y?As?Integer)?As?Boolean
If?棋盤(X,?Y)??0?Then?Return?False
棋盤(X,?Y)?=?M當前玩家
Dim?檢查結果?As?Integer
檢查結果?=?檢查五子(X,?Y)
If?檢查結果??0?Then?玩家獲勝(檢查結果)?Else?交換玩家()
Return?True
End?Function
網頁名稱:vb.net五子棋,用vb編寫五子棋
網站URL:http://www.xueling.net.cn/article/hcoddh.html