java简易五子棋
链接:https://zhuanlan.zhihu.com/p/36120496
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
完成五子棋先想想你要什么
1一个界面
2.下棋子
3.判断输赢
4.人机对战
第一部分 画一个棋盘
1.要一个界面来放棋盘
2有一个功能选择区域习惯上他应该在最右边
3.最好上面要有画好的格子
起码大概就是这样一副画面
先想想要什么类
1.Jpanel
2.JFrame
3.JButton
4.Jlabel
5.1ButtonGroup//用来装单选框并且只让其中一个被选择
5.JRadioButton()
6Color
7mouselister
8actonmlister
。。。。自己在多想想
首先吧这回个界面规划出来
我会选择用墨的棋盘类来继承Jpanel为了重绘的需要
step1 创建一个窗口类
step2 建立本类对象
step3 设置边框布局
step4 添加按钮
step1 名字 +大小
step2 让初始化被选项目
step5 把组建按部就班的按倒窗口上
step6 画棋盘
简易自己写一个接口把要用的通用值存起来
package 五子棋0422;
public interface net {
public static final int x0=35
}
一个类可以继承多个接口如果没有static的话就可能重名
复习一下里面的public 共有的
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象,不需要实例化类就已经存在的属性。并且被共享
用此类来记录初始坐标和大小以及条数
由此可以写出循环
for(int i=0;i<line;i++){
// 画网格
g2.drawLine(x0 + i * size, y0, x0 + i * size, y0 + line * size);
// 横轴每次向后加一个间隔,纵坐标加为长度;
g2.drawLine(x0, y0 + i * size, x0 + line * size, y0 + i * size);
// 纵轴轴每次向后加一个间隔,横坐标加为长度;
把方法方放到重回里+画棋子方法
第二部分
添加上监听器
监听器需要继承
鼠标和事件监听器
可以直接继承actionapet类
此时在次监听器类里需要接收Jpanel'的画笔以及接收到Jpanel的数组信息
private Mypanel **实例化一个棋盘
并且在构造函数的时候顺便传值
给相应组建添加监听器
此时我们先不考虑怎么实现功能
先考虑怎么让电脑把棋子画板的固定焦点上
左上的坐标应该是本框行和列
右上应该是左加一
左下其实是在下一行
右下在下一行下一列
我们给每一个星星都加上啊边框
如果如果边框超过行列就加一
这样就可以画争取的坐标
现在得到了棋盘我们考虑用一个而且为数组来存储棋子的横纵坐标 也可用来标记棋子的颜色是否有下棋子
接下来你可以来标记 自己的棋子颜色每下一次改变
并且用数组来记录
第三部分
实现功能
1.点击开始给画板添加监听器
2.点击模式选择人机对战
3.完成检查机制
一共有8个方向
public check(int X int Y){
//判断便利数组
for(int i=0;i<length;i++ ){
for(int j=y;j++;){
向右
if(chessarry[i+1][j]){
比较颜色
1如果等于零跳出
2如果颜色不同跳出
3如果颜色相同+1
最结果输出count
}
}
}
一共八个方向
}
1如果结果是5的画输出默契获胜
这里直接调用JOptionPane.showMessageDialog输出
这是简单的人人对战
最后是人机对战
第一阶段用到的是权值算法算法
https://chessprogramming.wikispaces.com/Principal+variation这里有一个权值算法的介绍
此处每一次都给它的的空位附上数值
public void ai() {
for (int i = 0; i < chessValue.length; i++) {
for (int j = 0; j < chessValue[i].length; j++) {
// 向右
if (chessarry[i][j] == 0) {
// 向右
String code = "";//初始化
int color = 0;
for (int k = i + 1; k < chessValue.length; k++) {
if (chessarry[k][j] == 0) {
break;//如果没有棋子
} else {
if (color == 0) {
// 记录右边第一个棋子颜色
color = chessarry[k][j];
code += chessarry[k][j];//把数字编程字符串
} else if (color == chessarry[i][j]) {
code += chessarry[k][j];
} else {
code += chessarry[k][j];
break;
}
}
Integer value = hm.get(code);
if (value != null) {
chessValue[i][j] += value;权值叠加
}
// 重新计算下一个点的权值
code = "";
value = 0;
}
}
最后写一个循环代码来标记一下
最大的数
Ok
这里应用到hash表
遇到多种棋盘形式