VB.NET实现五子棋的人工智能
人工智能也就是所谓的AI(Artificial Intelligence),它是一门很抽象的技术,AI程序的编写不需要依据任何既定的思考模式或者规则。尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作。我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力,而我们的所有的研究也应该围绕着这一方向。我们今天讨论的是策略类的人工智能。 X0WJU q
"-Wz%we!
策略类人工智能可以说是AI中比较复杂的一种,最常见的策略类AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。下面我们先介绍一下五子棋的AI构想。 0~;\#!Bv
1vr 4rpm
五子棋的AI构想 910WC/$
i3k my 9
有句话叫“当局者迷,旁观者清。”,但这句话在由AI所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率,也就是说,一个完整的五子棋的AI构想必须: jp)}:UA
GnY$MlL
1、能够知道所有的获胜组合; KS2}Kd
/1 5 TQ
2、建立和使用获胜表; uMo [x_
&w(=i
3、设定获胜的分数; ,ZN)p7y
?MU OaC)?
4、使电脑具有攻击和防守的能力; >p2gP%QN
R4<Ud |,
一、求五子棋的获胜组合 )92P Mp?
\0 6.=Hy_
在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为10*10。 'h`3YN&.o
js\.Z2c#
(1)计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:6*10=60 r[b[ ddM
lI ~vG_;
(2)计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:6*10=60 as9%cc\4
ps/+9T[
(3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 !jy%ic83
kwiRE
(4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 ,这样所有的获胜组合数为:60+60+36+36=192 ]kz|\co(p
ac5cNQ2
二、建立和使用获胜表 S75oKS^
A>M8I*Z
我们已经计算出了一个10*10的五子棋盘会有192种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要作用是:1,判断当前的获胜方式是否有效;2,判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 3.$c-|4uX
`e~PB(`FbW
三,分数的设定 nPoM\Cz.
)T.97{eH<a
在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 ny2UEn
@o!QUCr>
原理:我们判定当前讨论的空格与当前讨论的点有几种获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 aM |t_
=|d:Lm
这种决策有一些缺陷,因为如果只根据这个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 zl?Qut=L
\hueG_n
四、攻击与防守 #7B=I*L~
:h7I{8gZ
以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 UaAFdlV
Emo'b)
事实上,这个AI构想是很强大的如果你不是很厉害的五子棋高手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。 GC1 ~J& m0
"Q7u3
%'_ o
使用vb.net编写五子棋 hyEkbi1"El
n:~ny:
一、编写前的准备: f!q(e)e})
9@Ng 2Jz
1、用计算机的思想描述整个下棋的过程 Icj @51
Gv\]:"Jm n
考虑步骤: -sy~o/BP
=SiMf4B
(1)为了简便我们可以先让电脑先走第一步棋,电脑每走一步就会封掉许多玩家的获胜可能情况。 +NK9{^Y ^f
+!a-K b
(2)当玩家走棋的时候我们首先应该考虑玩家走棋的合法性。 WjZMED_
`Rh~gy<)
(3)如果合法,那么玩家也会封掉许多电脑的获胜的可能情况。 w[#tae DG
3#?xq]~
(4)电脑的思考路径:首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值, fh)].)xA
是进行加强赋值,否则进行普通的赋值。 jc5AsS:\
x E/ -l
(5)比较当前玩家和电脑谁的分值最大。将分值最大的点作为电脑的下一步走法。 {+)B[J/at
nMd%@jJh
2、利用vb.net窗体和图形工具建立五子棋的棋盘界面 FpR|A,
5[^H?t
(1)添加一个picturebox控件 r-6--@IV
^%=4vYv,
作用:使用picturebox控件绘制棋子和棋盘 }b @X
^*N%_N2
(2)添加一个label控件 u Te[ +=%
/t4$46O
作用:显示当前的获胜标志,也就是当某一方获胜或和棋时显示此标签。 *!2E`{'{
b{t*z
(3)添加一个mainmenu控件 7Pj>}
"1Y<)"&;
作用:控制游戏的开始或结束 (}qWJ>!X
HV5gkIos
(4)添加一个mediaplay组件 ("M1`R:J
+ ?\_ _U
作用:使程序可以播放音乐。 qg[ M
0:}=@R`
3、设置整体框价 E/^I"c^
B4boMe3
我们采取10*10的棋盘,为主要的平台。利用数组定义整个棋盘桌面,利用数组定义获胜组合以及获胜标志等。 @I?i@`J
&Hf[3F
二,声明全局数组和变量 =R ?\T(gs*
< RBz*m01
定义虚拟桌面: s#r iI\Y
:JifZ 9B
Dim table(9, 9) As Integer \]5C9 E
DuQ$*F_Zq
定义当前玩家桌面空格的分数: 9||"x&V
&/Yy*+j-
Dim pscore(9, 9) As Integer `f OyR
:y!$)xVOn
定义当前电脑桌面空格的分数: hN Y1[\l|
=1w-SY7}v
Dim cscore(9, 9) As Integer <q*s%i S
v!,SQzO#
定义玩家的获胜组合: )G%LOU'S I
9Ic CWZ=q
Dim pwin(9, 9, 191) As Boolean } [3Z|4O_]
E|$9m}^d
定义电脑的获胜组合: foGFf/z
.o$m m85A
Dim cwin(9, 9, 191) As Boolean 6Z,dNI;
#(484U
定义玩家的获胜组合标志: HUhP}ER
eD)fiG1
Dim pflag(191) As Boolean $VfN\tZFe
L^B<t~
定义电脑的获胜组合标志: (vb|q ;=
Dim cflag(191) As Boolean I`c $W >Z
C3'*0psF
定义游戏有效标志: &FO po
cW:Jbr
Dim theplayflag As Boolean aHQ 7 HX
+7.ut^eUlq
[d|Dy(,k|
三、初始化游戏 Sbxd].yj'
7)^V On4/
''***************************************************************************** d.7-.uOe
''** 模块名称: initplayenvironment 1o#[Jb)N6
''** >hQVk
''** 描述: 此函数主要功能如下: Q)mc"3!
''** 1. 设置背景音乐。 Bd"`KI6cO[
''** 2. 设置游戏状态有效。 'k }"!a`
''** 3. 初始化游戏状态标签。 +W>Ux^o}~
''** 4. 直接指定电脑的第一步走法。 Q NgI:J
''** 5. 初始化基本得分桌面。 9L{ZwJm@
''** 6. 电脑和玩家获胜标志初始化。 $C2l"D/
''** 7. 初始化所有获胜组合。 V;BC5&+W
''** 8. 重新设定玩家的获胜标志。 7b] 3F
''** !~o<qWO
''***************************************************************************** V0U`+9S,gu
Sub initplayenvironment() UFD4ffh_z#
player.FileName = ".\music\zhyu01.mid" kW +omR
player.Play() ZRLi oG
theplayflag = True yf4r(u%x
''游戏有效 $&7!ugtq0
Label1.Visible = False ckY?G6qtPE
''游戏状态标签不显示 <j-asR
PictureBox1.Refresh() TQi,cRU;t\
''清空picturebox1的内容 HQcE0&k
yuandian(130, 130) $j(N&qx:
''调用绘图函数绘制当前电脑先走的位置 S~x944&m*
Dim i, j, m, n As Integer &XWp!\ h
For i = 0 To 9 _WV0ToQ
For j = 0 To 9 NFnxN'L#
table(i, j) = 0 a &!Ajr,
Next dF) -$$g
Next @9[4W> <
''桌面初始化 V.#PneQ
For i = 0 To 191 Q4PJLm
pflag(i) = True xH&9VVIF%
cflag(i) = True C4P5 OPL5q
Next bjTfUG 1
''获胜标志初始化 y",q1 0f}
table(4, 4) = 1 $k)G9qu
''由于我们设定电脑先手,并下了4,4位所以将其值设为1 }0b eS&H
'''''' ******** 初始化获胜组合 ******** MV>3"U%
n = 0 c`>a_~
For i = 0 To 9 5F`<hYiLQ
For j = 0 To 5 zY/?s`I?
For m = 0 To 4 {D*0i<
pwin(j + m, i, n) = True ]x g}'i~\
cwin(j + m, i, n) = True 5\'9 uWa
Next w "_[tQYL
n = n + 1 9^#')f[H8
Next ?b-@*b+R
Next A0 JZ#hS
For i = 0 To 9 qJ^19Uaw[
For j = 0 To 5 #-v[ueq
For m = 0 To 4 oy ajISCy
pwin(i, j + m, n) = True IhH[+upH
cwin(i, j + m, n) = True ?)u fPfK+
Next \R/eq9e
n = n + 1 41FA#ks
Next hy R"hwaQ
Next :UjVL8 gB
For i = 0 To 5 NP7 ;XW >B
For j = 0 To 5 x.yMH:P
For m = 0 To 4 n, $.u>
pwin(j + m, i + m, n) = True 0JR`(>m\s
cwin(j + m, i + m, n) = True 01GT0DL
Next /`Y(gs
n = n + 1 ;+O3z6:
Next h-&R_J!3
Next 'mO,V(< n/
For i = 0 To 5 w4]@y*
For j = 9 To 4 Step -1 p=4f9VT
For m = 0 To 4 Mr\p: gN
pwin(j - m, i + m, n) = True yRIwIP
cwin(j - m, i + m, n) = True >Cx%=v$9
Next 44>/>7D
n = n + 1 6T"A0?
Next (L19cg4>#
Next 6y$4*/
'''''' ******** 初始化获胜组合结束 ******** K); (~\!
For i = 0 To 191 `h6lh_pWW
If pwin(4, 4, i) = True Then F [3[b"
pflag(i) = False *dRl|7FDN
End If I[?S`_D
Next s;f5eXz
''由于电脑已下了4,4位所以我们需要重新设定玩家的获胜标志 P7XxJ%u
End Sub ` J'6,nV
"VM@hR@
AM|-VAB
四,处理鼠标事件 \,z_
_ ]ON3
''***************************************************************************** \RdySu9sRw
''** 模块名称: themousedown NGQr }
''** -fDX^?P
''** 描述: 此函数主要实行以下功能: {nX}-sR
''** 1. 判定当前游戏标志是否有效。 $ oCQ@ lU
''** 2. 将实际坐标转化成虚拟坐标。 7:4d+!
''** 3. 绘制玩家的棋子。 :R7Rc^T'!
''** 4. 执行检查获胜函数。 V-}<s"0"
''** 5. 执行电脑算法函数。 "m9 IVZ
''** r~WT9"my
''***************************************************************************** \1w \k>$5-
Sub themousedown(ByVal x As Integer, ByVal y As Integer) 42p }YY<
If theplayflag = False Then j%RLzVsIE
Exit Sub ^'XT}f#
End If ",1 5 )
''检查游戏状态是否有效 f>e!|}|
Dim i, j As Integer "19LA
Dim zhx, zhy As Integer M>B,46?0
zhx = Int((x - 10) / 30) wKd#!H
zhy = Int((y - 10) / 30) 20QwUf'E!
For i = 0 To 9 C?u> f&U
For j = 0 To 9 [s"[8gi{u
If table(zhx, zhy) > 0 Then ,Zkz`w 3
Exit Sub B^yFq'7~V|
End If {Qk0/* I
Next G2 } SXP$
Next !qzH@<0 j
''检查当前鼠标点击的格子是否有效 6y+wR8
Dim mycolor As Color ^# ^7aw9
Dim g As System.Drawing.Graphics _&(SA&(!
g = PictureBox1.CreateGraphics )O.nB
mycolor = Color.White Z~,z jV5"^
Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor) -4UU27xy
g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) l'h9_e>h
''绘制玩家的棋子 &qfn$LX
table(zhx, zhy) = 2 R]"P1
For i = 0 To 191 og4>9+^
If cwin(zhx, zhy, i) = True Then >n)]#$*(=
cflag(i) = False @|jX/,T6
End If Cx[=6MC
Next I^ hp{c
''重设电脑的获胜标志 *Rx8KR"H
checkwin() O] >?B
''检查当前玩家是否获胜 _hg nEP/
diannao() WSML9?Yn
''调用电脑算法 >uY:Q L
End Sub L#yxHi|Hg
%)@}_` 6w
五、获胜检查算法。 1q1=/4
BZW~2 "S
''***************************************************************************** {*[cr`cvq
''** 模块名称: checkwin ]L]8oSYNK[
''** -|2qVlo
''** 描述: 此模块执行以下功能: Fe)3zGZh
''** 1. 检查是否和棋。 7-C \o
''** 2. 检查电脑是否获胜。 BB~J<B |
''** 3. 检查玩家是否获胜。 LAkO;P~
''** HO1}T"p
''***************************************************************************** V@srC+(C
Sub checkwin() pJIzs|
Dim i, j, k, m, n As Integer XdSZ!
Dim ca As Integer A">HOMf
Dim pa As Integer = . 3
Dim cnormal As Integer = 0 (Mo2
For i = 0 To 191 !.Bb}'
If cflag(i) = False Then c`]{2p/g
cnormal = cnormal + 1 #e63aHc
End If .>(y}YQ{S
Next &jyL* %
If cnormal = 190 Then t kfcNwxG
Label1.Visible = True C7e X,)d
Label1.Text = "和棋,请重新开始!" ^|6V^w
PictureBox1.Refresh() 2LjfCeF
theplayflag = False 9`mfpRa3
Exit Sub ~2gT {'7
End If fO}2:ru
''设定和棋规则 LZ*%9{qw,
For i = 0 To 191 PfgIF Ub$N
If cflag(i) = True Then ;Tm$ WCQ
ca = 0 g( y9&wN
For j = 0 To 9 cJ?e|oy
For k = 0 To 9 pj->x*L`
If table(j, k) = 1 Then m! qy:..B
If cwin(j, k, i) = True Then ym)k|K
ca = ca + 1 2xmj>7qH
End If `kq-f~b$
End If k3-IiS9!
Next 1){yD~hS
Next F&+ i:
If ca = 5 Then &}sj 30~F
Label1.Visible = True KYZO0[9@k
Label1.Text = "电脑获胜,请重新开始" s,M;q>Xy
PictureBox1.Refresh() W B4t0X
theplayflag = False lEX NLF)H
Exit Sub t]U@c// 0U
End If qZOrr%r/
End If FU`-mQ"R
Next <:<"{;-j
''检查电脑是否获胜 ?u/ }7p
For i = 0 To 191 Oh?N I]
If pflag(i) = True Then %JX#Ge;
pa = 0 Yw0nog
For j = 0 To 9 Ht5_=3bw)
For k = 0 To 9 K Zxt*lHcz
If table(j, k) = 2 Then O*"lb-EoG
If pwin(j, k, i) = True Then 1c|R-X4@
pa = pa + 1 (TS VN
End If "<(cqJxR
End If yMhsxN,BG{
Next y7.932B=
Next ?.qj#dc{]
If pa = 5 Then #+0+8Y0e5
Label1.Visible = True 2tI# @_
Label1.Text = "玩家获胜,请重新开始" 9WmG r
PictureBox1.Refresh() 28TG2]hA
theplayflag = False )`Tkl{+C
Exit Sub )]V=%RRQ`
End If o7lQ[gl_
End If ;DU8vK +
Next +K5?a3z>i
''检查玩家是否获胜 lJDD!?D
End Sub biCk
ab*spf 1/
CEpA+^
六、电脑算法 *PUO0C3w
S-Gfb-F
''***************************************************************************** %#sF6!
''** 模块名称: diannao DI[c\-4R
''** (D(lH{nB3
''** 描述: 此程序主要执行以下功能: Y,OJmS4
''** 1. 初始化赋值系统。 J_V_<\|
''** 2. 赋值加强算法。 fWf!K Pjy
''** 3. 计算电脑和玩家的最佳攻击位。 k_opSTIY
''** 4. 比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 J',r@[r:
''** 5. 执行检查获胜函数。 !fVZ%_n
''** Zh sxd =
''***************************************************************************** 7QSo$RuXR
!/x:B'`=x~
Sub diannao() ^[ ' ;
Dim i, j, k, m, n As Integer oi\ Y<W(L
Dim dc As Integer /h3b#g^N
Dim cab As Integer @*\T:2Fl
Dim pab As Integer RUHD~^a6O
For i = 0 To 9 ;3(V)36&
For j = 0 To 9 c1.81$+v
pscore(i, j) = 0 fX/.T5=P
cscore(i, j) = 0 0kmGAa:
Next H_+]Za(E)h
Next 35 5
''初始化赋值数组 4CEs '(,
'''''' ******** 电脑加强算法 ******** d +NyLaa
For i = 0 To 191 bL_vD:5
If cflag(i) = True Then !V:Nc^e2D
cab = 0 fCubN,Y
For j = 0 To 9 hfpuXRnG%
For k = 0 To 9 "@Q?J^rlh
If table(j, k) = 1 Then `X m22[(
If cwin(j, k, i) = True Then As$ @ !
cab = cab + 1 ,'Z=qXLrW
End If ; *(ZWG~2
End If %;/FyZe'
Next Pq 0O
Next ^TlK;`(E
Select Case cab # x1c<
Case 3 ifrA.O$w
For m = 0 To 9 M8*T>pj
For n = 0 To 9 Qpt~<RDS
If table(m, n) = 0 Then $iZ^de*n
If cwin(m, n, i) = True Then m:6-M,zC
cscore(m, n) = cscore(m, n) + 5 c I x~}P+
End If %XU^-#8
End If ^? /f3rA
Next !ou^Vh}
Next EtTdmjB9Q_
Case 4 #s,$8
For m = 0 To 9 4 g?V
For n = 0 To 9 tJ@6>yf
If table(m, n) = 0 Then MADJu<M
If cwin(m, n, i) = True Then YX?vur~X<
yuandian(m * 30 + 10, n * 30 + 10) iasPla#.o2
table(m, n) = 1 S ! {hK
For dc = 0 To 191 K3C|=s&
If pwin(m, n, dc) = True Then L;v'rzLzn
pflag(dc) = False J~%Rv/
checkwin() }M5NYq%I^
Exit Sub $;Uuzr2
End If CQ*t*FT4
Next YcC@Y1?%
End If 3&~g{M8
End If P4 /^c]H\
Next dknZNZ[r+
Next 3?gQYOGDoI
End Select \|]{mUbx
End If ]mrS7m#
Next % m.u6I
For i = 0 To 191 GmF)g !P
If pflag(i) = True Then vwJp5Ufdv
pab = 0 44E &,A
For j = 0 To 9 }va@T&V9F
For k = 0 To 9 e^b#<hm
If table(j, k) = 2 Then WG-Gai<
If pwin(j, k, i) = True Then $d.`]XexL
pab = pab + 1 1VkxvK<c
End If $\IC>
End If P95xrE=
Next >N]69)8bks
Next `p+!du>xA
Select Case pab cWD_.cC
Case 3 -2FdhX4ju
For m = 0 To 9 '0^_\`
For n = 0 To 9 ^,FE\~/
If table(m, n) = 0 Then p+N`L)
If pwin(m, n, i) = True Then r9Psw
pscore(m, n) = pscore(m, n) + 30 )g)A']~(
End If Km@xZCsd*
End If sAo&}n
Next d: !i8I
Next ~`WGC]#+F
Case 4 w(pV^i+U
For m = 0 To 9 ~*[+)hmT
For n = 0 To 9 t |iJ`LzWu
If table(m, n) = 0 Then *ZC|@/
If pwin(m, n, i) = True Then ~p,SX&y5D
yuandian(m * 30 + 10, n * 30 + 10) `?dnxVX^
table(m, n) = 1 RiwQ"r$'
For dc = 0 To 191 lTh,Dqh:
If pwin(m, n, dc) = True Then &7g[nrh1
pflag(dc) = False "\mo!2j<@}
checkwin() \!nyHzfG
Exit Sub |bH;sY
End If b{@* q`aJ@
Next 5NuI6`.C
End If iRXBOI6iJ
End If s ]i(fC{
Next tyTF0s
Next dU,ll1aEtb
End Select 9vn8`IR
End If _kO{W"s]
Next li{WX~qo
'''''' ******** 电脑加强算法结束 ******** j1]_w=S{
oM]Om["
'' ******** 赋值系统 ******** ~l$ ~K?f
For i = 0 To 191 !bf!j=
If cflag(i) = True Then z cGS4GjZ
For j = 0 To 9 Mbyfd;5[O)
For k = 0 To 9 A/FR_{@R
If table(j, k) = 0 Then RK!s_zQ<Y;
If cwin(j, k, i) = True Then B>#rPI6N0
For m = 0 To 9 /kgA=
For n = 0 To 9 B l5l(#
If table(m, n) = 1 Then *{V7aM^
If cwin(m, n, i) = True Then M]nd@jE
cscore(j, k) = cscore(j, k) + 1 (s?X1L*c
End If O)q<Jj)
End If pVberwo4 o
Next I9Jq5'*
Next nl AiBJN^
End If ,EavyrQ-
End If E{F`8n;2
Next og()^j
Next 6}P#-?3X
End If A7=DM%l.
Next X]jc*mE Ok
For i = 0 To 191 vhF$>ND0'
If pflag(i) = True Then FOnLb&&0
For j = 0 To 9 uX2_i
For k = 0 To 9 Y%wh5,73F
If table(j, k) = 0 Then 9\hD=Y >J
If pwin(j, k, i) = True Then Tz&F/D8BEP
For m = 0 To 9 GcM6Ss\}'
For n = 0 To 9 7 8!xA
If table(m, n) = 2 Then R*1.8'3mE
If pwin(m, n, i) = True Then "'l{Q#f=
pscore(j, k) = pscore(j, k) + 1 \]QHMJX>
End If 'A9b$OqX
End If =dz&hN
Next ,vLskih
Next 5La E8
End If Q\+Brr%@
End If 23qMkjN`
Next SD_fAd
Next {d-iRt%kwU
End If )b2,.cM
Next Smyg(2 x`0
'''''' ******** 赋值系统结束 ******** yFnSZzQ
'''''' ******** 分值比较算法 ******** / ; Qn6N
Dim a, b, c, d As Integer E>&Pce)Am@
Dim cs As Integer = 0 Oe,DW#pf!
Dim ps As Integer = 0 CD6J7 I
For i = 0 To 9 ".CK9W)
For j = 0 To 9 EFMb}$u+
If cscore(i, j) > cs Then RJw#f\?
cs = cscore(i, j) O=Rv (t
a = i Dc/Zoj|h)
b = j <Dt@t$ E
End If I_;0V=dFd
Next >h>Q6c$]
Next "^"3 -
For i = 0 To 9 e&OR'.a2oJ
For j = 0 To 9 3|'v ~S
If pscore(i, j) > ps Then O*"O%|RH
ps = pscore(i, j) t ?`/1X3u
c = i GQYTZUdr
d = j "Zug"V? K
End If $IW=Z<ww
Next (u)Io7"X
Next '`)yu+1c
If cs > ps Then O2SmT
yuandian(a * 30 + 10, b * 30 + 10) \<K4v['
table(a, b) = 1 7?3WVwo<
For i = 0 To 191 D(,U"e%
If pwin(a, b, i) = True Then HJCm;FG=O
pflag(i) = False md- j{> E
End If Z K,M/a
Next %?!jf>%,z
Else v}'j/r/|
yuandian(c * 30 + 10, d * 30 + 10) ~*'p^Y*
table(c, d) = 1 L7#nFNWb-=
For i = 0 To 191 ?%]'z>5;V
If pwin(c, d, i) = True Then ]Hg}}zd^e
pflag(i) = False q:`iR5`cv
End If d'N(:^&*
Next iMo+1m H
End If t6{#y6 5
'''''' ******** 分值比较算法结束 ******** /R)E=;
checkwin() dw/sk_~2K
End Sub N*dbwH G
Ig63@ l~0
七、绘制棋子 ]]\T@:WO[
1QPzC\l
''***************************************************************************** q.#PV^"e
''** 模块名称: yuandian 15e,1z|
''** FVm9}zYB?
''** 描述: 此函数主要进行电脑棋子的绘制。 c$.?Q"w?w
''** %+nvBT2+<
''***************************************************************************** ,Gw5P oC{
{ q?Pxf^I
Sub yuandian(ByVal x As Integer, ByVal y As Integer) K'_*D'~ o
Dim mycolor As Color 5 ;Bgc_@
Dim g As System.Drawing.Graphics mXOIb< Wz
g = PictureBox1.CreateGraphics 8UI@xh{C
Dim zhx, zhy As Integer =Ii.U.X
zhx = Int((x - 10) / 30) s3rRVV
zhy = Int((y - 10) / 30) ~w,
mycolor = Color.Black PT+m"o+#
Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor) cjx}W\
g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) uw# Lx{9
End Sub ~, K*oXP
查看本文来源