问题来源于吾爱破解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();
}
}
} }

  

java小游戏java九宫格的更多相关文章

  1. 寒假答辩作品:Java小游戏

    目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...

  2. 猜生日 Java小游戏

    最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 1 ...

  3. java小游戏代码

    一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起.一度遭到社会反感和家长抵制.可是.随着互联网的发展,和游戏潜在优点被发现.游戏的价值開始逐渐被社会认可,人们開始接受.认识和了 ...

  4. Java小游戏

    这是一个飞机躲避子弹的小游戏,其中有许多干货 这是蒟蒻我第二次做,请各位大佬多多指教 目录 1.游戏主窗口的创建 2.图形绘制_文本绘制_颜色改变_图像对象的加载 3.线程内部类实现动画 4.游戏物体 ...

  5. JAVA小游戏之两个物体碰撞产生的碰撞检测

    首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...

  6. 测试欧气的小游戏-java

    Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...

  7. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  8. Java 小游戏 - 井字棋 v1.0 (初步完成) (2018.4.16更新)

      井字棋游戏初步完成 实现功能:输入位置数据->打印棋盘->判断是否胜利->继续游戏/退出游戏 缺点:没有清屏函数   判断胜利方法太过无脑    package MYGAME; ...

  9. java小游戏——猜数字

    import java.util.ArrayList; import java.util.List; import java.util.Random; public class Num01 { sta ...

随机推荐

  1. OpenResty高并发

    在电商项目中所有的访问都是通过首页访问进去的,那么首页门户的访问频率会是非常高的,用我们专业术语来说就是并发量高,这时问题就来了,并发量高我们在做程序时就要保证首页的抗压能力强,而且还要保证抗压的同时 ...

  2. python基本函数增删改排序,用range()求和

    a=["blue","red","brack"] print(len(a))#列表长度 a.append("yellow" ...

  3. base64的实现原理

    base64是处理二进制数据的一种编码方式,可用于把二进制数据编码成64个可打印的字符. 学习base64之前,先了解一下什么是字节与编码 什么是字节 互联网中的数据都是用字节来表示的,一个字节有8位 ...

  4. kmp算法 汇总

    来源:http://blog.csdn.net/qq_34494458/article/details/75253466 KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其 ...

  5. kafka、rabbitmq、redis区别,各自适合什么场景?

    在应用场景方面 RabbitMQ RabbitMQ遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上,适合企业级的消息发送订阅,也是比较受到大家欢迎的. ...

  6. Centos7 yum安装 MySQL5.7.25

    扩展:在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1 下载并安装MySQL官方的 Yum ...

  7. leetcode TOP100 字母异位词分组

    字母异位词分组 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路: 一个map,将每个字符串字符进行记数,字符作为map的key,次数初始为零,以此来标识字 ...

  8. fastposter发布1.4.2 跨语言的海报生成器

    fastposter发布1.4.2 跨语言的海报生成器 fastposter发布1.4.2 跨语言的海报生成器,一分钟完成海报开发 future: 完善docker镜像 引入异步asyncio 升级p ...

  9. 使用Hugo框架搭建博客的过程 - 前期准备

    前言 这篇教程介绍了如何搭建这样效果的博客. 所需步骤 可以从这样的角度出发: 注册域名. 使用CDN加快网站访问速度. 网站内容需要部署在服务器或对象存储平台上. 重要的是放什么内容.博客需要选择框 ...

  10. spring、springmvc、springboot、springcloud的联系与区别

    spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...