文章目录
前言
“千官望长安,万国拜含元” — 崔立之《南至隔仗望含元殿香炉》
1 项目介绍
项目包括三个部分
- 注册界面
- 登录界面
- 游戏界面
1.1 注册页面
1. 注册规则
- 用户名,密码不能为空
- 判断两次密码输入是否一致
- 判断用户名和密码的格式是否正确
- 判断用户名是否存在
2. 用户名和密码规则
- 用户名:4-16位,只能大写字母,小写字母,数字
- 密码:至少包含1个小写字母,1个数字,长度至少6位
1.2 登录界面
1. 登录规则
- 判断用户名是否为空
- 判断密码是否为空
- 判断验证码是否为空
2. 默认登录用户名和密码
- 用户名:admin
- 密码:123456
1.3 游戏主界面
1.3.1 功能模块
功能模块主要包括:更换图片,重新游戏,重新登陆,关闭游戏,存档,读档,关于我们
- 更换图片:图片有美女,动物,运动三种
- 重新游戏:点击之后回到游戏初始状态
- 重新登陆:点击后回退到登陆界面
- 关闭游戏:点击之后关闭游戏并停止代码运行
- 存档和读档:执行读档和存档操作
- 关于我们:显示博主微信二维码,愿同诸君一道,共同学习,共同进步
1.3.2 查看最终效果和作弊码
- 查看最终效果:快捷键A
- 作弊码:快捷键W
2.项目实现
由于拼图小游戏涉及知识比较多,本文仅提供验证码、作弊码功能。
2.1 验证码
1. 验证码规则
- 长度为5
- 由4位大写或者小写字母和1位数字组成,同一个字母可重复
- 数字可以出现在任意位置
- 比如:aQa1K
2. 代码演示
package com.itheima.util;
import java.util.ArrayList;
import java.util.Random;
/**
* 生成验证码
*/
public class CodeUtil {
public static String getCode() {
// 1.创建一个集合
ArrayList<Character> list = new ArrayList<>();
// 2.添加字母 a - z A - Z
for (int i = 0; i < 26; i++) {
list.add((char) ('a' + i));
list.add((char) ('A' + i));
}
// 3.生成4个随机字母
String result = "";
Random r = new Random();
for (int i = 0; i < 4; i++) {
int randomIndex = r.nextInt(list.size());
char c = list.get(randomIndex);
result = result + c;
}
// 4.在后面拼接数字 0~9
int number = r.nextInt(10);
result = result + number;
// 5.把字符串变成字符数组
char[] chars = result.toCharArray();//[A,B,C,D,5]
// 6.在字符数组中生成一个随机索引
int index = r.nextInt(chars.length);
// 7.拿着4索引上的数字,跟随机索引上的数字进行交换
char temp = chars[4];
chars[4] = chars[index];
chars[index] = temp;
// 8.把字符数组再变回字符串
String code = new String(chars);
return code;
}
}
2.2 作弊码
1. 作弊码的作用
按下作弊码后松开,即可一键通关
2. 实现步骤
- 给整个界面添加键盘事件
- 在GameJFrame类中的keyReleased()方法中书写松开的逻辑,当按下W的时候一键通关。
3. 代码演示
@Override
public void keyReleased(KeyEvent e) {
// 1.判断游戏是否胜利,如果胜利,此方法需要直接结束,不能再执行下面的移动代码了
if (victory()) {
return;
}
// 2.对上,下,左,右进行判断(左:37 上:38 右:39 下:40)
int code = e.getKeyCode();
System.out.println(code);
if (code == 37) {
System.out.println("向左移动");
if (y == 3) {
return;
}
// 把空白方块右方的数字往左移动
data[x][y] = data[x][y + 1];
data[x][y + 1] = 0;
y++;
// 每移动一次,计数器就自增一次。
step++;
// 调用方法按照最新的数字加载图片
initImage();
} else if (code == 38) {
System.out.println("向上移动");
if (x == 3) {
// 表示空白方块已经在最下方了,他的下面没有图片再能移动了
return;
}
//逻辑:把空白方块下方的数字往上移动
// x,y 表示空白方块
// x + 1, y 表示空白方块下方的数字
// 把空白方块下方的数字赋值给空白方块
data[x][y] = data[x + 1][y];
data[x + 1][y] = 0;
x++;
// 每移动一次,计数器就自增一次。
step++;
//调用方法按照最新的数字加载图片
initImage();
} else if (code == 39) {
System.out.println("向右移动");
if (y == 0) {
return;
}
//逻辑:把空白方块左方的数字往右移动
data[x][y] = data[x][y - 1];
data[x][y - 1] = 0;
y--;
// 每移动一次,计数器就自增一次。
step++;
// 调用方法按照最新的数字加载图片
initImage();
} else if (code == 40) {
System.out.println("向下移动");
if (x == 0) {
return;
}
// 逻辑:把空白方块上方的数字往下移动
data[x][y] = data[x - 1][y];
data[x - 1][y] = 0;
x--;
// 每移动一次,计数器就自增一次。
step++;
// 调用方法按照最新的数字加载图片
initImage();
} else if (code == 65) {
initImage();
} else if (code == 87) {
data = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
initImage();
}
}
3 项目代码
由于代码量比较大,所以放于gitee代码仓库,代码地址如下:
https://gitee.com/poetize/puzzlegame