Java 控制台五子棋游戏

Java 控制台五子棋游戏

思路

这是疯狂java第四章习题:
难点:

  • 如何遍历左斜线和右斜线的棋子
  • 怎么判断5个棋子连在一起了
    这里通过设置两个计数器(countBlack和countWhite)遇到黑子countBlack加1,清零countWhite,如果countBlack=5退出计数,黑子胜利。遇到白子countWhite加1,清零countBlack,如果countWhite=5退出计数,白子胜利。

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

package FourPointSeven;

import javax.xml.namespace.QName;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;

public class Gobang {
    //定义棋盘的大小
    private static int BOARD_SIZE = 15;
    private static int countBlack = 0;
    private static int countWhite = 0;
    private static Gobang gobang;
    //定义一个二维数组来充当棋盘
    private String[][] board;
    public void initBoard(){
        board = new String[BOARD_SIZE][BOARD_SIZE];
        for (var i= 0; i < BOARD_SIZE; i++){
            for (var j = 0; j < BOARD_SIZE; j++){
                board[i][j]="┼";
            }
        }
    }

    public void printBoard(){
        for (var i= 0; i < BOARD_SIZE; i++){
            for (var j = 0; j < BOARD_SIZE; j++){
                System.out.print(board[i][j]);
            }
            System.out.print('\n');
        }
    }

    public static void main(String[] args) throws Exception{
        String[] posStrArr = new String[1];
        int xPos=0,yPos=0;
        gobang = new Gobang();
        gobang.initBoard();
        gobang.printBoard();
        //键盘输入
        var br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = null;
        while (true){
            System.out.println("请输入您的下棋坐标,应以x y的格式");
            inputStr = br.readLine();
            if (inputStr.equals("q")){
                break;
            }
            try{
                posStrArr = inputStr.split(" ");
                //把字符串转换成用户下棋坐标
                xPos = Integer.parseInt(posStrArr[0]);
                yPos = Integer.parseInt(posStrArr[1]);
                if (xPos<=0||yPos<=0||xPos>15||yPos>15){
                    throw new Exception("输入的坐标超出范围");
                }
                //把对应数组元素赋为“⚫”
                while (true){
                    if (gobang.board[xPos - 1][yPos - 1].equals("┼")){
                        gobang.board[xPos - 1][yPos - 1] = "●";
                        break;
                    }else {
                        System.out.println("这里已经有棋子了,请重新输入:");
                        inputStr = br.readLine();
                        posStrArr = inputStr.split(" ");
                        xPos = Integer.parseInt(posStrArr[0]);
                        yPos = Integer.parseInt(posStrArr[1]);
                    }
                }
                //电脑下棋
                while (true){
                    var cxPos = (int)(Math.random()*BOARD_SIZE);//生成一个1~15的整数
                    var cyPos = (int)(Math.random()*BOARD_SIZE);
                    if (gobang.board[cxPos][cyPos].equals("┼")){
                        gobang.board[cxPos][cyPos] = "○";
                        break;
                    }
                }
                gobang.printBoard();
            }catch (Exception e){
                System.out.println("您输入的格式有误!请重新输入!");
            }
            //扫描判断谁赢了
            //按每一行扫描
            for (var i = 0; i < BOARD_SIZE;i++) {
                for (var j = 0; j < BOARD_SIZE; j++){
                    if (gobang.board[i][j].equals("●")){
                        if (blackAdd())break;
                    }else if (gobang.board[i][j].equals("○")){
                        if(whiteAdd())break;
                    }
                }
                if (isVictory()==1||isVictory()==2){
                    break;
                }
            }
            //按列扫描
            for (var j = 0; j < BOARD_SIZE;j++) {
                for (var i = 0; i < BOARD_SIZE; i++) {
                    if (gobang.board[i][j].equals("●")) {
                        if (blackAdd())break;
                    } else if (gobang.board[i][j].equals("○")) {
                        if(whiteAdd())break;
                    }
                }
                if (isVictory()==1 || isVictory()==2){
                    break;
                }
            }
            //按 “/”扫描
            for (var i = 0; i < BOARD_SIZE;i++){
                for (var j = 0;j <= i;j++){
                   if (gobang.board[j][i-j].equals("●")){
                       if (blackAdd())break;
                   }else if (gobang.board[j][i-j].equals("○")){
                       if(whiteAdd())break;
                   }
                }
                if (isVictory()==1||isVictory()==2){
                    break;
                }
            }
            for (var i = 0; i < BOARD_SIZE; i++){
                for (var j =0 ;j <=i ;j++){
                    if (gobang.board[14-i+j][14-j].equals("●")){
                        if (blackAdd())break;
                    }else if (gobang.board[14+j-i][14-j].equals("○")){
                        if(whiteAdd())break;
                    }
                }
                if (isVictory()==1||isVictory()==2){
                    break;
                }
            }
            //按“\”扫描
            for (var i = 0; i < BOARD_SIZE;i++){
                for (var j = 0; j <= i;j++){
                    if (gobang.board[14-i+j][j].equals("●")){
                        if (blackAdd())break;
                    }else if (gobang.board[14-i+j][j].equals("○")){
                        if(whiteAdd())break;
                    }
                }
                if (isVictory()==1||isVictory()==2){
                    break;
                }
            }
            for (var i = 0; i < BOARD_SIZE; i++){
                for (var j = 0; j <= i; j++){
                    if (gobang.board[j][14-i+j].equals("●")){
                        if (blackAdd())break;
                    }else if (gobang.board[j][14-i+j].equals("○")){
                        if(whiteAdd())break;
                    }
                }
                if (isVictory()==1||isVictory()==2){
                    break;
                }
            }
        }
    }

