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 ...
随机推荐
- NOIP模拟测试11「string·matrix·big」
打的big出了点小问题,maxx初值我设的0然后少了10分 第二题暴力打炸 第一题剪了一些没用的枝依然40分 总分70 这是一次失败的考试 string 想到和序列那个题很像,但我没做序列,考场回忆学 ...
- 『心善渊』Selenium3.0基础 — 6、Selenium中使用XPath定位元素
目录 1.Selenium中使用XPath查找元素 (1)XPath通过id,name,class属性定位 (2)XPath通过标签中的其他属性定位 (3)XPath层级定位 (4)XPath索引定位 ...
- Golang获取CPU、内存、硬盘使用率
Golang获取CPU.内存.硬盘使用率 工具包 go get github.com/shirou/gopsutil 实现 func GetCpuPercent() float64 { percent ...
- MySQL—Dos命令操作数据库
MySQL 是一个关系型数据库,存在表的概念 结构,数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录 Dos命令操作数据库 PhpStudy使用终端打开数据库 第一次打开默认的密 ...
- BFS经典面试题——C++版
文章目录 蛇梯棋 单词接龙 青蛙过河 蛇梯棋 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...
- 快速了解ARP
目录 前言 一.MAC 1.MAC地址三种帧 二.ARP 1.五种ARP 三.ARP老化 四.什么时候会发送免费ARP 五.代理ARP 六.ARP欺骗 总结 前言 分别介绍MAC地址和五种ARP报文 ...
- Vue3全家桶升级指南二ref、toRef、toRefs的区别
ref是对原始数据的拷贝,当修改ref数据时,模板中的视图会发生改变,但是原始数据并不会改变. toRef是对原始数据的引用,修改toRef数据时,原始数据也会发生改变,但是视图并不会更新. 在vue ...
- Centos7.5使用SSH密钥登录
12.1.查看操作系统版本 # cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 12.2.在服务器端创建密钥 # ssh-ke ...
- 38、linux中软件的安装方法
38.1.rpm安装: rpm -ivh 包名# i:安装的软件: v:显示正在安装的软件信息: h:显示安装软件的进度: rpm -ql 包名 #查看安装包里的文件: rpm -qa 包名#查询包是 ...
- 6、基本数据类型(list)
6.1.列表: 1.li = [1, 12, 9, "age", ["孙子涵", ["19", 10], "张涵予"], ...