Java拼图游戏


于 2023-11-19 04:43:05 发布

阅读量345

收藏

点赞数
版权
运行出的游戏界面如下:




按住A不松开,显示完整图片;松开A显示随机打乱的图片。

User类
-
package domain; -
/** -
* @ClassName: User -
* @Author: Kox -
* @Data: 2023/2/2 -
* @Sketch: -
*/ -
public class User { -
private String username; -
private String password; -
public User() { -
} -
public User(String username, String password) { -
this.username = username; -
this.password = password; -
} -
/** -
* 获取 -
* @return username -
*/ -
public String getUsername() { -
return username; -
} -
/** -
* 设置 -
* @param username -
*/ -
public void setUsername(String username) { -
this.username = username; -
} -
/** -
* 获取 -
* @return password -
*/ -
public String getPassword() { -
return password; -
} -
/** -
* 设置 -
* @param password -
*/ -
public void setPassword(String password) { -
this.password = password; -
} -
}

CodeUtil类
-
package util; -
import java.util.ArrayList; -
import java.util.Random; -
public class CodeUtil { -
public static String getCode(){ -
//1.创建一个集合 -
ArrayList<Character> list = new ArrayList<>();//52 索引的范围:0 ~ 51 -
//2.添加字母 a - z A - Z -
for (int i = 0; i < 26; i++) { -
list.add((char)('a' + i));//a - z -
list.add((char)('A' + i));//A - Z -
} -
//3.打印集合 -
//System.out.println(list); -
//4.生成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; -
} -
//System.out.println(result);//长度为4的随机字符串 -
//5.在后面拼接数字 0~9 -
int number = r.nextInt(10); -
//6.把随机数字拼接到result的后面 -
result = result + number; -
//System.out.println(result);//ABCD5 -
//7.把字符串变成字符数组 -
char[] chars = result.toCharArray();//[A,B,C,D,5] -
//8.在字符数组中生成一个随机索引 -
int index = r.nextInt(chars.length); -
//9.拿着4索引上的数字,跟随机索引上的数字进行交换 -
char temp = chars[4]; -
chars[4] = chars[index]; -
chars[index] = temp; -
//10.把字符数组再变回字符串 -
String code = new String(chars); -
//System.out.println(code); -
return code; -
} -
}

