分享
 
 
 

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

王朝c#·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

三、初始化游戏

'*****************************************************************************

'** 模块名称: initplayenvironment

'**

'** 描述: 此函数主要功能如下:

'** 1. 设置背景音乐。

'** 2. 设置游戏状态有效。

'** 3. 初始化游戏状态标签。

'** 4. 直接指定电脑的第一步走法。

'** 5. 初始化基本得分桌面。

'** 6. 电脑和玩家获胜标志初始化。

'** 7. 初始化所有获胜组合。

'** 8. 重新设定玩家的获胜标志。

'**

'*****************************************************************************

Sub initplayenvironment()

player.FileName = ".\music\zhyu01.mid"

player.Play()

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

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. 执行检查获胜函数。

'** 5. 执行电脑算法函数。

'**

'*****************************************************************************

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

五、获胜检查算法

'*****************************************************************************

'** 模块名称: checkwin

'**

'** 描述: 此模块执行以下功能:

'** 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

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

'**

'** 描述: 此程序主要执行以下功能:

'** 1. 初始化赋值系统。

'** 2. 赋值加强算法。

'** 3. 计算电脑和玩家的最佳攻击位。

'** 4. 比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。

'** 5. 执行检查获胜函数。

'**

'*****************************************************************************

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

''' ******** 电脑加强算法结束 ********

' ******** 赋值系统 ********

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

''' ******** 赋值系统结束 ********

''' ******** 分值比较算法 ********

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有