Java基础实战(二)

文章内容输出来源:拉勾教育大数据开发高薪训练营

源代码:https://gitee.com/tommie523/lagou_bigdata_class/tree/master/task02

Java基础实战(二)

第一题

定义一个长度为[16][16]的整型二维数组并输入所有位置的元素值;

分别实现二维数组中所有行和所有列中所有元素的累加和并打印;

再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。

  • 第一步 封装一个类:
package task02;

import java.util.Random;

public class Code0201 {
    // 定义行、列、二维数组
    private int rows;
    private int cols;
    private int[][] arr2;
  	// 将行、列、对角线的和储存在一维数组中
    private int[] sumRows;
    private int[] sumCols;
    private int[] sumDiagonal;

    // 无参构造
    public Code0201() {
    }

    // 有参构造
    public Code0201(int rows, int cols) {
        setCols(cols);
        setRows(rows);
        setSumCols(cols);
        setSumRows(rows);
        setSumDiagonal(2);//两条对角线
        System.out.printf("=====正在创建%d行%d列的数组=====\n", rows, cols);
        arr2 = new int[rows][cols];
    }

    // 设置行
    public void setRows(int rows) {
        this.rows = rows;
    }

    // 设置列
    public void setCols(int cols) {
        this.cols = cols;
    }

    // 设置各行和
    public void setSumRows(int rows) {
        sumRows = new int[rows];
    }

    // 获取各列和
    public void setSumCols(int cols) {
        sumCols = new int[cols];
    }

    // 获取左上角至右下角和
    public void setSumDiagonal(int num) {
        sumDiagonal = new int[num];
    }

    // 获取行
    public int getRows() {
        return rows;
    }

    // 获取列
    public int getCols() {
        return cols;
    }

    // 获取各行和
    public int[] getSumRows() {
        sumPrint(sumRows);
        return sumRows;
    }

    // 获取各列和
    public int[] getSumCols() {
        sumPrint(sumCols);
        return sumCols;
    }

    // 获取对角线
    public int[] getSumDiagonal() {
        sumPrint(sumDiagonal);
        return sumDiagonal;
    }

    // 打印数组
    public void showArr() {

    }

    // 添加元素,随机数0-3
    public void addValue() {

    }

    // 私有方法,打印行、列、对角线和
    private void sumPrint(int[] arr) {

    }

}
  • 第二步 随机为数组添加元素:
    // 添加元素,随机数0-3
    public void addValue() {
        Random rd = new Random();
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                arr2[i][j] = rd.nextInt(4);
            }
        }
    }
  • 第三步 打印数组:
    // 打印数组
    public void showArr() {
        for (int[] arr1 : arr2) {
            for (int i = 0; i < arr1.length; i++) {
              	// 格式化打印,让元素之间有间隔
                System.out.printf("%d ", arr1[i]);
            }
            System.out.println();
        }
    }
  • 第四步 元素求和:
    // 改写addValue方法,在添加元素的同时就储存行、列、对角线的和
    public void addValue() {
        Random rd = new Random();
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                arr2[i][j] = rd.nextInt(4);
                //储存行的和
                sumRows[i] += arr2[i][j];
              	//储存列的和
                sumCols[j] += arr2[i][j];
                if (i == j) {
                  	// 当行数与列数相等时,储存左上角至右下角的和
                    sumDiagonal[0] += arr2[i][j];
                }
                if (i == (arr2[i].length - j - 1)) {
                  	// 储存右上角至左下角的和
                    sumDiagonal[1] += arr2[i][j];
                }
            }
        }
    }
  • 第五步 返回与打印行、列、对角线的和:
    // 私有方法,打印行、列、对角线和
    private void sumPrint(int[] arr, String str) {
        for (int i = 0; i < arr.length; i++) {
          	// str标识行、列、对角线
            System.out.printf("第%02d%s的和是%d\n", i + 1, str, arr[i]);
        }
    }
  • 完整代码
package task02;

import java.util.Random;

public class Code0201 {
    // 定义行、列、二维数组
    private int rows;
    private int cols;
    private int[][] arr2;
    // 将行、列、对角线的和储存在一维数组中
    private int[] sumRows;
    private int[] sumCols;
    private int[] sumDiagonal;

    // 无参构造
    public Code0201() {
    }

    // 有参构造
    public Code0201(int rows, int cols) {
        setCols(cols);
        setRows(rows);
        setSumCols(cols);
        setSumRows(rows);
        setSumDiagonal(2);
        System.out.printf("=====正在创建%d行%d列的数组=====\n", rows, cols);
        arr2 = new int[rows][cols];
    }

    // 设置行
    public void setRows(int rows) {
        this.rows = rows;
    }

