定义canvas及黑白棋变量
<font color="#2f4f4f" face="微软雅黑" size="3">var canvas
var context
var isWhite = true//设置是否该轮到白棋
var isWell = false//设置该局棋盘是否赢了,如果赢了就不能再走了
var img_b = new Image()
img_b.src = "images/b.png"//白棋图片
var img_w = new Image()
img_w.src = "images/c.png"//黑棋图片</font>
为棋盘的二维数组用来保存棋盘信息
<font color="#2f4f4f" face="微软雅黑" size="3">var chessData = new Array(15)//初始化0为没有走过的,1为白棋走的,2为黑棋走的
for (var x = 0x <15x++) {
chessData[x] = new Array(15)
for (var y = 0y <15y++) {
chessData[x][y] = 0
}
}</font>
绘制棋盘的线
<font color="#2f4f4f" face="微软雅黑" size="3"> for (var i = 0i <= 640i += 40) {
context.beginPath()
context.moveTo(0, i)
context.lineTo(640, i)
context.closePath()
context.stroke()
context.beginPath()
context.moveTo(i, 0)
context.lineTo(i, 640)
context.closePath()
context.stroke()
}
}</font>
判断该棋局的输赢
<font color="#2f4f4f" face="微软雅黑" size="3">if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) {
if (chess == 1) {
alert("白棋赢了")
}
else {
alert("黑棋赢了")
}
isWell = true//设置该局棋盘已经赢了,不可以再走了
}</font>
html代码:
<font color="#2f4f4f" face="微软雅黑" size="3"><body onload="drawRect()">
<div>
<canvas width="640" id="canvas" onmousedown="play(event)" height="640">你的浏览器不支持HTML5 canvas ,请使用 google chrome 浏览器 打开.
</canvas>
</div>
</body></font>
现在目前缺少一场真正的顶级ai和顶级人类的对战,但后来询问多位 五子棋 资深人士所讲,人类还是占上风的。下面我给你介绍五子棋AI与人对决是什么水平,欢迎阅读。
五子棋AI现存的技术已经可做到了,但是现存的五子棋AI程序显然是不行的,swap2有一万种 方法 可以骗死YIXIN和TITO,所以这里对计算机的AI做个定义
什么是五子棋AI
1.拥有正常数量的开局存储,不用特别细,几千手就足够,几千手不是很多吧,随便一个地毯就上万的.
2.五子棋AI正规比赛还是有很多规则的,它必须提前知道对面要拿什么规则和他玩,然后对此做过准备,不用特别多,改不超过50行代码吧,这个数量不到yixin的1%
3.它必须要有正常的计算资源,E5这种犯规的就不提了,4核I7还是挺常见的吧
4.它必须和人类有同样的时限,而且人类在比赛之前不能和它已经大战三百回合
那么人类已经不能和五子棋AI好好游戏了.
五子棋AI与人对决是什么水平
现在看起来可以玩是因为这AI不是为了和你下棋而设计的,它是为了和其他五子棋AI玩gomocup才弄出来的,和人玩五子棋与和电脑玩的策略是完全不一样的,你不能说对它赢比输多就证明人能赢AI,因为如果写五子棋AI的目的是和人玩,那作者很多地方根本就不会这么写,更不会放着巨大的漏洞给你出骗招,真要和人比一比,比就比随怕随,核心的计算部分一点都不用动,就改点评价参数,再弄出一两个策略就行,比如故意走谱上不常见的分支,比如故意把局面引向对攻,引向大规模计算,就算人能算得清楚,AI最后拍表也能把人拍死.
而做这种改动在代码里就是改几个数字的问题而已
山口RIF和某种叫一手交换的村规,人都没戏.因为根据定义1,前几步它全知道,走到一半它觉得差不多就可以脱谱,下谁也没见过的棋,溪月7打打出几个你下都没下过的地方,就算是它劣势,世界第一也不见得每步都能下对,请问你如何是好.哦听说现在世界第一是汪清清了,那就更不可能了.
SWAP2,计算机先手人没戏,人先手可能可以骗赢(毕竟3子开局太多不可能提前存),以前歪果仁构造出过一个轻松骗赢软件的例子,不过那还是因为没做过特化,如果让AI对所有没见过的局面都后手连下2步,那估计就变成人不能玩了.
另外说一句,五子棋AI的发展正处于并将长期处于社会主义初级阶段,很多东西其实是金玉其外败絮其中的,花点时间改改,提升200个elo根本不成问题.
gomocup的比赛结果
2006年,第一届人机大战,捷克顶级选手跟当时顶级的ai下的结果是一胜一平一负(下得都是平衡开局)。
2011年,第二届人机大战捷克顶级选手跟当时顶级的ai下的结果是5:3,AI赢(下得都是平衡开局)。
而2012年中国的弈心才出现在Gomocup里,把其余的AI都给虐了(也就是当年打败人类的那些软件),连续三年遥遥领先。2014年更是以153:9的悬殊比分赢了其余的ai。照这么说,AI应该能够赢得过顶级的人类棋手。
但弈心的官网里,作者孙锴称:
相比电脑象棋,电脑五子棋的发展是缓慢的。顶级五子棋程序依旧无法超越最强的人类的棋手。
这话就让人糊涂了。后来我猜测理解这可能背后有其他的隐含含义:
相比电脑象棋,电脑五子棋的发展是缓慢的。(在弈心出来之前,)顶级五子棋程序依旧无法超越最强的人类的棋手。
但其实考证后,真实的含义是
相比电脑象棋,电脑五子棋的发展是缓慢的。顶级五子棋程序依旧无法超越最强的人类的棋手(捷克那批棋手太菜了)。
人工智能也就是所谓的AI(Artificial Intelligence) 是一门很抽象的技术 AI程序的编写不需要依据任何既定的思考模式或者规则 尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作 我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力 而我们的所有的研究也应该围绕着这一方向 主体是策略类的人工智能
策略类人工智能可以说是AI中比较复杂的一种 最常见的策略类AI游戏就是棋盘式游戏 在这类游戏中 通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况 并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数 然后再决定出一个最佳走法 下面先介绍一下五子棋的AI构想
五子棋的AI构想
有句话叫 当局者迷 旁观者清 但这句话在由AI所控制的计算机玩家上是不成立的 因为计算机必须知道有那些获胜方式 并计算出每下一步棋到棋盘上任一格子的获胜几率 也就是说 一个完整的五子棋的AI构想必须 能够知道所有的获胜组合
建立和使用获胜表
设定获胜的分数
使电脑具有攻击和防守的能力
一 求五子棋的获胜组合
在一场五子棋的游戏中 计算机必须要知道有那些的获胜组合 因此我们必须求得获胜组合的总数 我们假定当前的棋盘为 *
( )计算水平方向的获胜组合数 每一列的获胜组合是 共 列 所以水平方向的获胜组合数为 * =
( )计算垂直方向的获胜组合总数 每一行的获胜组合是 共 行 则垂直方向的获胜组合数为 * =
( )计算正对角线方向的获胜组合总数 正对角线上的获胜组合总数为
+( + + + + )* =
( )计算反对角线方向的获胜组合总数 反对角线上的获胜组合总数为 +( + + + + )* = 这样所有的获胜组合数为 + + + =
二 建立和使用获胜表
我们已经计算出了一个 * 的五子棋盘会有 种获胜方式 这样我们可以利用数组建立获胜表 获胜表的主要作用是 判断当前的获胜方式是否有效 判断当前的获胜方式中到底有多少子落入该获胜组合中 详细的使用您将在后面的程序中可以看出
三 分数的设定
在游戏中为了让计算机能够决定下一步最佳的走法 必须先计算出计算机下到棋盘上任一空格的分数 而其中最高分数便是计算机下一步的最佳走法
原理 我们判定当前讨论的空格与当前讨论的点有几种获胜的方式 有几种该空格就加几分 这种原理初听起来似乎是无法入手 没关系 当您了解我们后面的程序后您就会明白这种决策原理了
这种决策有一些缺陷 因为如果只根据这个模型设计 就有可能出现电脑或玩家有三个子连成一线的时候 计算机却判断不出 它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守 没关系我们完全可以通过一个加强算法来改变当前的分值情况 也就是说当电脑或玩家有三个子或四个子连成一线时 我们通过加强算法将当前与三个子或四个子有关的空格的分值提高 从而可以弥补这一缺憾
四 攻击与防守
以上的方式 事实上计算机只是计算出了最佳的攻击位置 为了防守我们还应计算当前玩家的最佳的攻击位置 这样有什么用呢?道理很简单 如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数 那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻 否则计算机便将棋子下在自己的最佳攻击位置上进行攻击
事实上 这个AI构想是很强大的如果你不是很厉害的五子棋高手的话 可能很快会被计算机打败 我在联众上可是中级棋手啊 跟这种构想打的时候胜率也不是很高
使用编写五子棋
一 编写前的准备
用计算机的思想描述整个下棋的过程
考虑步骤
( )为了简便我们可以先让电脑先走第一步棋 电脑每走一步就会封掉许多玩家的获胜可能情况
( )当玩家走棋的时候我们首先应该考虑玩家走棋的合法性
( )如果合法 那么玩家也会封掉许多电脑的获胜的可能情况
( )电脑的思考路径 首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值 是进行加强赋值 否则进行普通的赋值
( )比较当前玩家和电脑谁的分值最大 将分值最大的点作为电脑的下一步走法
利用窗体和图形工具建立五子棋的棋盘界面
( )添加一个picturebox控件
作用 使用picturebox控件绘制棋子和棋盘
( )添加一个label控件
作用 显示当前的获胜标志 也就是当某一方获胜或和棋时显示此标签
( )添加一个mainmenu控件
作用 控制游戏的开始或结束
( )添加一个mediaplay组件
作用 使程序可以播放音乐
设置整体框价
我们采取 * 的棋盘 为主要的平台 利用数组定义整个棋盘桌面 利用数组定义获胜组合以及获胜标志等
二 声明全局数组和变量
定义虚拟桌面
Dim table( ) As Integer定义当前玩家桌面空格的分数
Dim pscore( ) As Integer定义当前电脑桌面空格的分数
Dim cscore( ) As Integer定义玩家的获胜组合
Dim pwin( ) As Boolean定义电脑的获胜组合
Dim cwin( ) As Boolean定义玩家的获胜组合标志
Dim pflag( ) As Boolean定义电脑的获胜组合标志
Dim cflag( ) As Boolean定义游戏有效标志
lishixinzhi/Article/program/ASP/201311/21668
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)