五子棋简易AI算法

这篇具有很好参考价值的文章主要介绍了五子棋简易AI算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基本思想:五子棋存在多种连接方式,这也就决定了每一个空位的权值有所不同,我们对五子棋的不同连接方式设置权值,然后遍历棋盘,算出每一个空位上的权值,选择权值最大的空位下棋,所以这个算法的关键就在于:1.设置并且存储不同连接方式及其对应的权值 2.计算棋盘空位上的权值。

二、设置不同连接方式的权值并进行存储

棋子的连接分为活连与死连,假设0代表空位,1代表黑棋,2代表白旗,如010为活连,01(遇到边界)为死连为不同连接方式设置对应权值:

假设0代表空位,1代表黑棋,2代表白旗

权值表(还可以细分)

连接方式 权值 010 50 0110 150 01110 500 011110 3000 020 50 0220 150 02220 500 022220 3000 01 30 011 90 0111 300 01111 3000 02 30 022 90 0222 300 02222 3000

 

设置好权值表后,就要考虑如何存储权值表,因为权值表中的数据是用来后续计算空位总权值所需的。这里我们考虑用哈希表进行存储“连接方式——权值”这样子的键值对

Key-Value : 键值对 

HashMap:

  • 将键值对一起存入 ,可以通过键来查询对应的值

  • 将连子情况作为Key ,权值分作为Value

  • 1: 键不能重复,值可以重复

  • 2: HashMap 存储优势是 查询时是O1的时间复杂度

  • 3: HashMap 存储原理:

    • 1: 用key来计算一个hash值 (当作唯一标识),hash值然后作为下标 ,然后将k-v存储在数组中对应下标位置
  • 操作:

    • 实例化: HashMap<String,Integer> codeMap = new HashMap();
    • 方法: code.put(key,value);/ value = code.get(key);
 static HashMap<String, Integer> codeMap = new HashMap<> ();
    static int[][] codeArrray = new int[16][16];    //创建用来存储权值的二维数组

    // 静态代码块
    static{
        codeMap.put ("010", 50);
        codeMap.put ("0110", 150);
        codeMap.put ("01110", 500);
        codeMap.put ("011110", 3000);

        codeMap.put ("020", 50);
        codeMap.put ("0220", 150);
        codeMap.put ("02220", 500);
        codeMap.put ("022220", 3000);

        codeMap.put ("01", 30);
        codeMap.put ("011", 90);
        codeMap.put ("0111", 300);
        codeMap.put ("01111", 3000);

        codeMap.put ("02", 30);
        codeMap.put ("022", 90);
        codeMap.put ("0222", 300);
        codeMap.put ("02222", 3000);

        Integer integer = codeMap.get ("010");
        System.out.println (integer);
    }

三、遍历表格计算权值

如图一个五子棋盘:

五子棋ai,算法,java

 

尝试计算a、b两个空位处的权值大小,我们可以发现空位处的连接可以往上、下、左、右、左上、右上、左下、右下一共8个方向进行搜索,同时我们再规定一个空位的权值由八个方向的连接带来的权值简单相加得到(规则不唯一)。

对于a,往左的连接为01,权值30;往下的连接为01,权值30;往右下的连接010,权值50,故a处的权值为30+30+50=110

对于b,往左的连接为022,权值90;往上的连接为01,权值30;往左上的连接为011,权值90,故b处的权值为90+30+90=210

有了上面的举例,下面通过遍历计算每一个空位的权值

    private static void getCodeArray(int[][] arr){

        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++){
                int chessNum = arr[i][j];
                // 遍历所有的空格
                if(chessNum == 0){
                    toRight (i, j, arr);    //往右走的权值
                    toLeft(i,j,arr);
                    toUp(i,j,arr);
                    toDown(i,j,arr);
                    toLeftUp(i,j,arr);  //往左上走的权值
                    toRightup(i,j,arr);
                    toLeftDown(i,j,arr);
                    toRightDown(i,j,arr);
                }
            }
        }

    }

上面的代码中往8个方向计算权值,但是方法还未定义,下面以往右和往左上为例