登陆代码
-
package ui; -
import domain.User; -
import util.CodeUtil; -
import javax.swing.*; -
import java.awt.event.MouseEvent; -
import java.awt.event.MouseListener; -
import java.io.BufferedReader; -
import java.io.File; -
import java.io.FileReader; -
import java.util.ArrayList; -
public class LoginJFrame extends JFrame implements MouseListener { -
static ArrayList<User> allUsers = new ArrayList<>(); -
static { -
allUsers.add(new User("zhangsan","123")); -
allUsers.add(new User("lisi","1234")); -
} -
JButton login = new JButton(); -
JButton register = new JButton(); -
JTextField username = new JTextField(); -
//JTextField password = new JTextField(); -
JPasswordField password = new JPasswordField(); -
JTextField code = new JTextField(); -
//正确的验证码 -
JLabel rightCode = new JLabel(); -
public LoginJFrame() { -
//初始化界面 -
initJFrame(); -
//在这个界面中添加内容 -
initView(); -
//让当前界面显示出来 -
this.setVisible(true); -
} -
public void initView() { -
//1. 添加用户名文字 -
JLabel usernameText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\login\\用户名.png")); -
usernameText.setBounds(116, 135, 47, 17); -
this.getContentPane().add(usernameText); -
//2.添加用户名输入框 -
username.setBounds(195, 134, 200, 30); -
this.getContentPane().add(username); -
//3.添加密码文字 -
JLabel passwordText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\login\\密码.png")); -
passwordText.setBounds(130, 195, 32, 16); -
this.getContentPane().add(passwordText); -
//4.密码输入框 -
password.setBounds(195, 195, 200, 30); -
this.getContentPane().add(password); -
//验证码提示 -
JLabel codeText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\login\\验证码.png")); -
codeText.setBounds(133, 256, 50, 30); -
this.getContentPane().add(codeText); -
//验证码的输入框 -
code.setBounds(195, 256, 100, 30); -
this.getContentPane().add(code); -
String codeStr = CodeUtil.getCode(); -
//设置内容 -
rightCode.setText(codeStr); -
//绑定鼠标事件 -
rightCode.addMouseListener(this); -
//位置和宽高 -
rightCode.setBounds(300, 256, 50, 30); -
//添加到界面 -
this.getContentPane().add(rightCode); -
//5.添加登录按钮 -
login.setBounds(123, 310, 128, 47); -
login.setIcon(new ImageIcon("拼图小游戏_image\\image\\login\\登录按钮.png")); -
//去除按钮的边框 -
login.setBorderPainted(false); -
//去除按钮的背景 -
login.setContentAreaFilled(false); -
//给登录按钮绑定鼠标事件 -
login.addMouseListener(this); -
this.getContentPane().add(login); -
//6.添加注册按钮 -
register.setBounds(256, 310, 128, 47); -
register.setIcon(new ImageIcon("拼图小游戏_image\\image\\login\\注册按钮.png")); -
//去除按钮的边框 -
register.setBorderPainted(false); -
//去除按钮的背景 -
register.setContentAreaFilled(false); -
//给注册按钮绑定鼠标事件 -
register.addMouseListener(this); -
this.getContentPane().add(register); -
//7.添加背景图片 -
JLabel background = new JLabel(new ImageIcon("拼图小游戏_image\\image\\login\\background.png")); -
background.setBounds(0, 0, 470, 390); -
this.getContentPane().add(background); -
} -
public void initJFrame() { -
this.setSize(488, 430);//设置宽高 -
this.setTitle("拼图游戏 V1.0登录");//设置标题 -
this.setDefaultCloseOperation(3);//设置关闭模式 -
this.setLocationRelativeTo(null);//居中 -
this.setAlwaysOnTop(true);//置顶 -
this.setLayout(null);//取消内部默认布局 -
} -
//点击 -
@Override -
public void mouseClicked(MouseEvent e) { -
if (e.getSource() == login) { -
System.out.println("点击了登录按钮"); -
//获取两个文本输入框中的内容 -
String usernameInput = username.getText(); -
String passwordInput = password.getText(); -
//获取用户输入的验证码 -
String codeInput = code.getText(); -
//创建一个User对象 -
User userInfo = new User(usernameInput, passwordInput); -
System.out.println("用户输入的用户名为" + usernameInput); -
System.out.println("用户输入的密码为" + passwordInput); -
if (codeInput.length() == 0) { -
showJDialog("验证码不能为空"); -
} else if (usernameInput.length() == 0 || passwordInput.length() == 0) { -
//校验用户名和密码是否为空 -
System.out.println("用户名或者密码为空"); -
//调用showJDialog方法并展示弹框 -
showJDialog("用户名或者密码为空"); -
} else if (!codeInput.equalsIgnoreCase(rightCode.getText())) { -
showJDialog("验证码输入错误"); -
} else if (contains(userInfo)) { -
System.out.println("用户名和密码正确可以开始玩游戏了"); -
//关闭当前登录界面 -
this.setVisible(false); -
//打开游戏的主界面 -
//需要把当前登录的用户名传递给游戏界面 -
new GameJFrame(); -
} else { -
System.out.println("用户名或密码错误"); -
showJDialog("用户名或密码错误"); -
} -
} else if (e.getSource() == register) { -
System.out.println("点击了注册按钮"); -
} else if (e.getSource() == rightCode) { -
System.out.println("更换验证码"); -
//获取一个新的验证码 -
String code = CodeUtil.getCode(); -
rightCode.setText(code); -
} -
} -
public void showJDialog(String content) { -
//创建一个弹框对象 -
JDialog jDialog = new JDialog(); -
//给弹框设置大小 -
jDialog.setSize(200, 150); -
//让弹框置顶 -
jDialog.setAlwaysOnTop(true); -
//让弹框居中 -
jDialog.setLocationRelativeTo(null); -
//弹框不关闭永远无法操作下面的界面 -
jDialog.setModal(true); -
//创建Jlabel对象管理文字并添加到弹框当中 -
JLabel warning = new JLabel(content); -
warning.setBounds(0, 0, 200, 150); -
jDialog.getContentPane().add(warning); -
//让弹框展示出来 -
jDialog.setVisible(true); -
} -
//按下不松 -
@Override -
public void mousePressed(MouseEvent e) { -
if (e.getSource() == login) { -
login.setIcon(new ImageIcon("拼图小游戏_image\\image\\login\\登录按下.png")); -
} else if (e.getSource() == register) { -
register.setIcon(new ImageIcon("拼图小游戏_image\\image\\login\\注册按下.png")); -
} -
} -
//松开按钮 -
@Override -
public void mouseReleased(MouseEvent e) { -
if (e.getSource() == login) { -
login.setIcon(new ImageIcon("jigsawgame\\image\\login\\登录按钮.png")); -
} else if (e.getSource() == register) { -
register.setIcon(new ImageIcon("jigsawgame\\image\\login\\注册按钮.png")); -
} -
} -
//鼠标划入 -
@Override -
public void mouseEntered(MouseEvent e) { -
} -
//鼠标划出 -
@Override -
public void mouseExited(MouseEvent e) { -
} -
//判断用户在集合中是否存在 -
public boolean contains(User userInput){ -
for (int i = 0; i < allUsers.size(); i++) { -
User rightUser = allUsers.get(i); -
if(userInput.getUsername().equals(rightUser.getUsername()) && userInput.getPassword().equals(rightUser.getPassword())){ -
//有相同的代表存在,返回true,后面的不需要再比了 -
return true; -
} -
} -
//循环结束之后还没有找到就表示不存在 -
return false; -
} -
}