    // 设置列
    public void setCols(int cols) {
        this.cols = cols;
    }

    // 设置各行和
    public void setSumRows(int rows) {
        sumRows = new int[rows];
    }

    // 获取各列和
    public void setSumCols(int cols) {
        sumCols = new int[cols];
    }

    // 获取左上角至右下角和
    public void setSumDiagonal(int num) {
        sumDiagonal = new int[num];
    }

    // 获取行
    public int getRows() {
        return rows;
    }

    // 获取列
    public int getCols() {
        return cols;
    }

    // 获取各行和
    public int[] getSumRows() {
        System.out.println("\n====打印各行的和====");
        sumPrint(sumRows, "行");
        return sumRows;
    }

    // 获取各列和
    public int[] getSumCols() {
        System.out.println("\n====打印各列的和====");
        sumPrint(sumCols, "列");
        return sumCols;
    }

    // 获取对角线
    public int[] getSumDiagonal() {
        System.out.println("\n====打印对角线和====");
        System.out.println("注意:\n第01对角线为左上角至右下角");
        System.out.println("第02对角线为右上角至左下角\n");
        sumPrint(sumDiagonal, "对角线");
        return sumDiagonal;
    }

    // 打印数组
    public void showArr() {
        for (int[] arr1 : arr2) {
            for (int i = 0; i < arr1.length; i++) {
                System.out.printf("%d ", arr1[i]);
            }
            System.out.println();
        }
    }

    // 添加元素,随机数0-3
    public void addValue() {
        Random rd = new Random();
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                arr2[i][j] = rd.nextInt(4);
                sumRows[i] += arr2[i][j];
                sumCols[j] += arr2[i][j];
                if (i == j) {
                    sumDiagonal[0] += arr2[i][j];
                }
                if (i == (arr2[i].length - j - 1)) {
                    sumDiagonal[1] += arr2[i][j];
                }
            }
        }
    }

    // 私有方法,打印行、列、对角线和
    private void sumPrint(int[] arr, String str) {
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("第%02d%s的和是%d\n", i + 1, str, arr[i]);
        }
    }

}
  • 测试
package task02;

public class Code0201Test {
    public static void main(String[] args) {
        Code0201 code = new Code0201(16, 16);
        // 添加元素
        code.addValue();
        // 打印
        code.showArr();
        // 各列和
        code.getSumCols();
        // 各行和
        code.getSumRows();
        // 对角线和
        code.getSumDiagonal();
    }
}


// =====正在创建16行16列的数组=====
// 3 0 0 2 1 1 1 3 1 1 1 3 2 0 3 3 
// 3 0 0 1 1 2 2 1 2 1 3 3 1 0 0 3 
// 3 0 1 0 2 2 1 1 0 1 1 2 2 2 1 0 
// 0 3 1 1 3 3 0 2 1 1 1 1 0 3 0 1 
// 0 3 3 3 1 3 2 3 0 0 2 0 0 2 0 0 
// 1 0 2 2 0 3 0 0 3 3 0 2 3 2 2 2 
// 2 1 3 2 0 2 1 0 2 3 1 3 1 3 2 2 
// 2 3 0 1 0 0 0 1 2 0 2 0 2 1 0 1 
// 0 3 2 2 0 1 1 3 1 3 3 0 1 1 1 1 
// 1 0 2 1 3 2 1 2 0 3 0 1 0 2 3 2 
// 3 2 3 3 3 1 0 3 0 3 3 1 2 2 0 0 
// 0 1 0 0 0 0 1 2 2 0 0 1 2 1 1 0 
// 0 3 2 2 3 1 2 2 1 2 2 2 3 3 3 1 
// 3 2 0 1 3 1 1 2 0 1 0 0 0 2 2 0 
// 1 1 0 1 1 3 0 0 1 2 1 0 2 2 0 0 
// 1 3 2 2 1 0 1 0 1 0 2 0 3 1 3 0 

// ====打印各列的和====
// 第01列的和是23
// 第02列的和是25
// 第03列的和是21
// 第04列的和是24
// 第05列的和是22
// 第06列的和是25
// 第07列的和是14
// 第08列的和是25
// 第09列的和是17
// 第10列的和是24
// 第11列的和是22
// 第12列的和是19
// 第13列的和是24
// 第14列的和是27
// 第15列的和是21
// 第16列的和是16

// ====打印各行的和====
// 第01行的和是25
// 第02行的和是23
// 第03行的和是19
// 第04行的和是21
// 第05行的和是22
// 第06行的和是25
// 第07行的和是28
// 第08行的和是15
// 第09行的和是23
// 第10行的和是23
// 第11行的和是29
// 第12行的和是11
// 第13行的和是32
// 第14行的和是18
// 第15行的和是15
// 第16行的和是20

