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();
}
}
} }
java小游戏java九宫格的更多相关文章
- 寒假答辩作品:Java小游戏
目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...
- 猜生日 Java小游戏
最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 1 ...
- java小游戏代码
一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起.一度遭到社会反感和家长抵制.可是.随着互联网的发展,和游戏潜在优点被发现.游戏的价值開始逐渐被社会认可,人们開始接受.认识和了 ...
- Java小游戏
这是一个飞机躲避子弹的小游戏,其中有许多干货 这是蒟蒻我第二次做,请各位大佬多多指教 目录 1.游戏主窗口的创建 2.图形绘制_文本绘制_颜色改变_图像对象的加载 3.线程内部类实现动画 4.游戏物体 ...
- JAVA小游戏之两个物体碰撞产生的碰撞检测
首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...
- 测试欧气的小游戏-java
Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...
- Java小游戏贪吃蛇
package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...
- Java 小游戏 - 井字棋 v1.0 (初步完成) (2018.4.16更新)
井字棋游戏初步完成 实现功能:输入位置数据->打印棋盘->判断是否胜利->继续游戏/退出游戏 缺点:没有清屏函数 判断胜利方法太过无脑 package MYGAME; ...
- java小游戏——猜数字
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Num01 { sta ...
随机推荐
- 详解apollo的设计与使用
简介 apollo 是一款由携程团队开发的配置中心,可以实现配置的集中管理.分环境管理.即时生效等等.在这篇博客中,我们可以了解到: 为什么使用配置中心 如何设计一个配置中心 apollo 是如何设计 ...
- qemu-ga windows下的安装及监控开发
windows安装qemu-ga 虚拟机配置里添加virtio serial端口 #virsh edit instance-name devices里添加下面这段配置, 1 <channel t ...
- pipenv管理模块和包
pipenv安装 1. 在终端输入:pip install pipenv进行安装 用pipenv创建虚拟环境:pipenv install,在哪个文件下运行这个命令,就是给哪个文件创建虚拟环境 这 ...
- 『动善时』JMeter基础 — 51、使用JMeter测试WebService接口
目录 1.什么是WebService 2.WebService和SOAP的关系 3.什么是WSDL 4.测试WebService接口前的准备 (1)如何判断是WebService接口 (2)如何获取W ...
- Redis并发竞争key的解决方案详解
1. 需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞 ...
- 关于 C#的一些记录
1, 注意: 使用Linq to Sql 查询数据库的时候,进行where 判断需要注意.我使用的EF,以下为我的记录使用Contain 需要 使用 *.Contains("" + ...
- C#Expression合集
一:总体概览 1:获取属性值: 2:调用方法 3:动态构造条件 4:创建对象 5:Switch Case 6:Try Catch 以及捕获异常信息并输出 7:if esle 8:+ / += 9: ...
- Raspberry Pi:树莓派安装Kali2021新版本
准备材料 树莓派4B kali系统镜像 SDFormatter (格式化工具) Win32DiskImager (镜像拷录工具) 镜像下载 kali下载地址:https://www.offensive ...
- linux学习之路第九天(磁盘分区,挂载详解)
磁盘分区,挂载 -----分区基础知识 分区的方式 1)mbr分区: 1.最多支持四个主分区 2.系统只能安装在主分区 3.扩展分区要占一个主分区 4.mbr最大只支持2TB,但拥有最好的兼容性 -- ...
- Nacos实战一:架构及部署
2018年,阿里巴巴开源 Nacos,由此成为继 Eureka.Consul.Apollo 等服务注册发现&配置的又一开源框架,到如今2021年,Nacos 已经历了 0.01->1.4 ...