五子棋游戏编程(VB)

五子棋的AI概念里有一句话叫“当局者迷,旁观者清。”但这句话对于AI控制的电脑玩家来说并不成立,因为电脑必须知道赢的方式,并计算出每下一步移动到棋盘上任意一格的赢概率。也就是说,一个完整的五子棋AI概念必须:

1,可以知道所有中奖组合;2.建立和使用获奖表;3.设置获胜分数;4.使计算机具有攻击和防御的能力;首先,找出五子棋的获胜组合。在一个五子棋游戏中,计算机必须知道有哪些获胜的组合,所以我们必须找出获胜组合的总数。我们假设当前棋盘是10*10。(1)计算水平方向的中奖组合数,每列的中奖组合数为:6,* * 10,所以水平方向的中奖组合数为:6*10=60 (2)计算垂直方向的中奖组合总数,每行的中奖组合数为:6,* * 60。则垂直方向的中奖组合数为6*10=60 (3)计算正对角线方向的中奖组合总数,即6+(5+4+3+2+1)*2=36 (4)计算反对角线方向的中奖组合总数,即6。这样,所有中奖组合的号码为:60+60+36+36=192。第二,建立和使用获奖表。我们计算过,一个10*10的五子棋会有192种获胜方式,这样我们就可以用数组来建立获胜表。中奖表的主要功能有:65438。2.判断当前中奖方式中有多少孩子落入中奖组合。你将在后面的程序中看到详细的用法。三、分数的设定在游戏中,为了让计算机决定下一步的最佳走法,需要先计算出计算机下到棋盘的任意一格的分数,分数最高的就是计算机下一步的最佳走法。原理:我们判断有几种方法可以拿下讨论空间和讨论点,给讨论空间加几个点。这个原理一开始好像是不可能的,没关系,等你理解了我们后面的程序你就明白这个决策原理了。这种决策是有一定缺陷的,因为如果只是按照这种模型来设计,可能会出现当计算机或者玩家有三个孩子连成一条线的时候,计算机无法判断,认为其他一些空间是目前最佳的获胜位置,不攻不守。没关系。我们完全可以通过一个强化算法来改变现在的分数。也就是说,当一台计算机或者一个玩家有三四个孩子在一条线上时,我们可以通过强化算法来提高与这三四个孩子相关的空间的得分,从而弥补这个缺点。第四,攻防方式,其实电脑只是计算了最佳进攻位置,为了防守,我们也要计算当前球员的最佳进攻位置。有什么用?原因很简单。如果玩家的最佳攻击位置的得分大于计算机的最佳攻击位置的得分,那么计算机将把下一个棋子放在玩家的最佳攻击位置上以停止玩家的攻击,否则计算机将把棋子放在自己的最佳攻击位置上进行攻击。其实这个AI思想是很厉害的。如果你不是一个很厉害的五子棋高手,可能很快就会被电脑打败。我是联众的中级棋手,用这种思路下,胜率不是很高。用VB.NET写五子棋1。写前准备:1。用计算机的思想描述下棋的全过程。需要考虑的步骤:(1)为了简单起见,我们可以让计算机先走第一步,计算机的每一步都会挡住很多玩家的获胜可能性。(2)棋手走棋,首先要考虑棋手走棋的合法性。(3)如果是合法的,那么玩家也会封杀多台电脑中奖的可能。(4)计算机的思维路径:首先判断当前玩家和计算机的所有获胜组合是否需要加强和赋值。