// ====打印对角线和====
// 注意:
// 第01对角线为左上角至右下角
// 第02对角线为右上角至左下角

// 第01对角线的和是24
// 第02对角线的和是19

第二题

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

绘制棋盘 - 写一个成员方法实现;

提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现;

每当一方下棋后判断是否获胜 - 写一个成员方法实现;

提示: 采用二维数组来模拟并描述棋盘,棋盘如下:

Java基础实战(二)_第1张图片

  • 第一步 封装一个类
package task02;

import java.util.Scanner;

public class Code0202 {
  	// 棋盘
    private String[][] board;
  	// 自定义棋子
    private char white;
    private char black;
  	// 棋盘大小
    private int rows;
    private int cols;

  	// 无参构造
    Code0202() {
    }

  	// 有参构造
    Code0202(int rows, int cols, char white, char black) {
        setBoard(rows, cols);
        setWhite(white);
        setBlack(black);
        setRows(rows);
        setCols(cols);
    }

    // 设置棋盘行
    public void setRows(int rows) {
        this.rows = rows;
    }

    // 设置棋盘列
    public void setCols(int cols) {
        this.cols = cols;
    }

    // 获取棋盘行
    public int getRows() {
        return rows;
    }

    // 获取棋盘列
    public int getCols() {
        return cols;
    }

  	// 设置棋盘
    public void setBoard(int rows, int cols) {
        board = new String[rows][cols];
    }

  	// 设置白棋
    public void setWhite(char white) {
        this.white = white;
    }

  	// 设置黑棋
    public void setBlack(char black) {
        this.black = black;
    }

  	// 返回棋盘数组
    public String[][] getBoard(int rows, int cols) {
        return board;
    }

    // 获取自定义白棋
    public char getWhite() {
        return white;
    }

    // 获取自定义黑棋
    public char getBlack() {
        return black;
    }

    // 绘制棋盘
    public void getBoard() {
    }

    // 打印棋盘
    public void showBoard() {
    }

  	// 私有方法,判断输赢
    private Boolean isWin() {
        return true;
    }

   // 开始游戏
    public void startGame() {

    }
}
  • 第二步 绘制棋盘:
    // 绘制棋盘
    public void getBoard() {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (i == 0) {
                    board[i][j] = String.format("%x", j - 1);
                } else if (j == 0) {
                    board[i][j] = String.format("%x", i - 1);
                } else {
                    board[i][j] = "+";
                }
            }
        }
        board[0][0] = " ";
    }
  • 第三步 打印棋盘:
    // 打印棋盘
    public void showBoard() {
        for (String[] str : board) {
            for (int j = 0; j < board[0].length; j++) {
                System.out.print(str[j] + " ");
            }
            System.out.println();
        }
    }
  • 第四步 开始游戏,即修改棋盘数组的元素,并重新绘制棋盘:
public void startGame() {
        Scanner sc = new Scanner(System.in);
        int x;
        int y;
        while (true) {
            // 获取坐标
        		x = sc.nextInt() + 1;
        		y = sc.nextInt() + 1;
            // 落子
            board[x][y] = "落子";
            // 刷新棋盘
            showBoard();
            // 退出机制
            if (true) {
                break;
            }
        }
        sc.close();
    }
  • 第五步 实现两人交换落子:
    public void startGame() {
        Scanner sc = new Scanner(System.in);
        int x;
        int y;
        // 设置标识
        boolean flag = true;
        while (true) {
            if (flag) {
                // 白方先手,以“白”表示
                System.out.println("请白方落子。");
                x = sc.nextInt() + 1;
        				y = sc.nextInt() + 1;
                board[x][y] = "白";

            } else {
                // 黑方后手,以“黑”表示
                System.out.println("请黑方落子。");
                x = sc.nextInt() + 1;
        				y = sc.nextInt() + 1;
                board[x][y] = "黑";

            }
            showBoard();
            // 切换棋手
            flag = !flag;
            if (true) {
                break;
            }
        }
        sc.close();
    }
  • 第六步 判断落子是否重叠:
public void startGame() {
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        int x;
        int y;
        // 记录落子类型
        String chess;
        while (true) {
            if (flag) {
                System.out.println("请白方落子。");
                chess = "白";
            } else {
                System.out.println("请黑方落子。");
                chess = "黑";
            }
            x = sc.nextInt() + 1;
            y = sc.nextInt() + 1;
            // 输入坐标在棋盘范围内则落子,否则返回循环,重新落子
            if ("+".equals(board[x][y])) {
                board[x][y] = chess;
            } else {
                System.out.println("当前坐标不可落子,请重新落子。");
                continue;
            }
            showBoard();
            flag = !flag;
            if (true) {
                break;
            }
        }
        sc.close();
    }
  • 第七步 控制落子坐标范围,避免超出数组边界:
