一个控制台上永远都是你赢的五子棋游戏,囧

就是这样一个白痴游戏,我都花了那么久时间,真是有些泄气,不过啊
路漫漫其修远兮,不要急,不积跬步,无以至千里。
你还有一年的时间,这不弄出来了吗~
加油,不许泄气,加油~
发疯学习
想象一下三个月后的你,一年后的你该是一番什么模样啊?
期待!

package 五子棋小游戏;

public class Chessboard {

/*
 * 变量:
 * board 类型 String [][]
 * BOARD_SIZE 类型:int 初始值——22
 * 
 * 方法:
 * 构造方法:
 * 调用initalBoard()
 * intalBoard()
 * printBoard()
 * setBoard(int posX,int posY,String Chessman)
 * getBoard(),返回值为 String[][] 返回board二维数组
 * 
 */
    //棋盘二维数组以及棋盘的大小

    public static final int BOARD_SIZE = 15;
    private String[][] board= new String [BOARD_SIZE][BOARD_SIZE];

    //初始化棋盘二维数组。
    public Chessboard()
    {
        initalBoard();
    }

    //棋盘初始化赋值。共有方法,便于重新开始游戏初始化棋盘。无返回值
    public  void initalBoard()
    {
        for(int i=0;i<BOARD_SIZE;i++)
        {
            for(int j= 0;j<BOARD_SIZE;j++)
            {

                    board[i][j]="十";
            }
        }
    }

    // 打印棋盘,遍历一次board二维数组。共有 无返回值方法。
    public void printBoard()
    {
        for(int i=0;i<board.length;i++)
        {
            for (int j=0;j<board[i].length;j++)
            {
                System.out.print(board[i][j]);
            }
            System.out.print("\n");
        }
    }

    //第三个方法:将棋子放在相对应坐标上。
    public void setBoard(int posX,int posY,String Chessman)
    {
        board[posX][posY] = Chessman;
    }

    //第四个方法,getBoard() 作用在于:将封装的board数组返回到游戏中用于判断是否已有棋子 
    public String[][] getBoard()
    {
        return board;
    }

}
package 五子棋小游戏;

