1. 程式人生 > 其它 >java小遊戲java九宮格

java小遊戲java九宮格

問題來源於吾愛破解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(); } } } }