public void startGame() {
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        int x;
        int y;
        String chess;
        while (true) {
            if (flag) {
                System.out.println("请白方落子。");
                chess = "白";
            } else {
                System.out.println("请黑方落子。");
                chess = "黑";
            }
            x = sc.nextInt() + 1;
            y = sc.nextInt() + 1;
            // 如果落子超出棋盘范围,则重新落子
            if (x<0 || y<0 || x>16 || y>16) {
                System.out.println("落子超出棋盘范围,请重新落子。");
                continue;
            }
            if ("+".equals(board[x][y])) {
                board[x][y] = chess;
            } else {
                System.out.println("当前坐标不可落子,请重新落子。");
                continue;
            }
            showBoard();
            flag = !flag;
            if (true) {
                break;
            }
        }
        sc.close();
    }
  • 第八步 判断输赢:
    private Boolean isWin(int x, int y, String chess, int rows, int cols) {
        int countCol = -1;
        int countRow = -1;
        int countDiagonalLeft = -1;
        int countDiagonalRight = -1;
        int a;
        int b;
        // 行:向左数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countRow++;
                // 防止数组下标越界
                if (b == 0) {
                    break;
                }
                b--;
            } else {
                break;
            }
        }
        // 行:向右数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countRow++;
                // 防止数组下标越界
                if (b == (cols - 1)) {
                    break;
                }
                b++;
            } else {
                break;
            }
        }

        // 列:向下数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countCol++;
                // 防止数组下标越界
                if (a == 0) {
                    break;
                }
                a--;
            } else {
                break;
            }
        }
        // 列:向上数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countCol++;
                // 防止数组下标越界
                if (a == (rows - 1)) {
                    break;
                }
                a++;
            } else {
                break;
            }
        }
        // 左对角:左上数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalLeft++;
                // 防止数组下标越界
                if (a == 0 || b == 0) {
                    break;
                }
                a--;
                b--;
            } else {
                break;
            }
        }
        // 左对角:右下数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalLeft++;
                // 防止数组下标越界
                if (a == (rows - 1) || b == (cols - 1)) {
                    break;
                }
                a++;
                b++;
            } else {
                break;
            }
        }

        // 右对角:右上数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalRight++;
                // 防止数组下标越界
                if (a == 0 || b == (cols - 1)) {
                    break;
                }
                a--;
                b++;
            } else {
                break;
            }
        }
        // 右对角:左下数相同的棋子
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalRight++;
                // 防止数组下标越界
                if (a == (rows - 1) || b == 0) {
                    break;
                }
                a++;
                b--;
            } else {
                break;
            }
        }

        System.out.println("countRow:" + countRow);
        System.out.println("countCol:" + countCol);
        System.out.println("countDiagonalLeft:" + countDiagonalLeft);
        System.out.println("countDiagonalRight:" + countDiagonalRight);

        return (countRow >= 5 || countCol >= 5 || countDiagonalLeft >= 5 || countDiagonalRight >= 5);
    }
  • 第九步 优化棋子显示,修改打印棋盘方法:
    // 打印棋盘
    public void showBoard() {
        for (String[] str : board) {
            for (int j = 0; j < board[0].length; j++) {
                if ("白".equals(str[j])) {
                    // 打印自定义白色棋子
                    System.out.print(white + " ");
                } else if ("黑".equals(str[j])) {
                    // 打印自定义黑色棋子
                    System.out.print(black + " ");
                } else {
                    System.out.print(str[j] + " ");

                }
            }
            System.out.println();
        }
    }
  • 完整代码
package task02;

import java.util.Scanner;

public class Code0202 {
    private String[][] board;
    private char white;
    private char black;
    private int rows;
    private int cols;

    Code0202() {
    }

