用Java编写一个简单的拼图游戏

2024-06-18 1249阅读

1.思路与分析

首先我们需要提供几个面板,一些菜单栏以及一些按钮,按照你所需要拼成的图片的一些小切片(可以4*4或者5*5,总之按照你的图片大小来定),定义一个控制图片移动的函数,还需要对你的函数方法及菜单按钮提供监听,然后我们就可以将这些想法付诸行动了。

2.程序代码及分析

1.拼图游戏app总代码

package op1;
public class App {
	public static void main(String[] args) {
	//	new RegistFrame(); //注册
		new LoginFrame();  //登录
	//	new GameFrame();   //游戏
	}
}

我们由登录页面引出其他页面,先调用登录函数,运行代码时,先弹出登录页面

用Java编写一个简单的拼图游戏

如果输入为空,则会弹出如下提示框

用Java编写一个简单的拼图游戏

如果输入错误或者没有注册,则会弹出如下提示框

用Java编写一个简单的拼图游戏

随后弹出注册页面

用Java编写一个简单的拼图游戏

如果输入为空,则会弹出如下提示框

用Java编写一个简单的拼图游戏

如果注册成功,则会弹出如下提示框

用Java编写一个简单的拼图游戏

然后便可进入登录页面,进行登录

用Java编写一个简单的拼图游戏

随后进入游戏页面

用Java编写一个简单的拼图游戏

2.登录页面代码

package op1;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.*;
public class LoginFrame extends JFrame implements ActionListener {
	JFrame dk = new JFrame("登录");
	// 添加按钮
	JButton login = new JButton("登录");
	JButton exit = new JButton("退出");
	// 添加标签
	JLabel name1 = new JLabel("用户名");
	JLabel pwd1 = new JLabel("密码");
	// 添加文本输入框
	JTextField name = new JTextField(13);
	JTextField password = new JTextField(13);
	public LoginFrame() {
		initLoginJFrame();// 初始化界面
	}
	private void initLoginJFrame() {
		dk.setSize(210, 200);
		dk.setAlwaysOnTop(true);
		// dk.setLocationRelativeTo(null);
		dk.setDefaultCloseOperation(2);
		dk.setLayout(new FlowLayout());
		dk.add(name1);
		dk.add(name);
		dk.add(pwd1);
		dk.add(password);
		dk.add(login);
		dk.add(exit);
		login.addActionListener(this);
		exit.addActionListener(this);
		dk.setVisible(true);
	}
	private void initView() {
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == login) {
			if (name.getText().equals("") || password.getText().equals("")) {  当用户名或密码文本框内的内容为空时
				JOptionPane.showMessageDialog(this, "用名或密码不能为空");// 出现对话框提醒
				name.setText("");// 清空文本框
				password.setText("");// 清空文本框
			} else {
				try {
					BufferedWriter w = new BufferedWriter(new FileWriter("D:\\用户信息2.0.txt", true));// true追加录入,录入用户信息
					String sum = name.getText() + " " + password.getText();// 用户名与密码之间用空格连接
					BufferedReader r = new BufferedReader(new FileReader("D:\\用户信息2.0.txt"));// 读出用户信息
					String text;
					Boolean c = false;
					while ((text = r.readLine()) != null) {
						if (sum.equals(text)) { // 循环排查,看录入的信息是否与读取的信息相同,如果相同
							c = true;
						} // 则c为true,登陆成功,不同,c为false,则登录失败
					}
					if (c == true) {
						JOptionPane.showMessageDialog(this, "登录中!!!");
						dk.setVisible(false);// 关闭当前窗口
						new GameFrame();
					} else {
						JOptionPane.showMessageDialog(this, "用名或密码错误或没有注册,请重新输入或进入注册!!!");
						new RegistFrame();
						name.setText("");// 清空文本框
						password.setText("");// 清空文本框
					}
				} catch (IOException ee) {
				}
			}
		}
		if (e.getSource() == exit) {
			dk.setVisible(false);// 关闭当前窗口
		}
	}
}

这是实现登录页面的函数,为了方便理解,我添加了注释。

3.注册页面代码

