一个游戏首先从设计界面开始
每个按钮添加ActionListner监听
在GameMouse类中对过对actionPerformed方法的重新来判断当前是哪个按钮按下,并实现对应的功能
监听器
a.事件源:当前动作所发生的组件
b.确定监听器方法:鼠标监听器方法
c.绑定处理类
给窗口添加鼠标监听器方法
注意:由于接口不能创建对象,重新定义类继承(实现)接口,重写接口中的抽象方法
单纯使用JFrame存在一个问题,就是当我们移动窗口或窗口产生改变时,之前画在窗口组件上的画面就消失不见了
原因是每当窗口组件受到影响或发生改变时,都会自动的调用其paint函数,这时候画面就会被刷新,之前画的东西就不见了
为了解决这个问题,我们需要自定义一个自己的窗口类MyFrame,继承JFrame,通过重写JFrame的paint方法来解决此问题
1、首先要将棋子黑白交替的画在棋盘的交点上
首先mouseClicked类传进的参数为MouseEvent e
调用e.getX();e.getY();方法可以得到鼠标点击的位置坐标
由于玩家在玩游戏时点击的位置不一定正好是棋盘交点的位置,但是我们可以简单的计算出鼠标点击位置最近的焦点,只需要计算出这个位置最近的
交点是第几行和第几列就可以了
用当前坐标x-原点X0 对棋子的大小SIZE取余,如果这个值大于棋子大小SIZE/2 则判断横坐标xx=(x-X0)/SIZE+1
否则判断横坐标xx=(x-X0)/SIZE
y坐标同理 代码如下
2、交替画黑白棋
交替画黑白棋只需要加入一个flag标志,每次判断这个标志
如果flag为true则画黑棋,将数组赋值为1
如果flag为false则画白棋,将数组赋值为2
每次画完棋后,将flag取反
代码如下
判断输赢通过遍历数组实现,在上述讲解中我们知道,整个棋局的情况都存储在二维数组arrChess[][]中
若arrChess[3][5]=1,就说明第三行第五列这个位置上为黑棋
所以通过遍历这个数组我们就可以掌握整个棋局从而对输赢做出判断
五子棋在横着、竖着、斜着三个方向任意一个方向上连成五个相同颜色的棋子都可以获胜
这里将三个方向分为四种情况判断,
第一种情况:棋子横向连珠的数目,也就是一个棋子向左找,向右找,和自己颜色相同的数目和
第二种情况:棋子纵向连珠的数目,一个棋子向上找和向下找,和自己颜色相同的数目和
第三种情况:棋子正对角线连珠的数目,一个棋子向右上方找、左下方找和自己颜色相同的数目和
第四种情况:棋子反对角线连珠的数目,一个棋子向左上方找、右下方找和自己颜色相同的数目和
第一种情况:棋子横向连珠的数目,也就是一个棋子向左找,向右找,和自己颜色相同的数目和
代码如下
第二种情况:棋子纵向连珠的数目,一个棋子向上找和向下找,和自己颜色相同的数目和
代码如下
第三种情况:棋子正对角线连珠的数目,一个棋子向右上方找、左下方找和自己颜色相同的数目和
第四种情况:棋子反对角线连珠的数目,一个棋子向左上方找、右下方找和自己颜色相同的数目和
上面展示了黑棋获胜的判断方法 白棋获胜的判断方法同理
4、AI电脑下棋 实现人机对战
人机对战使用权值算法来实现,通过对棋局情况的判断,自己设定好每种情况权值的大小
电脑以防守为主
权值设置如下
简单解释一下 1112代表三个黑棋一个白棋 权值为4000
而11112代表四个黑棋和一个白棋 这种情况显然更危险,权值设置为6000
人机下棋的思路主要是,遍历棋盘上每个空位置周围的棋局情况
因为机器可以选择任何一个空位置下棋
每个空位置周围的棋局情况一定对应已经设置好的权值中的一个,如果一个位置周围有多个权值对应
则把他们权值相加综合判断
当确定好每个空位置的权值后,选择权值最大的也就是最危险的位置下棋,已实现防守
ai算法的时候和使用到了前面判断输赢的方法,总体原理和之前判断输赢相同
只不过多了一步计算权值
权值表存储在HashMap中,遍历的过程将每个空位周围有棋子的情况用字符串存储起来
最后在通过从HashMap中查找对应的权值来找到该位置的权值 Integer value=hm.get(s);
实现代码如下
游戏过程如下
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/17143.html