    Code0202(int rows, int cols, char white, char black) {
        setBoard(rows, cols);
        setWhite(white);
        setBlack(black);
        setRows(rows);
        setCols(cols);
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public void setCols(int cols) {
        this.cols = cols;
    }

    public int getRows() {
        return rows;
    }

    public int getCols() {
        return cols;
    }

    public void setBoard(int rows, int cols) {
        board = new String[rows][cols];
    }

    public void setWhite(char white) {
        this.white = white;
    }

    public void setBlack(char black) {
        this.black = black;
    }

    public String[][] getBoard(int rows, int cols) {
        return board;
    }

    public char getWhite() {
        return white;
    }

    public char getBlack() {
        return black;
    }

    public void getBoard() {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (i == 0) {
                    board[i][j] = String.format("%x", j - 1);
                } else if (j == 0) {
                    board[i][j] = String.format("%x", i - 1);
                } else {
                    board[i][j] = "+";
                }
            }
        }
        board[0][0] = " ";
    }

    public void showBoard() {
        for (String[] str : board) {
            for (int j = 0; j < board[0].length; j++) {
                if ("白".equals(str[j])) {
                    System.out.print(white + " ");
                } else if ("黑".equals(str[j])) {
                    System.out.print(black + " ");
                } else {
                    System.out.print(str[j] + " ");

                }
            }
            System.out.println();
        }
    }

    private Boolean isWin(int x, int y, String chess, int rows, int cols) {
        int countCol = -1;
        int countRow = -1;
        int countDiagonalLeft = -1;
        int countDiagonalRight = -1;
        int a;
        int b;
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countRow++;
                if (b == 0) {
                    break;
                }
                b--;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countRow++;
                if (b == (cols - 1)) {
                    break;
                }
                b++;
            } else {
                break;
            }
        }

        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countCol++;
                if (a == 0) {
                    break;
                }
                a--;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countCol++;
                if (a == (rows - 1)) {
                    break;
                }
                a++;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalLeft++;
                if (a == 0 || b == 0) {
                    break;
                }
                a--;
                b--;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalLeft++;
                if (a == (rows - 1) || b == (cols - 1)) {
                    break;
                }
                a++;
                b++;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalRight++;
                if (a == 0 || b == (cols - 1)) {
                    break;
                }
                a--;
                b++;
            } else {
                break;
            }
        }
        a = x;
        b = y;
        while (true) {
            if (chess.equals(board[a][b])) {
                countDiagonalRight++;
                if (a == (rows - 1) || b == 0) {
                    break;
                }
                a++;
                b--;
            } else {
                break;
            }
        }

        System.out.println("countRow:" + countRow);
        System.out.println("countCol:" + countCol);
        System.out.println("countDiagonalLeft:" + countDiagonalLeft);
        System.out.println("countDiagonalRight:" + countDiagonalRight);

        return (countRow >= 5 || countCol >= 5 || countDiagonalLeft >= 5 || countDiagonalRight >= 5);
    }

    public void startGame() {
        Scanner sc = new Scanner(System.in);
        boolean flag = true;
        int x;
        int y;
        String chess;
        while (true) {
            if (flag) {
                System.out.println("请白方落子。");
                chess = "白";
            } else {
                System.out.println("请黑方落子。");
                chess = "黑";
            }
            x = sc.nextInt() + 1;
            y = sc.nextInt() + 1;
            if (x < 0 || y < 0 || x > 16 || y > 16) {
                System.out.println("落子超出棋盘范围,请重新落子。");
                continue;
            }
            if ("+".equals(board[x][y])) {
                board[x][y] = chess;
            } else {
                System.out.println("当前坐标不可落子,请重新落子。");
                continue;
            }
            showBoard();
            flag = !flag;
            boolean isWin = isWin(x, y, chess, getRows(), getCols());
            if (isWin) {
                System.out.printf("恭喜%s方获胜!", chess);
                break;
            }
        }
        sc.close();
    }
}
  • 测试
package task02;

public class Code0202Test {
    public static void main(String[] args) {
        // 自定义棋子
        char white = 0x25cb;
        char black = 0x25cf;
        Code0202 code = new Code0202(17, 17, white, black);
        // 绘制棋盘
        code.getBoard();
        // 显示棋盘
        code.showBoard();
        // 开始游戏
        code.startGame();
    }

}