package op1;
import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class RegistFrame extends JFrame implements ActionListener {
	JFrame dk = new JFrame("注册");
	// 添加按钮
	JButton regist = new JButton("注册");
	JButton exit = new JButton("退出");
	// 添加标签
	JLabel name1 = new JLabel("用户名");
	JLabel pwd1 = new JLabel("密码");
	// 添加文本输入框
	JTextField name = new JTextField(13);
	JTextField password = new JTextField(13);
	public RegistFrame() {
		initregistJFrame();// 初始化界面
	}
	private void initregistJFrame() {
		dk.setSize(210, 200);
		dk.setAlwaysOnTop(true);
		dk.setLocationRelativeTo(null);
		dk.setLocation(200, 200); // 设置窗口位置
		dk.setDefaultCloseOperation(2);
		dk.setLayout(new FlowLayout());
		dk.add(name1);
		dk.add(name);
		dk.add(pwd1);
		dk.add(password);
		dk.add(regist);
		dk.add(exit);
		regist.addActionListener(this);
		exit.addActionListener(this);
		dk.setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == regist) {
			if (name.getText().equals("") || password.getText().equals("")) {// 当用户名或密码文本框内的内容为空时
				JOptionPane.showMessageDialog(this, "用户名或密码不能为空"); // 出现对话框提醒
				name.setText("");// 清空文本框
				password.setText("");// 清空文本框
			} else {
				try {
					BufferedWriter w = new BufferedWriter(new FileWriter("D:\\用户信息2.0.txt", true));// true追加录入,录入用户信息
					String sum = name.getText() + " " + password.getText();// 用户名与密码之间用空格连接
					BufferedReader r = new BufferedReader(new FileReader("D:\\用户信息2.0.txt"));// 读出用户信息
					Boolean c = true;
					String text;
					while ((text = r.readLine()) != null) {
						if (sum.equals(text)) { // 循环排查,看录入的信息是否与读取的信息相同,如果相同
							c = false; // 则c为false,该用户已存在,不同,c为true,则注册成功
						}
					}
					if (c == true) {
						w.write(sum); // 将信息写入文件
						w.newLine();// 生成换行符
						w.close();// 关闭文件
						r.close();
						JOptionPane.showMessageDialog(this, "注册成功!");
						dk.setVisible(false);// 关闭当前窗口
						new LoginFrame();
					} else {
						JOptionPane.showMessageDialog(this, "该用户已存在!");
						name.setText("");// 清空文本框
						password.setText("");// 清空文本框
					}
				} catch (IOException ee) {
				}
			}
		}
		if (e.getSource() == exit) {
			dk.setVisible(false);// 关闭当前窗口
		}
	}
}

与登录页面的代码差不多。

4.游戏页面代码

package op1;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.BevelBorder;
public class GameFrame extends JFrame implements KeyListener, ActionListener {// 继承一个,实现两个接口
	// JFrame 界面,窗体
	// GameFrame即游戏主界面
	// 与游戏相关的逻辑都比在此JavaBean类中
	// 创建一个二维数组,加载图片
	int[][] data = new int[4][4];
	// 记录空白格在二维数组中的位置
	int x = 0;
	int y = 0;
	// 定义二维数组,正确存储数据,即拼图胜利时,图片的正确顺序
	int[][] win = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 0 } };
	// 定义变量统计步数
	int step = 0;
	// 创建菜单选项相关的对象(这几项之所以放在initJMenuBar()之外,是因为后面方法重写时要调用)
	JMenuItem replayItem = new JMenuItem("重新游戏"); // 菜单项,创建选项下面的条目对象
	JMenuItem closeItem = new JMenuItem("退出");
	JMenuItem accountItem = new JMenuItem("关于我们");
	JMenuItem reLoginItem = new JMenuItem("重新登录");
	public GameFrame() {
		initJFrame();// 初始化界面
		initJMenuBar();// 初始化菜单
		initData();// 初始化数据(打乱数据)
		initImage();// 初始化图片(根据打乱的结果加载图片)
		this.setVisible(true);// 让界面显示出来,可视化
	}
	// 初始化数据(打乱数据)
	private void initData() {
		// 定义一维数组
		int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
		// 打乱数组中的数据的顺序,遍历数组
		Random r = new Random(); // 产生随机数r
		for (int i = 0; i  

这里的代码就显得复杂一些,它包括窗口组件的实现,事件监听的实现,以及拼图移动的实现,如果拼图成功,则会弹出拼图成功的提示图片。

用Java编写一个简单的拼图游戏

3.总结

以上就是就是简单的拼游戏的代码的实现及分析,大家有兴趣可以自己去试试,另外如果有不懂的地方可以认真看一下注释喔,或者留言讨论

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]