往右:

    private static void toRight(int i, int j, int[][] chessArray){
        // 等于0
        int chessNum = chessArray[i][j];
        // 右边是0/墙 return
        if(j + 1 >= chessArray[i].length || chessArray[i][j + 1] == 0){
            return;
        }
        // 右边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i][j + 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 右边第二颗 0/与第一颗相同的/不同的/墙
        for(int m = j + 2; m < chessArray[i].length; m++){
            int chessNumRn = chessArray[i][m];
            if(chessNumRn != 0){
                if(chessNumR1 == chessNumRn){
                    // 找到相同的就拼接一个棋子标识
                    codeStr += chessNumR1;
                } else if(chessNumR1 != chessNumRn){
                    // 找到不相同的就结束循环
                    break;
                }
            } else{
                // 活连的结尾 就结束循环
                codeStr += "0";
                break;
            }

        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;

    }

往左上:

 private static void toLeftUp(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 左上边是0/墙 return
        if(i - 1 <= -1||j - 1<= -1|| chessArray[i - 1][j - 1] == 0){
            return;
        }
        // 左上边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i - 1][j - 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 左上边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i - 2; k > -1; k--) {
            for (int m = j - 2; m > -1; m--) {
                int chessNumRn = chessArray[k][m];
                if (chessNumRn != 0) {
                    if (chessNumR1 == chessNumRn) {
                        // 找到相同的就拼接一个棋子标识
                        codeStr += chessNumR1;
                    } else if (chessNumR1 != chessNumRn) {
                        // 找到不相同的就结束循环
                        break;
                    }
                } else {
                    // 活连的结尾 就结束循环
                    codeStr += "0";
                    break;
                }

            }
        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

这里无论是往哪个方向,计算出来的权值都需要累加到codeArray对应位置,codeArray是已经定义的存储权值的二维数组

完整代码:文章来源地址https://www.toymoban.com/news/detail-715009.html

package com.zsj0929;
import java.util.HashMap;

public class AI {// 会在类使用的时候初始化
    static HashMap<String, Integer> codeMap = new HashMap<> ();
    static int[][] codeArrray = new int[16][16];

    // 静态代码块
    static{
        codeMap.put ("010", 50);
        codeMap.put ("0110", 150);
        codeMap.put ("01110", 500);
        codeMap.put ("011110", 3000);

        codeMap.put ("020", 50);
        codeMap.put ("0220", 150);
        codeMap.put ("02220", 500);
        codeMap.put ("022220", 3000);

        codeMap.put ("01", 30);
        codeMap.put ("011", 90);
        codeMap.put ("0111", 300);
        codeMap.put ("01111", 3000);

        codeMap.put ("02", 30);
        codeMap.put ("022", 90);
        codeMap.put ("0222", 300);
        codeMap.put ("02222", 3000);

        Integer integer = codeMap.get ("010");
        System.out.println (integer);
    }

    public static void main(String[] args){
        int[][] arr = {
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        };
        // 遍历计算所有可以下棋的地方的权值
        getCodeArray (arr);
        // 获取矩阵中权值最大的位置

        for(int i = 0; i < codeArrray.length; i++){
            for(int j = 0; j < codeArrray[i].length; j++){
                System.out.print (codeArrray[i][j] + "     ");
            }
            System.out.println ();
        }
    }

    private static void getCodeArray(int[][] arr){

        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++){
                int chessNum = arr[i][j];
                // 遍历所有的空格
                if(chessNum == 0){
                    toRight (i, j, arr);    //往右走的权值
                    toLeft(i,j,arr);
                    toUp(i,j,arr);
                    toDown(i,j,arr);
                    toLeftUp(i,j,arr);  //往左上走的权值
                    toRightup(i,j,arr);
                    toLeftDown(i,j,arr);
                    toRightDown(i,j,arr);
                }
            }
        }

    }

    private static void toRightDown(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 右下边是0/墙 return
        if(i + 1 >= chessArray.length||j + 1>=chessArray.length || chessArray[i + 1][j + 1] == 0){
            return;
        }
        // 右下边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i + 1][j + 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 右下边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i + 2; k < chessArray.length; k++) {
            for (int m = j + 2; m < chessArray[i].length; m++) {
                int chessNumRn = chessArray[k][m];
                if (chessNumRn != 0) {
                    if (chessNumR1 == chessNumRn) {
                        // 找到相同的就拼接一个棋子标识
                        codeStr += chessNumR1;
                    } else if (chessNumR1 != chessNumRn) {
                        // 找到不相同的就结束循环
                        break;
                    }
                } else {
                    // 活连的结尾 就结束循环
                    codeStr += "0";
                    break;
                }

            }
        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toLeftDown(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 左下边是0/墙 return
        if(i + 1 >= chessArray.length||j - 1 <= -1 || chessArray[i + 1][j - 1] == 0){
            return;
        }
        // 左下边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i + 1][j - 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 左下边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i + 2; k < chessArray.length; k++) {
            for (int m = j - 2; m >= -1; m--) {
                int chessNumRn = chessArray[k][m];
                if (chessNumRn != 0) {
                    if (chessNumR1 == chessNumRn) {
                        // 找到相同的就拼接一个棋子标识
                        codeStr += chessNumR1;
                    } else if (chessNumR1 != chessNumRn) {
                        // 找到不相同的就结束循环
                        break;
                    }
                } else {
                    // 活连的结尾 就结束循环
                    codeStr += "0";
                    break;
                }

            }
        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toRightup(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 右上边是0/墙 return
        if(i - 1 <= -1||j + 1>=chessArray.length || chessArray[i - 1][j + 1] == 0){
            return;
        }
        // 右上边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i - 1][j + 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 右上边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i - 2; k > -1; k--) {
            for (int m = j + 2; m < chessArray[i].length; m++) {
                int chessNumRn = chessArray[k][m];
                if (chessNumRn != 0) {
                    if (chessNumR1 == chessNumRn) {
                        // 找到相同的就拼接一个棋子标识
                        codeStr += chessNumR1;
                    } else if (chessNumR1 != chessNumRn) {
                        // 找到不相同的就结束循环
                        break;
                    }
                } else {
                    // 活连的结尾 就结束循环
                    codeStr += "0";
                    break;
                }

            }
        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toLeftUp(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 左上边是0/墙 return
        if(i - 1 <= -1||j - 1<= -1|| chessArray[i - 1][j - 1] == 0){
            return;
        }
        // 左上边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i - 1][j - 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 左上边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i - 2; k > -1; k--) {
            for (int m = j - 2; m > -1; m--) {
                int chessNumRn = chessArray[k][m];
                if (chessNumRn != 0) {
                    if (chessNumR1 == chessNumRn) {
                        // 找到相同的就拼接一个棋子标识
                        codeStr += chessNumR1;
                    } else if (chessNumR1 != chessNumRn) {
                        // 找到不相同的就结束循环
                        break;
                    }
                } else {
                    // 活连的结尾 就结束循环
                    codeStr += "0";
                    break;
                }

            }
        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toDown(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 下边是0/墙 return
        if(i + 1 >= chessArray.length || chessArray[i + 1][j] == 0){
            return;
        }
        // 下边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i + 1][j];
        String codeStr = "" + chessNum + chessNumR1;
        // 下边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i + 2; k < chessArray.length; k++){
            int chessNumRn = chessArray[k][j];
            if(chessNumRn != 0){
                if(chessNumR1 == chessNumRn){
                    // 找到相同的就拼接一个棋子标识
                    codeStr += chessNumR1;
                } else if(chessNumR1 != chessNumRn){
                    // 找到不相同的就结束循环
                    break;
                }
            } else{
                // 活连的结尾 就结束循环
                codeStr += "0";
                break;
            }

        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;

    }

    private static void toUp(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 上边是0/墙 return
        if(i - 1 <= -1 || chessArray[i - 1][j] == 0){
            return;
        }
        // 上边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i - 1][j];
        String codeStr = "" + chessNum + chessNumR1;
        // 上边第二颗 0/与第一颗相同的/不同的/墙
        for(int k = i - 2; k > -1; k--){
            int chessNumRn = chessArray[k][j];
            if(chessNumRn != 0){
                if(chessNumR1 == chessNumRn){
                    // 找到相同的就拼接一个棋子标识
                    codeStr += chessNumR1;
                } else if(chessNumR1 != chessNumRn){
                    // 找到不相同的就结束循环
                    break;
                }
            } else{
                // 活连的结尾 就结束循环
                codeStr += "0";
                break;
            }

        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toLeft(int i, int j, int[][] chessArray) {
        // 等于0
        int chessNum = chessArray[i][j];
        // 左边是0/墙 return
        if(j - 1 <= -1 || chessArray[i][j - 1] == 0){
            return;
        }
        // 左边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i][j - 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 左边第二颗 0/与第一颗相同的/不同的/墙
        for(int m = j - 2; m > -1; m--){
            int chessNumRn = chessArray[i][m];
            if(chessNumRn != 0){
                if(chessNumR1 == chessNumRn){
                    // 找到相同的就拼接一个棋子标识
                    codeStr += chessNumR1;
                } else if(chessNumR1 != chessNumRn){
                    // 找到不相同的就结束循环
                    break;
                }
            } else{
                // 活连的结尾 就结束循环
                codeStr += "0";
                break;
            }

        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;
    }

    private static void toRight(int i, int j, int[][] chessArray){
        // 等于0
        int chessNum = chessArray[i][j];
        // 右边是0/墙 return
        if(j + 1 >= chessArray[i].length || chessArray[i][j + 1] == 0){
            return;
        }
        // 右边第一个颗是1/2 记录下来
        int chessNumR1 = chessArray[i][j + 1];
        String codeStr = "" + chessNum + chessNumR1;
        // 右边第二颗 0/与第一颗相同的/不同的/墙
        for(int m = j + 2; m < chessArray[i].length; m++){
            int chessNumRn = chessArray[i][m];
            if(chessNumRn != 0){
                if(chessNumR1 == chessNumRn){
                    // 找到相同的就拼接一个棋子标识
                    codeStr += chessNumR1;
                } else if(chessNumR1 != chessNumRn){
                    // 找到不相同的就结束循环
                    break;
                }
            } else{
                // 活连的结尾 就结束循环
                codeStr += "0";
                break;
            }

        }
        Integer codeValue = codeMap.get (codeStr);
        if(codeValue == null){
            return;
        }
        // 将权值分存入 一个 新的权值二维数组
        codeArrray[i][j] += codeValue;

    }

}

到了这里,关于五子棋简易AI算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 实现对战AI五子棋

     个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖 C语言 〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​      为了能够快速上手一门语言,我们往往在学习了基本语法后,采用写一个小项目的方式来加深理解语言的语法及运用,本文采

    2024年02月03日
    浏览(55)
  • 基于博弈树的开源五子棋AI教程[6 置换表]

    置换表是记忆化搜索技术的应用,置换表保存了某一盘面的搜索结果。当博弈树搜索遇到相同的局面时可以调用这些信息来减少重复搜索。那么如何设计一个置换表的节点就显得比较重要,本文在经典的置换表节点增加一个显示当前玩家的字段,这一字段补足了zobrist hash单向

    2024年01月17日
    浏览(42)
  • 基于博弈树的开源五子棋AI教程[7 多线程搜索]

    多线程加快搜索速度这一认知是经受住实践考验的。博弈树搜索的并行搜索方式有很多种,例如叶子并行,根并行,树分裂等算法。笔者给出一种实现起来比较简单的根并行算法。 在是实现时需要注意两点,第一,怎么安全的剪枝;第二,如何进行线程间的通信。对于AB剪枝

    2024年02月01日
    浏览(46)
  • C++课程设计报告——简易五子棋游戏

    五子棋是是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子在棋盘交替下棋,先形成五子连线者获胜。此次课程设计主要目的是实现五子棋的双人对弈,对战双方通过鼠标点击进行对弈。 游戏通过鼠标点击实现下棋,黑白子交替下棋。 程序通过使用e

    2024年02月13日
    浏览(38)
  • 五子棋游戏禁手算法的改进

    五子棋游戏禁手算法的改进 五子棋最新的禁手规则: 1.黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”(包括“四三三”)、“四四”(包括“四四三”)和“长连”。黑棋只能以“四三”取胜。 2.黑方五连与禁手同时形成,判黑方胜。 3.黑方禁手形成时,白方应立即

    2024年02月10日
    浏览(34)
  • Java课程设计-简单五子棋

    五子棋介绍     五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻

    2024年02月03日
    浏览(45)
  • Java五子棋详细步骤及完整代码

    1. 用户输入行和列 2. 将输入设为对应棋子 1. 横向判断 2. 竖向判断 3. 左斜判断 4.右斜判断 1.横向胜利 2.竖向胜利 3. 左斜判断 4. 右斜判断

    2024年02月02日
    浏览(43)
  • Java实现五子棋小游戏(附源码)

      铜9铁10已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ​ 在LZ看来,真正有意义的就业与跳槽,是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。这件事不容易,但也没有想象的遥不可

    2024年02月08日
    浏览(55)
  • 基于Java的五子棋游戏的设计与实现

    基于 Java 的五子棋游戏的设计 摘  要 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端和服务器端的

    2023年04月23日
    浏览(64)
  • 五子棋小游戏 java版(代码+详细注释)

    游戏展示         这周闲来无事,再来写个五子棋小游戏。基本功能都实现了,包括人人对战、人机对战。界面布局和功能都写的还行,没做到很优秀,但也不算差。如有需要,做个java初学者的课程设计或者自己写着玩玩也都是不错的(非常简单,小白照着就能写出来)。

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包