// 0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 + + + + + + + + + + + + + + + + 
// 1 + + + + + + + + + + + + + + + + 
// 2 + + + + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + + + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + + 
// f + + + + + + + + + + + + + + + + 
// 请白方落子。
// 0 0
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + + + + + + + + + + + + + + + + 
// 2 + + + + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + + + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + + 
// f + + + + + + + + + + + + + + + + 
// countRow:1
// countCol:1
// countDiagonalLeft:1
// countDiagonalRight:1
// 请黑方落子。
// 6 6
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + + + + + + + + + + + + + + + + 
// 2 + + + + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + + 
// f + + + + + + + + + + + + + + + + 
// countRow:1
// countCol:1
// countDiagonalLeft:1
// countDiagonalRight:1
// 请白方落子。
// 12 19
// 落子超出棋盘范围,请重新落子。
// 请白方落子。
// -44 -1
// 落子超出棋盘范围,请重新落子。
// 请白方落子。
// 1 1
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + + + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + + 
// f + + + + + + + + + + + + + + + + 
// countRow:1
// countCol:1
// countDiagonalLeft:2
// countDiagonalRight:1
// 请黑方落子。
// 14 15
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + + + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + ● 
// f + + + + + + + + + + + + + + + + 
// countRow:1
// countCol:1
// countDiagonalLeft:1
// countDiagonalRight:1
// 请白方落子。
// 2 2 
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + ○ + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + ● 
// f + + + + + + + + + + + + + + + + 
// countRow:1
// countCol:1
// countDiagonalLeft:3
// countDiagonalRight:1
// 请黑方落子。
// 15 15
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + ○ + + + + + + + + + + + + + 
// 3 + + + + + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + ● 
// f + + + + + + + + + + + + + + + ● 
// countRow:1
// countCol:2
// countDiagonalLeft:1
// countDiagonalRight:1
// 请白方落子。
// 3 3
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + ○ + + + + + + + + + + + + + 
// 3 + + + ○ + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + + ● 
// f + + + + + + + + + + + + + + + ● 
// countRow:1
// countCol:1
// countDiagonalLeft:4
// countDiagonalRight:1
// 请黑方落子。
// 14 14
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + ○ + + + + + + + + + + + + + 
// 3 + + + ○ + + + + + + + + + + + + 
// 4 + + + + + + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + ● ● 
// f + + + + + + + + + + + + + + + ● 
// countRow:2
// countCol:1
// countDiagonalLeft:2
// countDiagonalRight:1
// 请白方落子。
// 4 4
//   0 1 2 3 4 5 6 7 8 9 a b c d e f 
// 0 ○ + + + + + + + + + + + + + + + 
// 1 + ○ + + + + + + + + + + + + + + 
// 2 + + ○ + + + + + + + + + + + + + 
// 3 + + + ○ + + + + + + + + + + + + 
// 4 + + + + ○ + + + + + + + + + + + 
// 5 + + + + + + + + + + + + + + + + 
// 6 + + + + + + ● + + + + + + + + + 
// 7 + + + + + + + + + + + + + + + + 
// 8 + + + + + + + + + + + + + + + + 
// 9 + + + + + + + + + + + + + + + + 
// a + + + + + + + + + + + + + + + + 
// b + + + + + + + + + + + + + + + + 
// c + + + + + + + + + + + + + + + + 
// d + + + + + + + + + + + + + + + + 
// e + + + + + + + + + + + + + + ● ● 
// f + + + + + + + + + + + + + + + ● 
// countRow:1
// countCol:1
// countDiagonalLeft:5
// countDiagonalRight:1
// 恭喜白方获胜!

第三题

手机卡类

特征:卡类型、卡号、用户名、密码、账户余额、通话时长(分钟)、上网流量

行为:显示(卡号 + 用户名 + 当前余额)

通话套餐类

特征:通话时长、短信条数、每月资费

行为: 显示所有套餐信息

上网套餐类

特征:上网流量、每月资费

行为:显示所有套餐信息

用户消费信息类

特征:统计通话时长、统计上网流量、每月消费金额

枚举类手机卡

大卡、小卡、微型卡

将通话套餐类和上网套餐类中相同的特征和行为提取出来组成抽象套餐类

通话服务接口

抽象方法: 参数 1: 通话分钟, 参数 2: 手机卡类对象

让通话套餐类实现通话服务接口。

上网服务接口

抽象方法: 参数 1: 上网流量, 参数 2: 手机卡类对象

让上网套餐类实现上网服务接口。

编写测试类使用多态格式分别调用上述方法,方法体中打印一句话进行功能模拟即可。

  • 第一步 手机卡类:
package task02;

public class Code0203PhoneCard {}
  • 第二步 抽象套餐类:
package task02;

public abstract class Code0203AbstractPackage {
    // 套餐资费
    private int price;
    // 套餐数量
    private int phonePackage;

    // 无参构造
    public Code0203AbstractPackage() {
    }

    // 初始化套餐
    public Code0203AbstractPackage(int price, int phonePackage) {
        setPrice(price);
        setPhonePackage(phonePackage);
    }

    // 设置资费
    public void setPrice(int price) {
        this.price = price;
    }

    // 获取资费
    public int getPrice() {
        return price;
    }

    // 设置套餐数量
    public void setPhonePackage(int phonePackage) {
        this.phonePackage = phonePackage;
    }

    // 获取套餐
    public int getPhonePackage() {
        return phonePackage;
    }

    // 打印套餐信息
    public abstract void showInfo();
}
  • 第三步 通话服务接口:
package task02;

public interface Code0203ServeCall {
    // 通话数量,手机卡对象
    public abstract void server(int callDuration, Code0203PhoneCard phoneCard);
}
  • 第四步 通话套餐类:
package task02;

public class Code0203PhonePackage extends Code0203AbstractPackage implements Code0203ServeCall {
    // 记录短信条数
    private int message;