public enum Chessman 
{
    //java 5 之后才有枚举类的出现。 构造器私有,枚举类用于实例有限且固定的时候
    //实例都用public static final 修饰。提供获得实例的方法。
    //烦死了~
    BLACK("●"),WHITE("○");
    private String chessman;
    private Chessman(String chessman)
    {
        this.chessman= chessman;
    }
    public String getChessman()
    {
        return chessman;
    }
}
package 五子棋小游戏;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class GobangGame {
/*
 * 变量:
 * 1,WIN_COUNT 
 * 2,posX,posY
 * 3,chessboard——引用Chessboard的二维数组。
 * 方法:
 * 1,isValid(String inputStr) throws Exception 方法内解决。

 * 3,isReplay(String chessman)
 * 4,int[] computerDo()
 * 5,isWon(int posX,int posY,String currentChessman)
 */


    public static final int WIN_COUNT = 5;
    public static int posX=0,posY=0;
    static Chessboard chessboard =new Chessboard();


    //第一个方法:无参构造器,以及初始化一个棋盘的构造器。后者还不知道其作用。
    public GobangGame()
    {

    }

    public GobangGame(Chessboard chessboard)
    {
        chessboard =new Chessboard();
    }

    //第二个方法;isValid(String inputStr) throws NumberFormatException (数字格式化异常)
    //经过三个步骤:a,判断是否为合法数字;b,判断是否在数组范围内的坐标;c,判断该坐标是否已有棋子。
    public static boolean isValid(String inputStr) throws NumberFormatException
    {
        //a,判断是否是合法数字。这里要try catch处理,会抛出异常。
        //将读到的输入以逗号隔开放在字符串数组中,并将其元素转换成数字赋值给xy坐标。
        try
        {
        String[]posStrArr =inputStr.split(",");
        posX = Integer.parseInt(posStrArr[0])-1;
        posY = Integer.parseInt(posStrArr[1])-1;
        }
        catch(NumberFormatException e)
        {
            chessboard.printBoard();
            System.out.println("你个傻叉~~~~(>_<)~~~~格式不正确啦,还能不能好好玩耍啦,格式是这样的啦——(数字,数字):");
            return false;
        }

        //b,检验xy是否在棋盘的坐标范围内。
        if(posX<0||posX>Chessboard.BOARD_SIZE|| 
           posY<0||posY>Chessboard.BOARD_SIZE)
        {
            chessboard.printBoard();
            System.out.println("你看看,棋盘就那么大,想在棋盘外面自己玩呀,-_-! 老子再给你一次输入机会:");
            return false;
        }

        //c,检验这个坐标是否已经有棋子了。

        //我懂了,因为不能直接访问已经封装了的棋盘,所以通过方法获得这个二维数组的访问权。
        String [][]board = chessboard.getBoard();
        if(board[posX][posY]!="十")
        {
            chessboard.printBoard();
            System.out.println("你不长眼啊,这里都有棋子了,还往这里下-_-# ");
            return false;

        }
        return true;
    }
    public static int[] computerDo()
    {
        int posX =(int)((Math.random()*Chessboard.BOARD_SIZE)-1);
        int posY =(int)((Math.random()*Chessboard.BOARD_SIZE)-1);

        //考虑产生的坐标是否已经已有棋子。
        String[][] board= chessboard.getBoard();
        while(board[posX][posY]!="十")
        {
             posX =(int)(Math.random()*Chessboard.BOARD_SIZE)-1;
             posY =(int)(Math.random()*Chessboard.BOARD_SIZE)-1;
        }
        int[] computerPosXY ={posX,posY};
        return computerPosXY;
    }


    //isReplay()方法。不明白它为什么会抛出异常。
    public static boolean isReplay(String chessman) throws Exception
    {
        chessboard.printBoard();
        String message = chessman.equals(Chessman.BLACK.getChessman())
                ?"卧槽,你居然赢了我!%>_<%不服气,敢再来一盘吗?(y/n)"
                        :"切,小样你输了吧,有本事再来一盘,看我怎么虐你(y/n)";
        System.out.println(message);
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        if(br.readLine().equals("y"))
        {
            return true;
        }
        return false;

    }


    //还有最后一个isWon()方法。
    public static boolean isWon(int posX,int posY,String ico)
    {
        //直线XY的起点和终点。
        int startX=0;
        int startY=0;
        int endX =Chessboard.BOARD_SIZE-1;
        int endY =Chessboard.BOARD_SIZE-1;
        //同一条直线上相邻棋子的累积数
        int SumOfCh = 0;
        int temp = 0;

        //计算起点的最小XY坐标
        temp = posX-WIN_COUNT + 1;
        //如果posX坐标小于4这个距离的话那么就由零坐标开始数,
        //否则就由距离posX坐标4的位置开始数起。
        startX = temp<0?0:temp;
        temp = posY - WIN_COUNT +1;
        startY = temp<0? 0 : temp;

        //计算终点的最大XY坐标。
        temp = posX+ WIN_COUNT-1;
        endX = temp>Chessboard.BOARD_SIZE-1? Chessboard.BOARD_SIZE-1:temp;
        temp = posY+WIN_COUNT-1;
        endY = temp>Chessboard.BOARD_SIZE-1? Chessboard.BOARD_SIZE-1:temp;


        //检验横方向 从左到右方向计算相邻棋子的数目
        String [][] board = chessboard.getBoard();
        for(int i = startY;i<endY;i++)
        {
            if(board[posX][i]==ico && board[posX][i+1]==ico)
            {
                SumOfCh ++ ;
            }
            else if (SumOfCh!= WIN_COUNT-1)
            {
                SumOfCh= 0;
            }
        }
        if(SumOfCh==WIN_COUNT-1)
        return true;    

        //同理检验竖方向的棋子数
        for(int i = startX;i<endX;i++)
        {
            if(board[i][posY]==ico && board[i+1][posY]==ico)
            {
                SumOfCh ++;
            }
            else if (SumOfCh!=WIN_COUNT-1)
            {
                SumOfCh = 0;
            }
        }
        if(SumOfCh==WIN_COUNT-1)
            return true;

        //检验对角线。要嵌套循环
        for(int i= startX;i<endX;i++)
        {
            for(int j=startY;j<endY;j++)
            {
                if(board[i][j]==ico && board[i+1][j+1]==ico)
                {
                    SumOfCh++;
                }
                else if(SumOfCh!= WIN_COUNT-1)
                {
                    SumOfCh = 0 ;
                }
            }
        }

        if(SumOfCh==WIN_COUNT-1)
            return true;

        // 检验反对角线。嵌套循环。
        for(int i =endX;i>startX;i--)
        {
            for (int j= startY;j>endY;j++)
            {
                if(board[i][j]==ico && board[i-1][j+1]==ico)
                {
                    SumOfCh ++ ;
                }
                else if(SumOfCh!= WIN_COUNT-1)
                {
                    SumOfCh =0;
                }
            }
        }
        if(SumOfCh==WIN_COUNT-1)
            return true;
        else return false;
        }
    public static void main(String[] args) throws NumberFormatException, IOException, Exception {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        String inputStr =null;
        boolean isOver;
        chessboard.printBoard();
        while((inputStr = br.readLine())!=null)
        {
            isOver =false;
            if(!isValid(inputStr))
            {
                continue;
            }
            String chessman = Chessman.BLACK.getChessman();

            chessboard.setBoard(posX, posY, chessman);

            if(isWon(posX,posY,chessman))
            {
                isOver = true;
            }
            else
            {
                int[]computerPosArr =computerDo();
                chessman = Chessman.WHITE.getChessman();
                chessboard.setBoard(computerPosArr[0],computerPosArr[1], chessman);
                if(isWon(computerPosArr[0],computerPosArr[1],chessman))
                {
                    isOver = true;
                }

            }
            if(isOver)
            {
                if(isReplay(chessman))
                {
                    chessboard.initalBoard();
                    chessboard.printBoard();
                    continue;

                }
                break;
            }
            chessboard.printBoard();
            System.out.println("快点下啦,要想那么久吗?囧");
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值