Threes字符版

来源:互联网 发布:国外的知乎quora 编辑:程序博客网 时间:2024/06/06 01:01

慢慢优化,看看自己的重构能力。

第一版渣渣如下:

public class Threes {    public static final int SIZE = 4;    public static int[][] matrix = new int[SIZE][SIZE];    public static int step = 0;    public static void main(String[] args) throws Exception {        init();        printMatrix(matrix);        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        String line = "";        while ((line = reader.readLine()) != null) {            boolean flag = false;            if ("a".equals(line)) {                flag = moveRowBackward();            } else if ("d".equals(line)) {                flag = moveRowForward();            } else if ("w".equals(line)) {                flag = moveColBackward();            } else if ("s".equals(line)) {                flag = moveColForward();            } else {                System.out.print("INVALID INPUT!!!input:");                continue;            }            if (flag) {                addNumber(line);            } else {                System.out.print("CANNOT MOVE!!!input:");                continue;            }            step++;            printMatrix(matrix);        }    }    private static void init() {        for (int i = 0; i < SIZE; i++) {            for (int j = 0; j < SIZE; j++) {                matrix[i][j] = (int) (Math.random() * 3);            }        }    }    private static void printMatrix(int[][] mat) {        System.out.println("---------------------");        for (int i = 0; i < SIZE; i++) {            System.out.print("|");            for (int j = 0; j < SIZE; j++) {                System.out.print(formatNumber(mat[i][j]) + "|");            }            System.out.println();        }        System.out.println("--------------------- step:" + step);        System.out.print("input:");    }    private static String formatNumber(int number) {        String result = String.valueOf(number);        if ("0".equals(result)) {            result = " ";        }        for (int i = result.length(); i < 4; i++) {            result = " " + result;        }        return result;    }    private static void addNumber(String move) {        int number = 1 + (int) (Math.random() * 2);        if ("a".equals(move)) {            int pos = (int) (Math.random() * SIZE);            while (matrix[pos][SIZE - 1] != 0) {                pos = (int) (Math.random() * SIZE);            }            matrix[pos][SIZE - 1] = number;        } else if ("d".equals(move)) {            int pos = (int) (Math.random() * SIZE);            while (matrix[pos][0] != 0) {                pos = (int) (Math.random() * SIZE);            }            matrix[pos][0] = number;        } else if ("w".equals(move)) {            int pos = (int) (Math.random() * SIZE);            while (matrix[SIZE - 1][pos] != 0) {                pos = (int) (Math.random() * SIZE);            }            matrix[SIZE - 1][pos] = number;        } else if ("s".equals(move)) {            int pos = (int) (Math.random() * SIZE);            while (matrix[0][pos] != 0) {                pos = (int) (Math.random() * SIZE);            }            matrix[0][pos] = number;        }    }    private static boolean moveRowBackward() {        boolean flag = false;        for (int row = 0; row < SIZE; row++) {            for (int i = 0; i < SIZE - 1; i++) {                if (canCombine(matrix[row][i], matrix[row][i + 1])) {                    flag = true;                    matrix[row][i] = matrix[row][i] + matrix[row][i + 1];                    for (int j = i + 1; j < SIZE - 1; j++) {                        matrix[row][j] = matrix[row][j + 1];                    }                    matrix[row][SIZE - 1] = 0;                    break;                }            }        }        return flag;    }    private static boolean moveRowForward() {        boolean flag = false;        for (int row = 0; row < SIZE; row++) {            for (int i = SIZE - 1; i > 0; i--) {                if (canCombine(matrix[row][i], matrix[row][i - 1])) {                    flag = true;                    matrix[row][i] = matrix[row][i] + matrix[row][i - 1];                    for (int j = i - 1; j > 0; j--) {                        matrix[row][j] = matrix[row][j - 1];                    }                    matrix[row][0] = 0;                    break;                }            }        }        return flag;    }    private static boolean moveColBackward() {        boolean flag = false;        for (int col = 0; col < SIZE; col++) {            for (int i = 0; i < SIZE - 1; i++) {                if (canCombine(matrix[i][col], matrix[i + 1][col])) {                    flag = true;                    matrix[i][col] = matrix[i][col] + matrix[i + 1][col];                    for (int j = i + 1; j < SIZE - 1; j++) {                        matrix[j][col] = matrix[j + 1][col];                    }                    matrix[SIZE - 1][col] = 0;                    break;                }            }        }        return flag;    }    private static boolean moveColForward() {        boolean flag = false;        for (int col = 0; col < SIZE; col++) {            for (int i = SIZE - 1; i > 0; i--) {                if (canCombine(matrix[i][col], matrix[i - 1][col])) {                    flag = true;                    matrix[i][col] = matrix[i][col] + matrix[i - 1][col];                    for (int j = i - 1; j > 0; j--) {                        matrix[j][col] = matrix[j - 1][col];                    }                    matrix[0][col] = 0;                    break;                }            }        }        return flag;    }    private static boolean canCombine(int a, int b) {        if (a == 0 || b == 0) {            return true;        } else if (a + b == 3) {            return true;        } else if (a == b && a + b > 4) {            return true;        } else {            return false;        }    }}

第二版

