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 ...
随机推荐
- csp-s模拟测试55(9.29)联「线段树」·赛「??」题「神仙DP」
T1 联 考试两个小时终于调过了,话说一个傻逼错最后还是静态查出错的..... 大概维护两个懒标记,一个区间覆盖,一个区间异或,然后保证每个区间只会存在一种懒标记. 然后维护区间0的个数,查询时查询那 ...
- Netty 框架学习 —— 编解码器框架
编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将 ...
- 学习Qt Charts - Qt Charts的坐标轴
这次来学学Qt chart 的坐标轴 有这么一组数据: 这是深圳市2019年6月份的天气预报(来自中国天气网:深圳),里面有每天的最高温度,把这最高温度做成个数组,如下: int daily_temp ...
- JavaScript 沙盒模式
微前端已经成为前端领域比较火爆的话题,在技术方面,微前端有一个始终绕不过去的话题就是前端沙箱 什么是沙箱 Sandboxie(又叫沙箱.沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程 ...
- Centos7安装配置jenkins(Tomcat)
Centos7安装配置jenkins(Tomcat) 一.准备工作 1.1 安装JDK1.8 具体安装过程不在赘述. 1.2 下载jenkins的war包 jenkins官网下载地址:https:// ...
- 3、oracle表空间及索引操作
3.1.创建表空间和用户授权: 1.创建表空间: CREATE TABLESPACE <表空间名> LOGGING DATAFILE '<存放路径>' SIZE 50M AUT ...
- Vue 两个字段联合校验典型例子--修改密码
1.前言 本文是前文<Vue Element-ui表单校验规则,你掌握了哪些?>针对多字段联合校验的典型应用. 在修改密码时,一般需要确认两次密码一致,涉及2个属性字段.类似的涉及 ...
- 如何用Redis统计独立用户访问量
拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢? 使用Hash 哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表 ...
- MySQL中的联表查询与子查询
0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...
- Java实验项目三——简单工厂模式
Program: 请采用采用简单工厂设计模式,为某个汽车销售店设计汽车销售系统,接口car至少有方法print(), 三个汽车类:宝马.奥迪.大众 (属性:品牌,价格),在测试类中根据客户要求购买的汽 ...