博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单五子棋实现
阅读量:6076 次
发布时间:2019-06-20

本文共 8086 字,大约阅读时间需要 26 分钟。

一、定义一个对手Rival类

package com.itwang.gonbang;public class Rival {    private String color;//颜色    private String nickName;//昵称    public String getNickName() {        return nickName;    }    public void setNickName(String nickName) {        this.nickName = nickName;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }}

二、定义一个棋盘ChessBoard类

package com.itwang.gonbang;/** * 五子棋棋牌 */public class ChessBoard {    //五子棋的宽度    public static final Integer BOARD_SIZE = 8;    public String[][] board;    public void initBoard(){        //初始化棋盘数组        board = new String[BOARD_SIZE][BOARD_SIZE];        for (int i = 0;i < BOARD_SIZE;i++){            for (int j = 0;j < BOARD_SIZE;j++){                board[i][j] = "+";            }        }    }    //在控制台输出棋盘    public void printBoard(){        for (int i = 0;i < BOARD_SIZE;i++){            for (int j = 0;j < BOARD_SIZE;j++){                System.out.print(board[i][j]);            }            System.out.println();        }    }}

三、定义一个主类Gobang

package com.itwang.gonbang;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;/** * 五子棋的关键算法实现 */public class Gobang {    //棋盘    private static ChessBoard chessBoard;    private static Rival rival;//对手1    private static Rival rival2;//对手2    private int totalCount;//统计步数    /**     * 判断输赢     * @param chessBoard     * @param xPost     * @param yPost     * @param color     * @return     */    public static boolean isWin(ChessBoard chessBoard,int xPost,int yPost,String color){        //记录当前连接的点数        int count = 1;        int currXPost = 0;        int currYPost = 0;        /**         * 判断水平方向上的胜负         * 先从xPost左边遍历,然后从xPost右边遍历判断有连续的点         */        //向左        for (currYPost = yPost - 1;currYPost >= 0;currYPost --){            if ((chessBoard.board[xPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        //向右        for (currYPost = yPost + 1;currYPost < ChessBoard.BOARD_SIZE; currYPost ++){            if ((chessBoard.board[xPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        count = 1;        /**         * 判断垂直方向上的胜负         */        //向上遍历        for(currXPost = xPost -1;currXPost >= 0; currXPost --){            if ((chessBoard.board[currXPost][yPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        //向下边遍历        for (currXPost = xPost + 1;currXPost < ChessBoard.BOARD_SIZE; currXPost ++){            if ((chessBoard.board[currXPost][yPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        count = 1;        /**         * 左上到右下遍历         */        //左上        for (currXPost = xPost - 1,currYPost = yPost - 1;currXPost >= 0 && currYPost >= 0;currXPost--,currYPost--){            if ((chessBoard.board[currXPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        //右下        for (currXPost = xPost + 1,currYPost = yPost + 1;             currXPost < ChessBoard.BOARD_SIZE && currYPost < ChessBoard.BOARD_SIZE;currXPost++,currYPost++){            if ((chessBoard.board[currXPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        /**         * 从坐下到右上遍历         */        count = 1;        //左下        for (currXPost = xPost + 1,currYPost = yPost - 1;             currXPost < ChessBoard.BOARD_SIZE && currYPost >= 0;currXPost++,currYPost++){            if ((chessBoard.board[currXPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        //右上        for (currXPost = xPost - 1,currYPost = yPost + 1;             currXPost >= 0 && currYPost < ChessBoard.BOARD_SIZE;currXPost--,currYPost++){            if ((chessBoard.board[currXPost][currYPost]).equals(color)){                count++;                if (count >= 5){                    return true;                }            }else {                break;            }        }        return false;    }    /**     * 判断下棋的位置是否有子     * @param chessBoard     * @param xPost     * @param yPost     * @param color1     * @param color2     * @return     */    public static boolean isRepeat(ChessBoard chessBoard,int xPost,int yPost,String color1,String color2){        if ((chessBoard.board[xPost][yPost]).equals(color1) || (chessBoard.board[xPost][yPost]).equals(color2)){            return false;        }        return true;    }    public static void main(String[] args) throws IOException {        chessBoard = new ChessBoard();        rival2 = new Rival();        rival = new Rival();        chessBoard.initBoard();        chessBoard.printBoard();        rival.setColor("*");        rival.setNickName("红方");        rival2.setColor("=");        rival2.setNickName("黑方");        //获取键盘输入,每当在键盘上输入一行内容按回车键,刚输入的内容将被读取到        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));        String inputStr = null;        /*System.out.println("红方(1)先下?还是黑方(2)先下");        Scanner sc = new Scanner(System.in);        int first = sc.nextInt();*/        boolean flag = true;        if (flag){            System.out.println("请" + rival.getNickName() + "输入坐标: ");        }else {            System.out.println("请" + rival2.getNickName() + "输入坐标: ");        }        while((inputStr = bufferedReader.readLine()) != null){            //将用户输入的字符以逗号作为分隔符            String[] splitStr = inputStr.split(",");            //将2个字符串转化为用户棋下的坐标            int xPost = Integer.parseInt(splitStr[0]);            int yPost = Integer.parseInt(splitStr[1]);            //把对应的数组元素赋值为'*';这里按照横坐标为x轴,纵坐标为y轴,由于数组与坐标相反            if (flag){                if (isRepeat(chessBoard,yPost-1,xPost-1,rival.getColor(),rival2.getColor())){                    chessBoard.board[yPost - 1][xPost - 1] = rival.getColor();                    chessBoard.printBoard();                    flag = false;                    /**                     * 判断输赢                     */                    if (isWin(chessBoard,yPost - 1,xPost - 1,rival.getColor())){                        System.out.println(rival.getNickName() + "胜利");                        break;                    }                }else {                    System.out.println("该地方已经有棋子了,请重试");                }            }else{                if (isRepeat(chessBoard,yPost-1,xPost-1,rival.getColor(),rival2.getColor())){                    chessBoard.board[yPost - 1][xPost - 1] = rival2.getColor();                    chessBoard.printBoard();                    flag = true;                    /**                     * 判断输赢                     */                    if (isWin(chessBoard,yPost - 1,xPost - 1,rival2.getColor())){                        System.out.println(rival2.getNickName() + "胜利");                        break;                    }                }else {                    System.out.println("该地方已经有棋子了,请重试");                }            }            if (flag){                System.out.println("请" + rival.getNickName() + "输入坐标: ");            }else {                System.out.println("请" + rival2.getNickName() + "输入坐标: ");            }        }    }}

 

转载于:https://www.cnblogs.com/ya-qiang/p/9434068.html

你可能感兴趣的文章
我的友情链接
查看>>
多线程之线程池任务管理通用模板
查看>>
CSS3让长单词与URL地址自动换行——word-wrap属性
查看>>
CodeForces 580B Kefa and Company
查看>>
开发规范浅谈
查看>>
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
查看>>
鼠标增强软件StrokeIt使用方法
查看>>
本地连接linux虚拟机的方法
查看>>
某公司面试java试题之【二】,看看吧,说不定就是你将要做的题
查看>>
BABOK - 企业分析(Enterprise Analysis)概要
查看>>
Linux 配置vnc,开启linux远程桌面
查看>>
NLog文章系列——如何优化日志性能
查看>>
Hadoop安装测试简单记录
查看>>
CentOS6.4关闭触控板
查看>>
ThreadPoolExecutor线程池运行机制分析-线程复用原理
查看>>
React Native 极光推送填坑(ios)
查看>>
Terratest:一个用于自动化基础设施测试的开源Go库
查看>>
修改Windows远程终端默认端口,让服务器更安全
查看>>
扩展器必须,SAS 2.0未必(SAS挺进中端存储系统之三)
查看>>
Eclipse遇到Initializing Java Tooling解决办法
查看>>