五子棋小游戏和简单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;//五连

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值