    //初始化通话套餐
    public Code0203PhonePackage(int price, int phonePackage,int message) {
        // 继承抽象套餐类
        super(price,phonePackage);
        // 设置短信
        setMessage(message);
    }

    public void setMessage(final int message) {
        this.message = message;
    }

    public int getMessage() {
        return message;
    }

    // 重写抽象套餐类,打印套餐信息;
    @Override
    public void showInfo() {
        System.out.printf("通话套餐:时长包%d分钟;每月资费%d元/分钟;短信%d条;\n", getPhonePackage(), getPrice(), getMessage());
    }

    // 重写通话服务接口方法
    @Override
    public void server(int callDuration, Code0203PhoneCard phoneCard) {
      // 待定
    }
}
  • 第五步 上网服务接口:
package task02;

public interface Code0203ServerNtework {
    // 流量数量,手机卡对象
    public abstract void server(int networkData, Code0203PhoneCard phoneCard);
}
  • 第六步 上网套餐类:
package task02;

public class Code0203NetworkPackage extends Code0203AbstractPackage implements Code0203ServerNtework {

    public Code0203NetworkPackage(int price, int phonePackage) {
        // 继承抽象类套餐
        super(price,phonePackage);
    }


    //重写抽象套餐类,打印套餐信息;
    @Override
    public void showInfo() {
        System.out.printf("上网套餐:流量包%dGB;每月资费%d元/GB;\n", getPhonePackage(), getPrice());
    }

    // 重写上网服务接口方法
    @Override
    public void server(int networkData, Code0203PhoneCard phoneCard) {
			// 待定
    }
}
  • 第七步 用户消费信息类:
package task02;

public class Code0203UserConsume {
    // 统计余额、通话时长、上网流量
    private int consumeValue;
    private int consumeCallDuration;
    private int consumeNetworkData;

    public void setConsumeValue(int consumeValue) {
        this.consumeValue = consumeValue;
    }

    public void setConsumeCallDuration(int consumeCallDuration) {
        this.consumeCallDuration = consumeCallDuration;
    }

    public void setConsumeNetworkData(int consumeNetworkData) {
        this.consumeNetworkData = consumeNetworkData;
    }

    public int getConsumeValue() {
        return consumeValue;
    }

    public int getConsumeCallDuration() {
        return consumeCallDuration;
    }

    public int getConsumeNetworkData() {
        return consumeNetworkData;
    }

    // 打印消费情况
    public void showInfo() {
        System.out.printf("\n消费情况:您已通话%d分钟;流量使用%dGB;合计消费%d元。", consumeCallDuration, consumeNetworkData, consumeValue);
    }
}
  • 第八步 手机卡枚举:
package task02;

public enum Code0203CardTypeEnum {
    BIG("大卡"), SMALL("小卡"), MINI("微型卡");

    private final String cardType;

    private Code0203CardTypeEnum(String cardType) {
        this.cardType = cardType;
    }

    public String getCardType() {
        return cardType;
    }
}
  • 第九步 构建手机卡类:
package task02;

public class Code0203PhoneCard {
    private String cardType;
    private String cardId;
    private String userName;
    private String password;
    private int accountBalance;
    private int callDuration;
    private int networkData;
    private Code0203UserConsume userConsume;

    public Code0203PhoneCard() {
    }

    /**
     * 
     * @param cardType 卡类型,枚举
     * @param cardId 电话号码
     * @param userName 用户名
     * @param password 密码
     * @param accountBalance 余额
     * @param callDuration 通话套餐分钟数
     * @param networkData 上网套餐流量
     * @param userConsume 消费统计对象
     */
    public Code0203PhoneCard(String cardType, String cardId, String userName, String password, int accountBalance,
            int callDuration, int networkData, Code0203UserConsume userConsume) {
        setCardType(cardType);
        setCardId(cardId);
        setUserName(userName);
        setPassword(password);
        setAccountBalance(accountBalance);
        setCallDuration(callDuration);
        setNetworkData(networkData);
        setUserConsume(userConsume);
    }

    public Code0203UserConsume getUserConsume() {
        return userConsume;
    }

    public void setUserConsume(Code0203UserConsume userConsume) {
        this.userConsume = userConsume;
    }

    public String getCardType() {
        return cardType;
    }