注册代码
-
package ui; -
import domain.User; -
import util.CodeUtil; -
import javax.swing.*; -
import java.awt.event.MouseEvent; -
import java.awt.event.MouseListener; -
import java.io.*; -
import java.util.ArrayList; -
import java.util.List; -
public class RegisterJFrame extends JFrame implements MouseListener { -
ArrayList<User> list = new ArrayList<>(); -
//提升三个输入框的变量的作用范围,让这三个变量可以在本类中所有方法里面可以使用。 -
JTextField username = new JTextField(); -
JTextField password = new JTextField(); -
JTextField rePassword = new JTextField(); -
//提升两个按钮变量的作用范围,让这两个变量可以在本类中所有方法里面可以使用。 -
JButton submit = new JButton(); -
JButton reset = new JButton(); -
public RegisterJFrame() throws IOException { -
user(); -
initFrame(); -
initView(); -
setVisible(true); -
} -
public void user() throws IOException { -
File file = new File("user.txt"); -
file.createNewFile(); -
BufferedReader br = new BufferedReader(new FileReader("user.txt")); -
String str; -
while ((str = br.readLine()) != null) { -
String[] user = str.split("&"); -
//name -
String name = user[0].split("=")[1]; -
//password -
String password = user[1].split("=")[1]; -
list.add(new User(name, password)); -
} -
} -
@Override -
public void mouseClicked(MouseEvent e) { -
//获取输入框中的内容 -
String userNameStr = username.getText(); -
String passWordStr = password.getText(); -
String rePasswordText = rePassword.getText(); -
if (e.getSource() == submit){//注册 -
System.out.println("注册"); -
//判断输入框是否有空 -
if ((userNameStr.length() == 0) || (passWordStr.length() == 0) || (rePasswordText.length() == 0)){ -
showDialog("账号或密码不能为空"); -
//清空密码 -
password.setText(""); -
rePassword.setText(""); -
} else if (!passWordStr.equals(rePasswordText)) { -
showDialog("密码不一致"); -
//清空密码 -
rePassword.setText(""); -
} else if (!tfUsername(userNameStr)) { //账户已存在 -
showDialog("账号已存在"); -
} else { -
try { -
//将数据存入本地文件中 -
User(userNameStr,passWordStr); -
showDialog("注册成功"); -
this.setVisible(false); -
new LoginJFrame(); -
} catch (IOException ex) { -
throw new RuntimeException(ex); -
} -
} -
// -
}else if(e.getSource() == reset){//重置 -
System.out.println("重置"); -
password.setText(""); -
rePassword.setText(""); -
username.setText(""); -
} -
} -
/* -
* 将数据账号数据存入本地文件中 -
* 参数1:账号 参数2:密码 -
* */ -
private void User(String name , String password) throws IOException { -
String user = "name="+name+"&password="+password; -
BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true)); -
bw.write(user); -
bw.newLine(); -
bw.close(); -
} -
/* -
* 检测账号是否存在 -
* 返回值 boolean -
* 传入 username -
* */ -
private boolean tfUsername(String userName){ -
for (User user : list) { -
if(user.getUsername().equals(userName)) -
return false; -
} -
return true; -
} -
@Override -
public void mousePressed(MouseEvent e) { -
if (e.getSource() == submit) { -
submit.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\注册按下.png")); -
} else if (e.getSource() == reset) { -
reset.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\重置按下.png")); -
} -
} -
@Override -
public void mouseReleased(MouseEvent e) { -
if (e.getSource() == submit) { -
submit.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\注册按钮.png")); -
} else if (e.getSource() == reset) { -
reset.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\重置按钮.png")); -
} -
} -
@Override -
public void mouseEntered(MouseEvent e) { -
} -
@Override -
public void mouseExited(MouseEvent e) { -
} -
private void initView() { -
//添加注册用户名的文本 -
JLabel usernameText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\login\\用户名.png")); -
usernameText.setBounds(85, 135, 80, 20); -
//添加注册用户名的输入框 -
username.setBounds(195, 134, 200, 30); -
//添加注册密码的文本 -
JLabel passwordText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\register\\注册密码.png")); -
passwordText.setBounds(97, 193, 70, 20); -
//添加密码输入框 -
password.setBounds(195, 195, 200, 30); -
//添加再次输入密码的文本 -
JLabel rePasswordText = new JLabel(new ImageIcon("拼图小游戏_image\\image\\register\\再次输入密码.png")); -
rePasswordText.setBounds(64, 255, 95, 20); -
//添加再次输入密码的输入框 -
rePassword.setBounds(195, 255, 200, 30); -
//注册的按钮 -
submit.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\注册按钮.png")); -
submit.setBounds(123, 310, 128, 47); -
submit.setBorderPainted(false); -
submit.setContentAreaFilled(false); -
submit.addMouseListener(this); -
//重置的按钮 -
reset.setIcon(new ImageIcon("拼图小游戏_image\\image\\register\\重置按钮.png")); -
reset.setBounds(256, 310, 128, 47); -
reset.setBorderPainted(false); -
reset.setContentAreaFilled(false); -
reset.addMouseListener(this); -
//背景图片 -
JLabel background = new JLabel(new ImageIcon("拼图小游戏_image\\image\\background.png")); -
background.setBounds(0, 0, 470, 390); -
this.getContentPane().add(usernameText); -
this.getContentPane().add(passwordText); -
this.getContentPane().add(rePasswordText); -
this.getContentPane().add(username); -
this.getContentPane().add(password); -
this.getContentPane().add(rePassword); -
this.getContentPane().add(submit); -
this.getContentPane().add(reset); -
this.getContentPane().add(background); -
} -
private void initFrame() { -
//对自己的界面做一些设置。 -
//设置宽高 -
setSize(488, 430); -
//设置标题 -
setTitle("拼图游戏 V1.0注册"); -
//取消内部默认布局 -
setLayout(null); -
//设置关闭模式 -
setDefaultCloseOperation(3); -
//设置居中 -
setLocationRelativeTo(null); -
//设置置顶 -
setAlwaysOnTop(true); -
} -
//只创建一个弹框对象 -
JDialog jDialog = new JDialog(); -
//因为展示弹框的代码,会被运行多次 -
//所以,我们把展示弹框的代码,抽取到一个方法中。以后用到的时候,就不需要写了 -
//直接调用就可以了。 -
public void showDialog(String content){ -
if(!jDialog.isVisible()){ -
//把弹框中原来的文字给清空掉。 -
jDialog.getContentPane().removeAll(); -
JLabel jLabel = new JLabel(content); -
jLabel.setBounds(0,0,200,150); -
jDialog.add(jLabel); -
//给弹框设置大小 -
jDialog.setSize(200, 150); -
//要把弹框在设置为顶层 -- 置顶效果 -
jDialog.setAlwaysOnTop(true); -
//要让jDialog居中 -
jDialog.setLocationRelativeTo(null); -
//让弹框 -
jDialog.setModal(true); -
//让jDialog显示出来 -
jDialog.setVisible(true); -
} -
} -
}

游戏代码
-
import java.io.IOException; -
import ui.GameJFrame; -
import ui.LoginJFrame; -
import ui.RegisterJFrame; -
/** -
* @ClassName: App -
* @Author: Kox -
* @Data: 2023/1/30 -
* @Sketch: -
*/ -
public class App { -
public static void main(String[] args) throws IOException { -
// 登录界面 -
new LoginJFrame(); -
// 注册界面 -
new RegisterJFrame(); -
// 游戏界面 -
// new GameJFrame(); -
} -
}