package threes;public class Matrix {    private int[][] matrix;    private int size;    private int step;    public Matrix(int size) {        this.size = size;        this.step = 0;        init();    }    private void init() {        matrix = new int[size][size];        for (int i = 0; i < size; i++) {            for (int j = 0; j < size; j++) {                matrix[i][j] = (int) (Math.random() * 3);            }        }    }    public void print() {        System.out.println("---------------------");        for (int i = 0; i < size; i++) {            System.out.print("|");            for (int j = 0; j < size; j++) {                System.out.print(ThreeUtils.formatNumber(matrix[i][j]) + "|");            }            System.out.println();        }        System.out.println("--------------------- step:" + step);    }    public boolean moveRowBackward() {        boolean flag = false;        for (int row = 0; row < size; row++) {            for (int i = 0; i < size - 1; i++) {                if (ThreeUtils.canCombine(matrix[row][i], matrix[row][i + 1])) {                    flag = true;                    matrix[row][i] = matrix[row][i] + matrix[row][i + 1];                    for (int j = i + 1; j < size - 1; j++) {                        matrix[row][j] = matrix[row][j + 1];                    }                    matrix[row][size - 1] = 0;                    int number = getRandomNumber();                    int pos = (int) (Math.random() * size);                    while (matrix[pos][size - 1] != 0) {                        pos = (int) (Math.random() * size);                    }                    matrix[pos][size - 1] = number;                    break;                }            }        }        return flag;    }    public boolean moveRowForward() {        boolean flag = false;        for (int row = 0; row < size; row++) {            for (int i = size - 1; i > 0; i--) {                if (ThreeUtils.canCombine(matrix[row][i], matrix[row][i - 1])) {                    flag = true;                    matrix[row][i] = matrix[row][i] + matrix[row][i - 1];                    for (int j = i - 1; j > 0; j--) {                        matrix[row][j] = matrix[row][j - 1];                    }                    matrix[row][0] = 0;                    int number = getRandomNumber();                    int pos = (int) (Math.random() * size);                    while (matrix[pos][0] != 0) {                        pos = (int) (Math.random() * size);                    }                    matrix[pos][0] = number;                    break;                }            }        }        return flag;    }    public boolean moveColBackward() {        boolean flag = false;        for (int col = 0; col < size; col++) {            for (int i = 0; i < size - 1; i++) {                if (ThreeUtils.canCombine(matrix[i][col], matrix[i + 1][col])) {                    flag = true;                    matrix[i][col] = matrix[i][col] + matrix[i + 1][col];                    for (int j = i + 1; j < size - 1; j++) {                        matrix[j][col] = matrix[j + 1][col];                    }                    matrix[size - 1][col] = 0;                    int number = getRandomNumber();                    int pos = (int) (Math.random() * size);                    while (matrix[size - 1][pos] != 0) {                        pos = (int) (Math.random() * size);                    }                    matrix[size - 1][pos] = number;                    break;                }            }        }        return flag;    }    public boolean moveColForward() {        boolean flag = false;        for (int col = 0; col < size; col++) {            for (int i = size - 1; i > 0; i--) {                if (ThreeUtils.canCombine(matrix[i][col], matrix[i - 1][col])) {                    flag = true;                    matrix[i][col] = matrix[i][col] + matrix[i - 1][col];                    for (int j = i - 1; j > 0; j--) {                        matrix[j][col] = matrix[j - 1][col];                    }                    matrix[0][col] = 0;                    int number = getRandomNumber();                    int pos = (int) (Math.random() * size);                    while (matrix[0][pos] != 0) {                        pos = (int) (Math.random() * size);                    }                    matrix[0][pos] = number;                    break;                }            }        }        return flag;    }    protected boolean canMove() {        return true;    }    protected int getRandomNumber() {        int number = 1 + (int) (Math.random() * 3);        return number;    }    public int getSize() {        return size;    }    public void setSize(int size) {        this.size = size;    }    public int getStep() {        return step;    }    public void setStep(int step) {        this.step = step;    }}package threes;import java.io.BufferedReader;import java.io.InputStreamReader;public class Threes {    public static final int SIZE = 4;    public static void main(String[] args) throws Exception {        Matrix matrix = new Matrix(SIZE);        matrix.print();        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        String line = "";        System.out.print("input:");        while ((line = reader.readLine()) != null) {            boolean flag = false;            if ("a".equals(line)) {                flag = matrix.moveRowBackward();            } else if ("d".equals(line)) {                flag = matrix.moveRowForward();            } else if ("w".equals(line)) {                flag = matrix.moveColBackward();            } else if ("s".equals(line)) {                flag = matrix.moveColForward();            } else {                System.out.print("INVALID INPUT!!!input:");                continue;            }            if (!flag) {                System.out.print("CANNOT MOVE!!!input:");                continue;            }            matrix.print();            System.out.print("input:");        }    }}package threes;public class ThreeUtils {    public static String formatNumber(int number) {        String result = String.valueOf(number);        if ("0".equals(result)) {            result = " ";        }        for (int i = result.length(); i < 4; i++) {            result = " " + result;        }        return result;    }    public static boolean canCombine(int a, int b) {        if (a == 0 || b == 0) {            return true;        } else if (a + b == 3) {            return true;        } else if (a == b && a + b > 4) {            return true;        } else {            return false;        }    }}
0 0
原创粉丝点击