    public void setCardType(String cardType) {
        this.cardType = cardType;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAccountBalance() {
        return accountBalance;
    }

    public void setAccountBalance(int accountBalance) {
        this.accountBalance = accountBalance;
    }

    public int getCallDuration() {
        return callDuration;
    }

    public void setCallDuration(int callDuration) {
        this.callDuration = callDuration;
    }

    public int getNetworkData() {
        return networkData;
    }

    public void setNetworkData(int networkData) {
        this.networkData = networkData;
    }

    /**
     * 增加消费方法
     * 
     * @param consumeValue 消费金额
     * @param consumeCallDuration 通话时长
     * @param consumeNetworkData 上网流量
     */
    public void addComsume(int consumeValue, int consumeCallDuration, int consumeNetworkData) {
        // 记录消费金额
        getUserConsume().setConsumeValue(getUserConsume().getConsumeValue() + consumeValue);
        // 记录通话时长
        getUserConsume().setConsumeCallDuration(getUserConsume().getConsumeCallDuration() + consumeCallDuration);
        //记录上网流量
        getUserConsume().setConsumeNetworkData(getUserConsume().getConsumeNetworkData() + consumeNetworkData);
    }

    //打印信息
    public void showInfo() {
        System.out.printf("卡号:%s\n用户名:%s\n当前余额:%d元\n", getCardId(), getUserName(), getAccountBalance());
        // 打印消费情况
        getUserConsume().showInfo();

    }

    /**
     * 多态
     * 打印用户所有信息与各类套餐内容
     * 
     * 
     * @param abstractPackage 套餐抽象类对象
     */
    public void showOnCreate(Code0203AbstractPackage... abstractPackage) {
        System.out.printf("卡号:%s\n类型:%s\n用户名:%s\n密码:%s\n时长包:%d分钟\n流量包:%dGB\n当前余额:%d元\n", getCardId(), getCardType(),
                getUserName(), getPassword(), getCallDuration(), getNetworkData(), getAccountBalance());
        for (int i = 0; i < abstractPackage.length; i++) {
            abstractPackage[i].showInfo();
        }

    }
}
  • 第十步 完善通话套餐,通话服务方法:
    // 重写通话服务接口方法
    @Override
    public void server(int callDuration, Code0203PhoneCard phoneCard) {
        // 消费金额=通话数量*资费
        int consumeValue=callDuration*getPrice();
        // 手机余额减消费
        phoneCard.setAccountBalance(phoneCard.getAccountBalance() - consumeValue);
        // 添加通话消费时长
        phoneCard.addComsume(consumeValue,callDuration,0);
        // 打印手机卡当前消费信息
        phoneCard.showInfo();
    }
  • 第十一步 完善上网套餐,上网服务方法:
    // 重写上网服务接口方法
    @Override
    public void server(int networkData, Code0203PhoneCard phoneCard) {
        // 消费金额=上网流量*资费
        int consumeValue=networkData*getPrice();
        // 手机余额减消费
        phoneCard.setAccountBalance(phoneCard.getAccountBalance() - consumeValue);
        // 添加流量消费数量
        phoneCard.addComsume(consumeValue,0,networkData);
        // 打印手机卡当前消费信息
        phoneCard.showInfo();
    }
  • 测试
package task02;

public class Code0203Test {
    public static void main(String[] args) {
        System.out.println("========注册卡=========");
        // 定义通话套餐数量与资费
        Code0203PhonePackage call = new Code0203PhonePackage(1, 0, 0);
        // 定义上网套餐与资费
        Code0203NetworkPackage network = new Code0203NetworkPackage(1, 0);
        // 创建消费统计对象
        Code0203UserConsume consume = new Code0203UserConsume();
        // 注册一张手机卡,枚举手机卡类型:大卡
        Code0203PhoneCard card = new Code0203PhoneCard(Code0203CardTypeEnum.BIG.getCardType(), "13355556666",
                "username", "******", 1000, call.getPhonePackage(), network.getPhonePackage(), consume);
        // 多态:打印套餐信息:抽象套餐类->通话套餐、上网套餐
        card.showOnCreate(call, network);
        System.out.println("=================\n\n");

        // 开始消费

        System.out.println("========使用通话=========");
        call.server(20, card);
        System.out.println("\n=================\n\n");

        System.out.println("========使用流量=========");
        network.server(200, card);
        System.out.println("\n=================\n\n");


    }
}

// ========注册卡=========
// 卡号:13355556666
// 类型:大卡
// 用户名:username
// 密码:******
// 时长包:0分钟
// 流量包:0GB
// 当前余额:1000元
// 通话套餐:时长包0分钟;每月资费1元/分钟;短信0条;
// 上网套餐:流量包0GB;每月资费1元/GB;
// =================


// ========使用通话=========
// 卡号:13355556666
// 用户名:username
// 当前余额:980元

// 消费情况:您已通话20分钟;流量使用0GB;合计消费20元。
// =================


// ========使用流量=========
// 卡号:13355556666
// 用户名:username
// 当前余额:780元

// 消费情况:您已通话20分钟;流量使用200GB;合计消费220元。
// =================

你可能感兴趣的:(Java,java)