【练习】JavaSE实现控制台版本的五子棋对战

题目

编程实现控制台版并支持两人对战的五子棋游戏。
(1)绘制棋盘 - 写一个成员方法实现
(2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
(3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。

思路分析

  • 用二维数组实现期盼的绘制,用’+'代表空棋盘
  • 用0代表黑子,1代表白子
  • 从控制台输入xy轴位置,判断是否为+
  • 分上下、左右、左斜、右斜四个方向判断是否连子成功,四个方向逐一判断,,碰黑子,黑子计数+1,白子清零;碰白子,白子计数+1,黑子清零;碰空白,黑白子计数都清零

代码示例

package com.lagou.homework;

import org.w3c.dom.ls.LSOutput;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author pp_x
 * 2. 编程实现控制台版并支持两人对战的五子棋游戏。
 *
 * (1)绘制棋盘 - 写一个成员方法实现
 *
 * (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
 *
 * (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
 */
public class HomeWork2_2 {
    
    
    static char[][] arr = new char[16][16];//定义一个二维数组作为棋盘
    //棋盘初始化的成员方法
    public static void init() {
    
    
        for (int i = 0; i < 16; i++) {
    
    
            for (int j = 0; j < 16; j++) {
    
    
                arr[i][j] = '+';//没有下子的位置
            }
            System.out.println();
        }
        draw();
    }

    //绘制棋盘的成员方法
    public static void draw() {
    
    
        for (int i = 0; i < 16; i++) {
    
    
            for (int j = 0; j < 16; j++) {
    
    
                System.out.print(arr[i][j] + "  ");
            }
            System.out.println();
        }
    }

    //下棋的方法  控制台输入下棋位置 并判断该处有没有棋子且是否在棋盘范围内
    public static void play() {
    
    
        while (true) {
    
    
            Scanner sc = new Scanner(System.in);
            //黑方先操作
            System.out.println("黑子下子ing...");
            System.out.println("黑子子想下在第几行:");
            int x1 = sc.nextInt();
            System.out.println("黑子想下在第几列:");
            int y1 = sc.nextInt();
            while (true) {
    
    
                if (x1 > 15 || y1 > 15 || x1<0 || y1<0) {
    
    
                    System.out.println("该位置不在棋盘范围,请重新下子");
                    System.out.println("黑方下子ing....");
                    System.out.println("黑子想下在第几行:");
                    x1 = sc.nextInt();
                    System.out.println("黑子想下在第几列:");
                    y1 = sc.nextInt();
                } else if (arr[x1][y1] != '+') {
    
    
                    System.out.println("该位置已有棋子,请重新下子");
                    System.out.println("黑方下子ing....");
                    System.out.println("黑子想下在第几行:");
                    x1 = sc.nextInt();
                    System.out.println("黑子想下在第几列:");
                    y1 = sc.nextInt();
                }
                 else {
    
    
                    break;
                }
            }
            arr[x1][y1] = '0';//黑子为0
            draw();
            if (ifWin(x1, y1)) {
    
    
                System.out.println("黑子胜利!!");
                break;
            }
            //白子操作
            System.out.println("白方下子ing....");
            System.out.println("白子想下在第几行:");
            int x2 = sc.nextInt();
            System.out.println("白子想下在第几列:");
            int y2 = sc.nextInt();

            while (true) {
    
    
                if (x2 > 15 || y2 > 15 || x2 <0 || y2 <0) {
    
    
                    System.out.println("不在棋盘内,请重新下子");
                    System.out.println("白方下子ing....");
                    System.out.println("白子想下在第几行:");
                    x2 = sc.nextInt();
                    System.out.println("白子想下在第几列:");
                    y2 = sc.nextInt();
                } else if (arr[x2][y2] != '+') {
    
    
                    System.out.println("此处有子,请重新下子");
                    System.out.println("白方下子ing....");
                    System.out.println("白子想下在第几行:");
                    x2 = sc.nextInt();
                    System.out.println("白子想下在第几列:");
                    y2 = sc.nextInt();
                } else {
    
    
                    break;
                }
            }
            arr[x2][y2] = '1';//白子为1
            draw();
            if (ifWin(x2, y2)) {
    
    
                System.out.println("白子胜利!!");
                break;
            }
        }
    }
    //判断该遍历 行 、 列 、左斜、 右斜  如果遇到'0' 黑子计数+1 白子计数清零; 如果遇到1 白子计数+1 黑子技术清零; 如果遇到+ 两者都清零;
    public static boolean ifWin(int a, int b) {
    
    
        boolean flag = false;
        int countwhite = 0;//白子计数
        int countblock = 0;//黑子计数
        //上下方向
        for (int i = a - 4; i <= a + 4; i++) {
    
    
            if (i < 16 && i >= 0) {
    
    
                if (arr[i][b] == '0') {
    
    
                    countblock++;
                    countwhite = 0;
                    if (countblock == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[i][b] == '1') {
    
    
                    countwhite++;
                    countblock = 0;
                    if (countwhite == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[i][b]=='+'){
    
    
                    countwhite= 0;
                    countblock = 0;
                }
            }
        }
        countwhite = 0;
        countblock = 0;
        System.out.println(countblock+" "+countwhite);
        System.out.println();
        //左右方向
        for (int i = b - 4; i <= b + 4; i++) {
    
    
            if (i < 16 && i >= 0) {
    
    
                if (arr[a][i] == '0') {
    
    
                    countblock++;
                    countwhite = 0;
                    if (countblock == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a][i]  == '1') {
    
    
                    countwhite++;
                    countblock = 0;
                    if (countwhite == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a][i] =='+'){
    
    
                    countwhite= 0;
                    countblock = 0;
                }
            }
        }
        countwhite = 0;
        countblock = 0;
        System.out.println(countblock+" "+countwhite);
        // 左上到右下
        for (int i = -4; i <= 4; i++) {
    
    
            if (a + i < 16 && b + i < 16 && a + i >= 0 && b + i >= 0) {
    
    //
                if (arr[a + i][b + i] == '0') {
    
    
                    countblock++;
                    countwhite = 0;
                    if (countblock == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a + i][b + i] == '1') {
    
    
                    countwhite++;
                    countblock = 0;
                    if (countwhite == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a + i][b + i]=='+'){
    
    
                    countwhite= 0;
                    countblock = 0;
                }
            }
        }
        countwhite = 0;
        countblock = 0;
        System.out.println(countblock+" "+countwhite);
        //右上到左下
        for (int i = -4; i <= 4; i++) {
    
    
            if (a - i < 16 && b + i < 16 && a - i >= 0 && b + i >= 0) {
    
    
                if (arr[a - i][b + i] == '0') {
    
    
                    countblock++;
                    countwhite = 0;
                    if (countblock == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a - i][b + i] == '1') {
    
    
                    countwhite++;
                    countblock = 0;
                    if (countwhite == 5) {
    
    
                        return flag = true;
                    }
                } else if (arr[a - i][b + i]=='+'){
    
    
                    countwhite= 0;
                    countblock = 0;
                }
            }

        }
        System.out.println(countblock+" "+countwhite);
        return flag;
    }

    public static void main(String[] args) {
    
    
        init();//初始化
        play();//开始游戏
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46303867/article/details/112521066
今日推荐