zoukankan      html  css  js  c++  java
  • 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​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表

    遇到多种棋盘形式

  • 相关阅读:
    2019暑假集训 windy数
    2019暑假集训 数字游戏
    2019暑假集训 周年纪念晚会
    2019暑假集训 加分二叉树
    0013-求圆柱体体积
    0012-求滑动距离
    0011-绝对值函数
    0010-温度转换
    0009-乘法问题
    0008-三位数倒序问题
  • 原文地址:https://www.cnblogs.com/ttnrt/p/11086623.html
Copyright © 2011-2022 走看看