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();
            }
        }
    }


}

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM