自制五子棋

[list]
[*]实现五子棋人机对战
1,继承JFrame类。
首先创建一个界面,用来放棋盘。设置窗体的各属性,在界面上画线,有线的地方作为棋盘。对棋盘大小,棋子大小,棋盘上行数,列数等都要进行设置。这里的画线要在对父类JFrame的paint函数的重写方法中。这样就可以一直可见棋盘。而且在paint的重写方法中,还要对画棋子进行重写,这样每次下的棋子也就能得到保存。
在棋盘上方还可以添加菜单栏,对菜单栏下的选项添加监听器。这样就可以让用户对下棋流程进行控制。

2,设置下棋子的条件。
人机对战,用户先下子,设置用户下黑子,计算机下白子。用一个计数器计算当前下了的棋子的数目count。每当count%2==0时就让用户下棋,否则计算机下棋。每下一颗棋子,进行一次判断,看是否有五子连珠。
用户下棋时会点到棋盘上非焦点的地方。那就要对用户点击的位置进行判断。得到点击处的横纵坐标,用它们分别对棋盘格子大小取余,如果都小于误差范围或者都大于(格子大小-误差范围),那么就讲坐标点改到距离最近的焦点上。再判断这个焦点是否还是空(还没下任何棋子,用一个数组存放信息,如果是白子则为2,是黑子则为1,否则为0),是空就在该点画一个黑色的圆,设置该点处信息为1。对当前棋局进行判断,看是否已经有五子连珠了。
接着就是计算机下棋了。设置棋子颜色为白色;count++;对当前棋局进行判断,看应该下哪一个地方才能让黑子不赢,让白字尽快赢。找到该点,在该点画一个白色的圆。判断当前是否有五子连珠。
判断应该下哪一个点的算法:
分析找到白子的数目和附近空格的情况。如:空白白白空;黑白白白空;对空格赋一个权值。白子数目每增加一个,所权值相应乘以10;黑子是一样的赋值方法。只要一反过来的身份来看,两种赋权值方式是相同的。
横向,纵向,左斜方向,右斜方向四个方向分别判断棋子数目,分别赋权值。
横向:用2个变量(a1,a2)存放当前位置的横坐标,2个变量存放当前位置纵坐标。a1--向左找相同的棋子,a2++向右找相同的棋子。记录找到的棋子总数。在继续向两边找空格数,再给当前位置处加上相应的权值,权值累加。
其他三个方向相似的查找与赋值。只是坐标改变方式不同。
把从四个方向分别给当前位置赋得权值加起来。用一个数组存放棋盘上个点的权值,找到权值最大且还是空格的点,在该点下白子。接着判断是否有五子连珠。


3,判断是否五子连珠
横向,纵向,左斜方向,右斜方向分别进行判断。
横向:从当前下的棋子位置向左找,一直找到跟该棋子颜色不相同或者不相连的点,判断是否已经找到有5颗相同的,如果是则输出该颜色的棋子赢了。然后从最后一个棋子向右找,记录总共找到多少个相同且相连的棋子。如果有5颗了,则输出当前下的颜色的棋子赢了。
其他三个方向类似。


[/list]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值