编程实现控制台版并支持两人对战的五子棋游戏

package com.lagou.task09;

import javax.swing.plaf.synth.SynthGraphicsUtils;
import java.util.Scanner;

/**
 * 、2. 编程实现控制台版并支持两人对战的五子棋游戏。
 * (1)绘制棋盘 - 写一个成员方法实现
 * (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
 * (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
 * (4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:
 * */
public class Test2 {


    /*定义一个长度为[17][17]的整型二维数组*/
    private String[][] Array=new String[17][17];
    /*获取数组*/
    public String[][] getArray() {
        return Array;
    }
    /*初始化棋盘*/
    public void initArray(){
        for(int i=0;i<Array.length;i++){
            for(int j=0;j<Array[i].length;j++){
                if(i==0){
                    if(j==0){
                        Array[i][j]=" ";
                    }else{
                        Array[i][j] = Integer.toHexString(j-1);
                    }
                }
                else if(j==0){
                    if(i==0){
                        Array[i][j]=" ";
                    }else {
                        Array[i][j] = Integer.toHexString(i - 1);
                    }
                    }
                else {
                    Array[i][j] = "+";

                }

            }
        }
    }
    /*显示棋盘*/
    public void show(){
        for(int i=0;i<Array.length;i++){
            for(int j=0;j<Array[i].length;j++){
                System.out.print(Array[i][j]+" ");
            }
            System.out.println();
        }
    }
    /*给数组赋值 指定位置 A 黑方白方 */
    public void setArray(int line,int row,boolean flag1){
        Array[line][row]=flag1?"A":"B";

    }

    /***
     *落子之后首先先判断在当前行中是否可以获胜:
     * @param line 落子的列数···········
     * @param row 落子的行数
     * @return
     */
    public boolean isVictoryRow(int line,int row,boolean flag){
        int minRow = row - 4;
        int maxRow = row + 4;
        String param=flag ? "A" : "B";
        //遍历九个格子若有五个相同颜色的棋子连线则为胜
        int sum = 0;
        if(minRow < 0)
            minRow = 0;
        if (maxRow >= 16)
            maxRow = 16;
        for(int i = minRow ; i <= maxRow ; i++){
            String piece = Array[line][i];
            if(piece == param){
                sum ++;
                if(sum ==5)  //五子连线判断 获胜
                    return true;
            }else{
                sum = 0;   //若不为同颜色 将sum置为0
            }

        }
        return false;
    }
    /***
     *落子之后首先先判断在当前列中是否可以获胜:
     * @param line 落子的列数
     * @param row 落子的行数
     * @return
     */
    public boolean isVictoryLine(int line,int row,boolean flag){
        int minLine = line - 4;
        int maxLine = line + 4;
        String param=flag ? "A" : "B";
        //遍历九个格子若有五个相同颜色的棋子连线则为胜
        int sum = 0;
        //当落子的左边或右边到达边界时,置为0或14
        if(minLine < 0)
            minLine = 0;
        if (maxLine >= 16)
            maxLine = 16;
        for(int i = minLine ; i <= maxLine ; i++){
            String piece = Array[i][row];
            if(piece == param){
                sum ++;
                //五子连线判断 获胜
                if(sum ==5)
                    return true;
            }else{
                //若不为同颜色 将sum置为0
                sum = 0;
            }

        }
        return false;
    }
    /***
     *判断右斜(\)是否获胜:
     * @param line  落子的列数
     * @param row 落子的行数
     * @return
     */
    public boolean isVictoryRight(int line,int row,boolean flag){
        int sum = 0;
        String param=flag ? "A" : "B";
        /*判断有效值 4 和 -4 代表棋子的 循环 从左下角 到右上角 一次递减  */
        for(int i = 4 ; i > -4 ; i--){
            /*判断有效值*/
            if(line+i>0 && line+i<16 && row+i>0 && row+i<16)
                /*判断 黑方还是白方 有几个成员*/
                if(Array[line+i][row+i] == param){
                    sum ++;
                }else{
                    sum = 0;
                }
            if(sum == 5)
                return true;
        }
        return false;
    }
    /***
     *判断左斜(/)是否获胜:
     * @param line  落子的列数
     * @param row 落子的行数
     * @return
     */
    public boolean isVictoryLeft(int line,int row,boolean flag){
        int sum = 0;
        String param=flag ? "A" : "B";
        for(int i = -4 ; i < 4 ; i++){
            if(line+i>0 && line+i<16 && row+i>0 && row+i<16)
                if(Array[line+i][row+i] == param){
                    sum ++;
                }else{
                    sum = 0;
                }
            if(sum == 5)
                return true;
        }
        return false;
    }

    //判断是否获胜
    public boolean isVictory(int line,int row,boolean falg){
        if(isVictoryRow(line,row,falg) || isVictoryLine(line,row,falg) || isVictoryRight(line,row,falg) || isVictoryLeft(line,row,falg))
            return true;
        return false;
    }

    public static void main(String[] args) {
        /*创建对象*/
        Test2 t2=new Test2();
        /*初始化数组*/
        t2.initArray();
        boolean flag=true;
        boolean flag1=false;
        while(flag){
            /*键盘输入*/
            Scanner sc=new Scanner(System.in);
            System.out.println( !flag1 ? "请黑方下棋" : "请白下棋");
            /*获取列舒*/
            int line=sc.nextInt();
            //获取行数
            int row=sc.nextInt();
            /*判断输入数值的 正确性*/
            if(line<=0 || line >16 || row<=0 || row >16){
                System.out.println("下错位置错了");
            }else{
               /*下棋*/
                String[][] array = t2.getArray();
                boolean retVal = "+".equals(array[line][row]);
                /*判断该当前位置有旗子*/
                if(!retVal){
                    System.out.println("这个地方有旗子 换个地方试试");
                }else{
                    flag1=!flag1;
                    /*设置当前位置棋子*/
                    t2.setArray(line,row,flag1);
                    /*显示棋盘*/
                    t2.show();
                    /*判断当前是黑方(A)胜利还是白方(B)胜利*/
                    boolean Victory = t2.isVictory(line,row,flag1);
                    /*满足条件停止循环*/
                    if(Victory){
                        System.out.println(flag1?"黑旗子战胜":"白棋战胜");
                        flag=false;
                    }
                }


            }

        }


    }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据专家大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值