    private static int isVictory(){
        if (countBlack == 5 ){
            System.out.println("黑子胜利!!!劈里啪啦!");
            //重新初始化棋盘
            gobang.initBoard();
            gobang.printBoard();
            emptyCount();
            return 1;
        }else if (countWhite ==5){
            System.out.println("白子胜利!!!劈里啪啦!");
            //重新初始化棋盘
            gobang.initBoard();
            gobang.printBoard();
            emptyCount();
            return 2;
        } else {
            emptyCount();
        }
        return -1;
    }
    private static void emptyCount(){
        countBlack = 0;
        countWhite = 0;
    }

    private static boolean blackAdd(){
        countBlack++;
        if (countBlack == 5){
            return true;
        }else {
            countWhite = 0;
        }
        return false;
    }

    private static boolean whiteAdd(){
        countWhite++;
        if (countWhite == 5)
        {
            return true;
        }else {
            countBlack = 0;
        }
        return false;
    }
}

疯狂Java讲义课后题 自己编写的 对于这个程序,最关键的在于判断是否连成5个棋子 一般的棋盘大小为15*15, 用大小为[15][15]的二维数组来盛放棋盘 要判断是否连成5个棋子,就要对棋子的周围进行遍历 这里规定遍历的方式为(左,右),(上,下),(左上,右下),(右上,左下) 4种最特殊的情况:  左上角:只进行右,下,右下  左下角:只进行右,上,右上  右上角:只进行左,下,左下  右下角:只进行左,上,左上 4种特殊情况(不含4个角):  上边界:不进行上遍历  下边界:不进行下遍历  左边界:不进行左遍历  右边界:不进行右遍历 对其他位置的遍历则为(左,右),(上,下),(左上,右下),(右上,左下) 每下一个棋子,都要判断它所处的位置来选择遍历的方式且每次遍历时都要判断是否到达边界,以防数组越界 这样的话,现实起来就会挺复杂 所以改进的方法是这样的: 用大小为[17][17]的二维数组来盛放棋盘 这样就可对每个位置的棋子用相同的遍历方式来遍历,即(左,右),(上,下),(左上,右下),(右上,左下)。并且不需要判断是否到达边界,大大降低了复杂性。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 棋盘为如图所示的那么大。而实际上程序中规定的“棋盘”为中间的部分(即棋子只能摆在从1-15的位置上,否则会被程序告知摆放的位置不对),这样一来,不管棋子位于“棋盘”中的哪个位置,都可以采用(左,右),(上,下),(左上,右下),(右上,左下)的方式遍历而不会发生数组越界的错误,且无需判断是否到达边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值