java简易五子棋

作者:倪屁屁
链接:https://zhuanlan.zhihu.com/p/36120496
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

完成五子棋先想想你要什么

1一个界面

2.下棋子

3.判断输赢

4.人机对战

 

第一部分 画一个棋盘

1.要一个界面来放棋盘

2有一个功能选择区域习惯上他应该在最右边

3.最好上面要有画好的格子

起码大概就是这样一副画面

<img src="https://pic4.zhimg.com/v2-8ab61cfce9ad3813a058c10e9b4893fb_b.jpg" data-caption="" data-size="normal" data-rawwidth="1182" data-rawheight="937" class="origin_image zh-lightbox-thumb" width="1182" data-original="https://pic4.zhimg.com/v2-8ab61cfce9ad3813a058c10e9b4893fb_r.jpg">

先想想要什么类

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对象可以在它的任何对象创建之前访问,无需引用任何对象,不需要实例化类就已经存在的属性。并且被共享

用此类来记录初始坐标和大小以及条数

 

<img src="https://pic4.zhimg.com/v2-51602b229ccd768221ce62b09ce1f277_b.jpg" data-caption="" data-size="normal" data-rawwidth="1493" data-rawheight="585" class="origin_image zh-lightbox-thumb" width="1493" data-original="https://pic4.zhimg.com/v2-51602b229ccd768221ce62b09ce1f277_r.jpg">

由此可以写出循环

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 **实例化一个棋盘

并且在构造函数的时候顺便传值

给相应组建添加监听器

 

此时我们先不考虑怎么实现功能

先考虑怎么让电脑把棋子画板的固定焦点上

&amp;lt;img src="https://pic3.zhimg.com/v2-ee7b00a584815e1d7fd5c1938ee7bc2a_b.jpg" data-caption="" data-size="normal" data-rawwidth="1493" data-rawheight="585" class="origin_image zh-lightbox-thumb" width="1493" data-original="https://pic3.zhimg.com/v2-ee7b00a584815e1d7fd5c1938ee7bc2a_r.jpg"&amp;gt;

左上的坐标应该是本框行和列

右上应该是左加一

左下其实是在下一行

右下在下一行下一列

 

我们给每一个星星都加上啊边框

如果如果边框超过行列就加一

&amp;lt;img src="https://pic3.zhimg.com/v2-ef5b169e515a063a03301be02666be26_b.jpg" data-caption="" data-size="normal" data-rawwidth="1493" data-rawheight="585" class="origin_image zh-lightbox-thumb" width="1493" data-original="https://pic3.zhimg.com/v2-ef5b169e515a063a03301be02666be26_r.jpg"&amp;gt;

这样就可以画争取的坐标

现在得到了棋盘我们考虑用一个而且为数组来存储棋子的横纵坐标 也可用来标记棋子的颜色是否有下棋子

接下来你可以来标记 自己的棋子颜色每下一次改变

并且用数组来记录


第三部分

实现功能

1.点击开始给画板添加监听器

2.点击模式选择人机对战

3.完成检查机制

一共有8个方向

&amp;lt;img src="https://pic4.zhimg.com/v2-b8e24047d719fcb3bfe6df828fb2e687_b.jpg" data-caption="" data-size="normal" data-rawwidth="1493" data-rawheight="990" class="origin_image zh-lightbox-thumb" width="1493" data-original="https://pic4.zhimg.com/v2-b8e24047d719fcb3bfe6df828fb2e687_r.jpg"&amp;gt;

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​chessprogramming.wikispaces.com

这里有一个权值算法的介绍

此处每一次都给它的的空位附上数值

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表

遇到多种棋盘形式

转载于:https://www.cnblogs.com/ttnrt/p/11086623.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值