問題來源於吾愛破解https://www.52pojie.cn/thread-1484202-1-1.html
編程目標一:根據下面的“游戲說明”,實現該游戲程序,完成響應用戶的輸入、顯示游戲局面、判定游戲勝負等功能。
編程目標二:在“編程目標一”的基礎上,順序記錄用戶從游戲開始到游戲結束的所有輸入,並在游戲結束時保存游戲過程記錄。
編程目標三:在“編程目標二”的基礎上,程序實現如下功能:從游戲過程記錄中讀取數據並回放游戲從開始到結束的整個過程。
編程目標四:在“編程目標二”的基礎上,記錄用戶獲勝時所用的移動步數,設計一個移動步數前10名的排行榜,使用步數越少,排名越高。用戶獲勝步數入榜時,提示用戶輸入昵稱。排行榜顯示名次、用戶昵稱、移動步數等信息。
【游戲說明】有一種游戲,其規則如下:有一個 3×3 的九宮方格棋盤,在8個方格中擺棋子,每個棋子上標有1~8中的某一個數字。棋盤中留有一個空格,空格周圍的棋子可以移到空格中,一次只能移動一個棋子。圖 (a) 定義了棋盤的初始局面。經過連續的若干次移動棋子后,當 3×3 方格呈現出圖 (b) 所示的局面時,表示獲勝;當呈現出圖 (c) 所示的局面時,表示失敗。游戲獲勝或失敗時,本輪游戲結束。
實現代碼
package com.ming; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Spfpc { private int data_init[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 0}}; // 初始 private int data_success[][] = {{8, 7, 6}, {5, 0, 4}, {3, 2, 1}}; // 成功 private int data_fail[][] = {{6, 7, 8}, {5, 0, 4}, {3, 2, 1}}; // 失敗 private String success; // 正確 private String fail; // 錯誤 private List<int[][]> history = new ArrayList<>(); // 移動記錄 public Spfpc() { init(); } /** * @return void * @Description 正確答案追加成字符串 * @date 2021/7/28 17:18 * @auther FMm */ public void init() { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < data_success.length; i++) { for (int j = 0; j < data_success[i].length; j++) { stringBuffer.append(data_success[i][j]); } } success = stringBuffer.toString(); stringBuffer.delete(0, stringBuffer.length()); for (int i = 0; i < data_fail.length; i++) { for (int j = 0; j < data_fail[i].length; j++) { stringBuffer.append(data_fail[i][j]); } } fail = stringBuffer.toString(); } /** * @return void * @Description 移動后每次轉換 * @date 2021/7/28 17:20 * @auther FMm */ public String arrayToString() { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < data_init.length; i++) { for (int j = 0; j < data_init[i].length; j++) { stringBuffer.append(data_init[i][j]); } } return stringBuffer.toString(); } /** * @param params 移動的數字 * @return java.lang.String * @Description 通過選擇要移動的數字 查找對應下標 x y * @date 2021/7/28 17:23 * @auther FMm */ public String getIndex(int params) { for (int i = 0; i < data_init.length; i++) { for (int j = 0; j < data_init[i].length; j++) { int i1 = data_init[i][j]; if (i1 == params) { return i + "," + j; } } } return ""; } /** * @param i * @return boolean * @Description 驗證 上下左右 是否正確 * @date 2021/7/28 17:24 * @auther FMm */ public static boolean checkPos(int i) { if (i == 2 | i == 4 | i == 6 | i == 8) { return true; } return false; } /** * @param pos 移動的方位 * @param input 移動的數字 * @return void * @Description 移動數字 * @date 2021/7/28 17:27 * @auther FMm */ public void moveIndex(int pos, int input) { String index = getIndex(input); String[] split = index.split(","); int x = Integer.parseInt(split[0]); int y = Integer.parseInt(split[1]); // 上8下2左4右6 if (pos == 8) { if (x == 0 || data_init[x - 1][y] != 0) { System.out.println("無法向上移動"); } else { data_init[x - 1][y] = input; data_init[x][y] = 0; } } else if (pos == 2) { if (x == 2 || data_init[x + 1][y] != 0) { System.out.println("無法向下移動"); } else { data_init[x + 1][y] = input; data_init[x][y] = 0; } } else if (pos == 4) { if (y == 0 || data_init[x][y - 1] != 0) { System.out.println("無法向左移動"); } else { data_init[x][y - 1] = input; data_init[x][y] = 0; } } else if (pos == 6) { if (y == 2 || data_init[x][y + 1] != 0) { System.out.println("無法向右移動"); } else { data_init[x][y + 1] = input; data_init[x][y] = 0; } } history.add(data_init); outResult(); } /** * @return void * @Description 輸出移動后的 結果 * @date 2021/7/28 17:26 * @auther FMm */ public void outResult() { for (int i = 0; i < data_init.length; i++) { System.out.printf("["); System.out.printf("\t"); for (int j = 0; j < data_init[i].length; j++) { int i1 = data_init[i][j]; if (i1 == 0) { System.out.printf("-"); } else { System.out.printf(String.valueOf(i1)); } System.out.printf("\t"); } System.out.printf("]"); System.out.println(); } } public static void main(String[] args) { Spfpc spfpc = new Spfpc(); System.out.println("【游戲說明】有一種游戲,其規則如下:"); System.out.println("有一個 3×3 的九宮方格棋盤,在8個方格中擺棋子,每個棋子上標有1~8中的某一個數字"); System.out.println("棋盤中留有一個空格,空格周圍的棋子可以移到空格中,一次只能移動一個棋子"); System.out.println("圖 (a) 定義了棋盤的初始局面,經過連續的若干次移動棋子后,當 3×3 方格呈現出"); System.out.println("圖 (b) 所示的局面時,表示獲勝;當呈現出"); System.out.println("圖 (c) 所示的局面時,表示失敗。游戲獲勝或失敗時,本輪游戲結束"); System.out.println("圖 (a)\t\t\t圖 (b)\t\t\t圖 (c)\t\t"); System.out.println("1\t" + "2\t" + "3\t\t" + "8\t" + "7\t" + "6\t\t" + "6\t" + "7\t" + "8\t"); System.out.println("4\t" + "5\t" + "6\t\t" + "5\t" + "-\t" + "4\t\t" + "5\t" + "-\t" + "4\t"); System.out.println("7\t" + "8\t" + "-\t\t" + "3\t" + "2\t" + "1\t\t" + "3\t" + "2\t" + "1\t"); Scanner scanner = new Scanner(System.in); System.out.print("請輸入要移動的數字【1-8】數字:"); int number = spfpc.getNumber(scanner); System.out.print("請輸入要移動的方向【上8下2左4有6】:"); int pos = spfpc.getPos(scanner); spfpc.moveIndex(pos, number); while (true) { String s = spfpc.arrayToString(); if (s.equals(spfpc.fail)) { System.out.printf("失敗"); break; } else { if (s.equals(spfpc.success)) { System.out.println("成功"); System.out.println("步數:" + spfpc.history.size()); break; } else { System.out.print("請輸入要移動的數字【1-8】數字:"); number = spfpc.getNumber(scanner); System.out.print("請輸入要移動的方向【上8下2左4有6】:"); pos = spfpc.getPos(scanner); spfpc.moveIndex(pos, number); } } } } /** * @param scanner * @return int * @Description 移動數字 * @date 2021/7/28 17:30 * @auther FMm */ public int getNumber(Scanner scanner) { String params = scanner.next(); int i = 0; while (true) { try { i = Integer.parseInt(params); if (i > 0 && i < 9) { return i; } else { System.err.println("您輸入的是:" + params); System.out.print("請輸入要移動的數字【1-8】數字:"); params = scanner.next(); } } catch (Exception e) { System.err.println("您輸入的是:" + params); System.out.print("請輸入要移動的數字【1-8】數字:"); params = scanner.next(); } } } /** * @param scanner * @return int * @Description 移動位置 * @date 2021/7/28 17:30 * @auther FMm */ public int getPos(Scanner scanner) { String params = scanner.next(); int i = 0; while (true) { try { i = Integer.parseInt(params); if (checkPos(i)) { return i; } else { System.err.println("您輸入的是:" + params); System.out.print("請輸入要移動的方向【上8下2左4有6】:"); params = scanner.next(); } } catch (Exception e) { System.err.println("您輸入的是:" + params); System.out.print("請輸入要移動的方向【上8下2左4有6】:"); params = scanner.next(); } } } }