五子棋小游戏和简单AI思路

//若有错误请指出

首先最重要的是储存五子棋的状态,标准棋盘是15*15的,那么我们用一个二维int数组如arrChessBoard【】【】,用012分别表示空黑白即可,在棋盘上添加棋子后在数组中加上数据即可。

为了实现悔棋功能,我们可以用另外一个一维数组arrStep【】来记录每一步记录,简单起见每下一步往数组中push两个数据,分别为i,j,即当前步数的坐标,也就是说数组的大小刚好是已下步数的两倍。这样的话在悔棋时直接pop两个末尾数据,记得在原数组arrChessBoard【】【】中也消去对应数据。拥有了arrStep数组后,也可以实现棋局重现和储存棋局到本地的功能(将arrStep储存为本地xml或txt即可)。

判定输赢功能,这里提供一种字符串对比的思路,落棋后,以横向为例,从当前点(i-4)到(i+4)一共9个点,将从arrChessBoard数组中取出的int值合并为字符串str,(请注意处理数组越界空指针问题)若str.indexof(five)> 0,则表示在str字符串中存在连续5个棋子,即五子连珠。另外该思路也在单机AI有所应用。

另外,也可以用临时int tempTotal=0来记录,遇到非本方棋子后重置为0,否则tempTotal ++1。若读取到tempTotal>4,则五子连珠。

AI方面,首先创建两个数组arrAIWeight【】【】和arrPlayerWeight【】【】,AI在每一次AIMove()的时候,遍历15*15的arrChessBoard,两个数组都在每一个点储存三个数据,即权重和两个坐标(weight,i,j),两个数组都有各自的side属性因此每个点都有不同的权重值。若遍历到不是空位则权重设为0,意为不再考虑落该点。

若遍历到为空棋位,则对该点计算权重getScore(),该点从4个方向开始考虑,读取到每个方向的状况转化为字符串后(比如010121100),将字符串在权重表中索引,比如权重表中FIVE为五子连珠,为11111或22222(1和2分别表示黑棋白棋),在先前的字符串 str = 010121100中,str.inddexof(11111). 没有连续的11111和22222,则匹配失败并开始下个匹配直到结束。

每个方向的权重相加后返回到数组中。两个数组arrAIWeight【】【】和arrPlayerWeight【】【】都有各自15*15的权重点并以{weight,i,j)储存。以weight为关键字对数组排序得到黑棋和白棋各自最大的权重点,比较后AI落点在最大权重点以实现防守和攻击。

附上权重表,语言为actionscript 3.0,源自网络。

//以下注释中 * 为本方棋子,o 为对方棋子,_ 为空格。012分别对应空,黑,白棋。
// *****

var five:String = (side * 11111).toString();
// _****
var four:String = "0" + (side * 1111).toString() + "0";
// _***_
var three:String = "0" + (side * 111).toString() + "0";
// _**_
var two:String = "0" + (side * 11).toString() + "0";
// _*_*_
var jtwo:String = "0" + (side * 101).toString() + "0";
// ****_
var lfour:String = otherside.toString() + (side * 1111).toString() + "0";
// _****
var rfour:String = "0" + (side * 1111).toString() + otherside.toString();
// *_***
var l_four:String = (side * 10111).toString();
// ***_*
var r_four:String = (side * 11101).toString();
// o***_
var lthree:String = otherside.toString() + (side * 111).toString() + "0";
// _***o
var rthree:String = "0" + (side * 111).toString() + otherside.toString();
// o**_
var ltwo:String = otherside.toString() + (side * 11).toString() + "0";
// _**o
var rtwo:String = "0" + (side * 11).toString() + otherside.toString();
// ***_o
var rfthree:String = (side * 111).toString() + "0" + otherside.toString();
// o_***
var lfthree:String = otherside.toString() + "0" + (side * 111).toString();


const STWO:int = 2;//眠二
const FTWO:int = 4;//假活二
const STHREE:int = 5;//眠三
const TWO:int = 8;//活二
const SFOUR:int = 12;//冲四
const FTHREE:int = 14;//假活三
const THREE:int = 40;//活三
const FOUR:int = 90;//活四
const FIVE:int = 200;//五连

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值