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(" "); 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(" "); } 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) 图 (b) 图 (c) "); System.out.println("1 " + "2 " + "3 " + "8 " + "7 " + "6 " + "6 " + "7 " + "8 "); System.out.println("4 " + "5 " + "6 " + "5 " + "- " + "4 " + "5 " + "- " + "4 "); System.out.println("7 " + "8 " + "- " + "3 " + "2 " + "1 " + "3 " + "2 " + "1 "); 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(); } } } }