是强化作业,还是普通作业。(5)比较当前玩家和得分最高的电脑。取得分最大的点作为计算机的下一步。2.用VB.NET表单和图形工具建立五子棋的棋盘界面(1)。添加一个picturebox控件:使用picturebox控件绘制棋子和棋盘。(2)添加一个标签控件:显示当前获胜的标志,即当一方获胜或平局时显示这个标签。(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定义玩家获胜组合:dimpwin (9,9,191) as boolean定义计算机获胜组合:dimcwin (9,9,1965438

Dimcflag (191)作为Boolean定义游戏的有效符号:Dim theplayflag作为Boolean III。初始化游戏' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '

* *模块名称:initplayenvironment

'**

* *说明:该功能的主要功能如下:

** 1.设置背景音乐。

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

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

** 4.直接指定计算机的第一步。

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

** 6.电脑和玩家中奖标志的初始化。

** 7.初始化所有赢的组合。

** 8.重置玩家的获胜标志。

'**

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

Sub initplayenvironment()

玩家。文件名= "。\music\zhyu01.mid "

玩家。播放()

theplayflag = True

游戏是有效的

Label1。可见=假

不显示游戏状态标签。

PictureBox1。刷新()

清空picturebox1的内容。

原点(130,130)

调用画图函数画出当前计算机先去的位置。

将I,j,m,n表示为整数

对于i = 0到9

对于j = 0到9

表(I,j) = 0

然后

然后

桌面初始化

对于i = 0到191

pflag(i) = True

cflag(i) = True

然后

获胜标志的初始化

表(4,4) = 1

因为我们先设置了电脑,并且下载了4或4位数,所以将其值设置为1。

* * * * * *初始化获胜组合* * * * * * * *。

n = 0

对于i = 0到9

对于j = 0到5

对于m = 0到4

pwin(j + m,I,n) = True

cwin(j + m,I,n) = True

然后

n = n + 1

然后

然后

对于i = 0到9

对于j = 0到5

对于m = 0到4

pwin(i,j + m,n) = True

cwin(i,j + m,n) = True

然后

n = n + 1

然后

然后

对于i = 0到5

对于j = 0到5

对于m = 0到4

pwin(j + m,i + m,n) = True

cwin(j + m,i + m,n) = True

然后

n = n + 1

然后

然后

对于i = 0到5

对于j = 9到4步-1

对于m = 0到4

pwin(j - m,i + m,n) = True

cwin(j - m,i + m,n) = True

然后

n = n + 1

然后

然后

* * * * * *初始化获胜组合结束* * * * * * * *

对于i = 0到191

如果pwin(4,4,i) = True,则

pflag(i) = False

如果…就会结束

然后

因为电脑已经下载了4或4位数,我们需要重新设置玩家的中奖logo。

末端接头

第四,处理鼠标事件' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '

* *模块名称:themousedown

'**

* *说明:该功能主要完成以下功能:

** 1.确定当前游戏标志是否有效。

** 2.将实际坐标转换成虚拟坐标。

** 3.画玩家的棋子。

** 4.执行检查获胜功能。

** 5.执行计算机算法功能。

'**

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

Sub themousedown(ByVal x为整数,ByVal y为整数)

如果播放标志=假,则

出口接头

如果…就会结束

检查游戏状态是否有效。

Dim i,j为整数

Dim zhx,zhy为整数

zhx = Int((x - 10) / 30)

zhy = Int((y - 10) / 30)

对于i = 0到9

对于j = 0到9

If表(zhx,zhy)>那么0

出口接头

如果…就会结束

然后

然后

检查当前鼠标点击的网格是否有效。

暗淡我的颜色作为颜色

Dim g As系统。绘画。图形

g = PictureBox1。创建图形

mycolor =颜色。怀特(姓氏)

暗刷1作为系统。drawing . Brush = New solid Brush(my color)

g.FillEllipse(刷1,zhx * 30 + 10,zhy * 30 + 10,30,30)

画玩家的棋子

表(zhx,zhy) = 2

对于i = 0到191

如果cwin(zhx,zhy,i) = True,则

cflag(i) = False

如果…就会结束

然后

重置计算机的获奖标志

checkwin()

检查当前玩家是否获胜。

电脑()

调用计算机算法

End Sub V. Winning检查算法。'*****************************************************************************

* *模块名称:checkwin

'**

* *说明:该模块执行以下功能:

** 1.检查是否是平局。

** 2.检查计算机是否获胜。

** 3.检查玩家是否获胜。

'**

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

Sub checkwin()

将I,j,k,m,n表示为整数

将ca标注为整数

将pa标注为整数

Dim cnormal为整数= 0

对于i = 0到191

如果cflag(i) = False,则

cnormal = cnormal + 1

如果…就会结束

然后

如果cnormal = 190,则

Label1。可见=真

Label1。Text = "画,请重新开始!"

PictureBox1。刷新()

theplayflag = False

出口接头

如果…就会结束

设置绘制规则

对于i = 0到191

如果cflag(i) = True,则

ca = 0

对于j = 0到9

对于k = 0到9

如果table(j,k) = 1,则

如果cwin(j,k,i) = True,则

ca = ca + 1

如果…就会结束

如果…就会结束

然后

然后

如果ca = 5,则

Label1。可见=真

Label1。Text = "计算机获胜,请重新开始"

PictureBox1。刷新()

theplayflag = False

出口接头

如果…就会结束

如果…就会结束

然后

检查计算机是否获胜。

对于i = 0到191

如果pflag(i) = True,则

pa = 0

对于j = 0到9

对于k = 0到9

如果表(j,k) = 2,则

如果pwin(j,k,i) = True,则

pa = pa + 1

如果…就会结束

如果…就会结束

然后

然后

如果pa = 5,则

Label1。可见=真

Label1。Text = "玩家赢了,请重新开始"

PictureBox1。刷新()

theplayflag = False

出口接头

如果…就会结束

如果…就会结束

然后

检查玩家是否获胜。

结束第六节。“计算机算法”* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。

* *模块名称:电脑

'**

* *说明:该程序主要完成以下功能:

** 1.初始化分配系统。

** 2.分配增强算法。

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

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

** 5.执行检查获胜功能。

'**

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *短接电脑()

将I,j,k,m,n表示为整数

将dc调成整数

将cab调成整数

将pab标注为整数

对于i = 0到9

对于j = 0到9

pscore(i,j) = 0

cscore(i,j) = 0

然后

然后

初始化赋值数组。

* * * * * *计算机增强算法* * * * * *

对于i = 0到191

如果cflag(i) = True,则

cab = 0

对于j = 0到9

对于k = 0到9

如果table(j,k) = 1,则

如果cwin(j,k,i) = True,则

cab = cab + 1

如果…就会结束

如果…就会结束

然后

然后

选择案例驾驶室

案例3

对于m = 0到9

对于n = 0到9

如果table(m,n) = 0,则

如果cwin(m,n,i) = True,则

cscore(m,n) = cscore(m,n) + 5

如果…就会结束

如果…就会结束

然后

然后

案例4

对于m = 0到9

对于n = 0到9

如果table(m,n) = 0,则

如果cwin(m,n,i) = True,则

原点(m * 30 + 10,n * 30 + 10)

table(m,n) = 1

对于dc = 0到191

如果pwin(m,n,dc) = True,则

pflag(dc) = False

checkwin()

出口接头

如果…就会结束

然后

如果…就会结束

如果…就会结束

然后

然后

结束选择

如果…就会结束

然后

对于i = 0到191

如果pflag(i) = True,则

pab = 0

对于j = 0到9

对于k = 0到9

如果表(j,k) = 2,则

如果pwin(j,k,i) = True,则

pab = pab + 1

如果…就会结束

如果…就会结束

然后

然后

选择案例pab

案例3

对于m = 0到9

对于n = 0到9

如果table(m,n) = 0,则

如果pwin(m,n,i) = True,则

pscore(m,n) = pscore(m,n) + 30

如果…就会结束

如果…就会结束

然后

然后

案例4

对于m = 0到9

对于n = 0到9

如果table(m,n) = 0,则

如果pwin(m,n,i) = True,则

原点(m * 30 + 10,n * 30 + 10)

table(m,n) = 1

对于dc = 0到191

如果pwin(m,n,dc) = True,则

pflag(dc) = False

checkwin()

出口接头

如果…就会结束

然后

如果…就会结束

如果…就会结束

然后

然后

结束选择

如果…就会结束

然后

* * * * * *计算机增强算法结束* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

对于i = 0到191

如果cflag(i) = True,则

对于j = 0到9

对于k = 0到9

如果table(j,k) = 0,则

如果cwin(j,k,i) = True,则

对于m = 0到9

对于n = 0到9

如果table(m,n) = 1,则

如果cwin(m,n,i) = True,则

cscore(j,k) = cscore(j,k) + 1

如果…就会结束

如果…就会结束

然后

然后

如果…就会结束

如果…就会结束

然后

然后

如果…就会结束

然后

对于i = 0到191

如果pflag(i) = True,则

对于j = 0到9

对于k = 0到9

如果table(j,k) = 0,则

如果pwin(j,k,i) = True,则

对于m = 0到9

对于n = 0到9

如果表(m,n) = 2,则

如果pwin(m,n,i) = True,则

pscore(j,k) = pscore(j,k) + 1

如果…就会结束

如果…就会结束

然后

然后

如果…就会结束

如果…就会结束

然后

然后

如果…就会结束

然后

* * * * * *分配系统结束* * * * * *

* * * * * *分数比较算法* * * * * *

将a、b、c、d标注为整数

将cs显示为整数= 0

将ps调成整数= 0

对于i = 0到9

对于j = 0到9

If cscore(i,j)>那么cs

cs = cscore(i,j)

a = i

b = j

如果…就会结束

然后

然后

对于i = 0到9

对于j = 0到9

If pscore(i,j)>ps那么

ps = pscore(i,j)

c = i

d = j

如果…就会结束

然后

然后

如果cs & gtps那么

原点(a * 30 + 10,b * 30 + 10)

表(a,b) = 1

对于i = 0到191

如果pwin(a,b,i) = True,则

pflag(i) = False

如果…就会结束

然后

其他

原点(c * 30 + 10,d * 30 + 10)

表(c,d) = 1

对于i = 0到191

如果pwin(c,d,i) = True,则

pflag(i) = False

如果…就会结束

然后

如果…就会结束

‘* * * * * *分数比较算法结束* * * * * *。

checkwin()

结束第七小节。‘画棋子’* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。

* *模块名称:原点

'**

* *说明:该功能主要用于绘制电脑棋子。

'**

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *小数点(ByVal x为整数,ByVal y为整数)

暗淡我的颜色作为颜色

Dim g As系统。绘画。图形

g = PictureBox1。创建图形

Dim zhx,zhy为整数

zhx = Int((x - 10) / 30)

zhy = Int((y - 10) / 30)

mycolor =颜色。黑色

暗刷1作为系统。drawing . Brush = New solid Brush(my color)

g.圆角(刷1,zhx * 30 + 10,zhy * 30 + 10,30,30)

末端接头