Java实训项目一一拼图游戏(附源码) 您所在的位置:网站首页 雷电4接口可以干什么 Java实训项目一一拼图游戏(附源码)

Java实训项目一一拼图游戏(附源码)

2024-01-04 14:59| 来源: 网络整理| 查看: 265

1 实训基本信息

1.1 实训项目名称

(1)拼图游戏

1.2 实训环境

本次实训内容主要针对专业学生,实训形式以实战讲解为主导。实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致和认真,对于重要的知识点内容老师还特意的标注下来,方便同学们回顾学习。

2 实训内容简介

2.1 拼图游戏

拼图游戏内容由若干小图像块组成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。在Java标准环境下运行,通过鼠标点击图像块上下左右移动,完成大图像的拼凑。

通过所创建的窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 ,实现游戏登录、开始游戏、退出游戏、选择图片、图片缩放、图片分割、调整难易度、计数计时、打乱图片、判断拼图成功等功能。

游戏可以通过对图片文件的读取和加载,从多张图片中选择来进行拼图游戏,通过设置图像块的个数来实现对游戏难易度的调整,最后将游戏完成后所用时间和步数记录到游戏记录中,方便用户查看游戏记录。

3 项目开发过程

3.1 拼图游戏

3.1.1开发步骤

1、了解拼图游戏基本功能:

拼图游戏内容由若干小图像块组成的,通过鼠标点击图像块上下左右移动,完成图像的拼凑。

2、拼图游戏交互界面设计与开发:

通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 ,实现拼图游戏的基本功能。

3、图片的加载与分割:

使用Image类实现图片的缩放,ImageIO类实现图片的读写加载,通过接口类Icon,BufferedImage类获取BufferedImage类的对象实现图片分割。

4、图片随机打乱和交换:

产生随机数 Random rand=new Random();

           rand.nextInt(hs*ls)------[0,8]

具体操作:生成两个随机数表示数组下标,互换两个数组元素的位置,按钮的方法getX和getY可以获取按钮的坐标,利用按钮的单击事件的处理ActionListener可以使其图片交换。

5、判赢:

当用户移动按钮后进行判断,代码写在监听器的actionPerformed方法中,判断拼图是否成功,主要取决于每一个按钮通过索引下标获取的位置值,与当前按钮的位置值是否相同。

6、计时和计数功能的实现:

计时功能的实现主要是线程的设计,线程的定义方法:第一:继承Thread类,第二:实现Runnable接口,创建带实现接口的子类对象的Thread对象,MainJFrame实现Runnable接口,重写run方法;而计数则在主窗体中通过rp.times实现对变量的使用来计数。

7、游戏记录的保存:

当用户拼图成功后,记录当前信息到文件中,FileWriter追加写信息,FileReader完成读取数据。

4 游戏截图

5 程序源代码

登录界面部分(用户名:admin  密码:123)

import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPasswordField; import javax.swing.JTextField; public class LoginPintu extends JFrame{ JLabel jl1,jl2,jl3,jl4; JTextField jtf;//文本框 JPasswordField jpf;//密码 JButton jb1,jb2; public LoginPintu() { this.setTitle("拼图游戏"); setBounds(400,350,500,400); //设置窗体为流式布局 setLayout(new GridLayout(20,1)); //空布局 setLayout(null); init(); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); jb1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(jtf.getText().trim().equals("admin")&& new String(jpf.getPassword()).trim().equals("123")) {JOptionPane.showMessageDialog(null, "欢迎进入游戏!"); new MainJFrame();} else if(jtf.getText().trim().length()==0|| new String(jpf.getPassword()).trim().length()==0) {JOptionPane.showMessageDialog(null, "用户名或密码不能为空!");} else {JOptionPane.showMessageDialog(null, "用户名或密码错误!");} } }); jb2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // System.exit(0); //获取事件源对象 JButton jb=(JButton)e.getSource(); jtf.setText(jb.getText()); } }); } public void init() { jl1=new JLabel("拼图游戏登录窗口"); jl2=new JLabel("用户名:"); jl3=new JLabel("密码:"); jtf=new JTextField(10); jpf=new JPasswordField(10); jb1=new JButton("登录"); jb2=new JButton("取消"); jl1.setBounds(150,30,200,60); jl2.setBounds(100, 120, 180, 30); jtf.setBounds(200, 120, 180, 30); jl3.setBounds(100, 180, 180, 30); jpf.setBounds(200, 180, 180, 30); jb1.setBounds(100, 260, 100, 30); jb2.setBounds(220, 260, 100, 30); Font font = new Font("楷体",Font.PLAIN,25); jl1.setFont(font); jl1.setForeground(Color.red); add(jl1); add(jl2); add(jtf); add(jl3); add(jpf); add(jb1); add(jb2); } public static void main(String[] args) { new LoginPintu(); } }

 左面板部分

import java.awt.Image; import java.net.MalformedURLException; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; //左面板类 public class LeftJPanel extends JPanel { JLabel jl; int width=700; int height=700; //构造方法 //标签创建,指定图片,放置到面板中 public LeftJPanel(){ //左面板大小 setSize(width,height); jl=new JLabel(); jl.setSize(width,height); //把标签添加到面板中 this.add(jl); } public void init(URL url){ //绝对路径:访问文件是从盘符开始 // ImageIcon icon=new ImageIcon("D:\\1picture\\s4.jpg"); //相对路径:访问路径不是从盘符开始,可以是\,也可以是一个文件夹 // ImageIcon icon=new ImageIcon("s4.jpg");//参数是字符串的相对路径,相对于当前项目根目录 //相对路径下url的获取 // //绝对路径的url的获取 // URL url=null; // try { // url = new URL("file:\\D:\\1picture\\5.jpg"); // } catch (MalformedURLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } ImageIcon icon=new ImageIcon(url); //方法一:图片缩放 // Image image = icon.getImage(); // Image image2 = image.getScaledInstance(700, 700, 1); // ImageIcon icon2 = new ImageIcon(image2); // jl.setIcon(icon2); //链式编程方式实现图片缩放 jl.setIcon(new ImageIcon(icon.getImage().getScaledInstance(width, height, 1))); //刷新界面 validate(); } }

右面板部分

import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.net.URL; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import jdk.jfr.events.FileWriteEvent; //右面板实现ActionListener接口,右面板也就成为了监听器 public class RightJPanel extends JPanel implements ActionListener{ //面板的大小 int width=700; int height=700; //定义按钮数组 JButton[] jbs; //设置分割的行列数 int hs=2,ls=2; //按钮的宽度和高度,指定是小图图片缩放的尺寸 int widthbut,heightbut; //图片原始高度宽度 int widthtp,heighttp; //小图的原始宽度高度 int widthxt,heightxt; //实现步数计算的变量 int times; //空白按钮 JButton kb; public RightJPanel(){ //面板布局是空布局 setLayout(null); setSize(width,height); //init(); } //创建按钮,并放置到右面板 public void init(URL url) { //面板组件初始化前,先清除所有已有的组件 this.removeAll(); //创建按钮数组 jbs=new JButton[hs*ls]; //为每一个按钮实现初始化 //计算按钮的宽度和高度 //面板是700*700,拆分成3*3的9个区域 //每一块区域的宽度 700/3 //每一块区域的高度 700/3 widthbut=width/ls; heightbut=height/hs; BufferedImage buf=null; try { buf = ImageIO.read(url); //获取原图的宽度、高度 widthtp=buf.getWidth(); heighttp=buf.getHeight(); //获取小图的宽度和高度 widthxt=widthtp/ls; heightxt=heighttp/hs; //每一块按钮的坐标位置确定 for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有