拼图游戏。

发布时间:2023年12月18日

一.制作主界面
首先创建一个Java项目命名为puzzlegame。

再在src中创建一个包,用来制作主界面

导入所需的图片,

代码:

结果:

二.设置界面
代码:

三.初始化界面
代码:

优化代码:

结果:

四.添加图片
先在Java项目中创建图片文件夹,将图片导入其中

初始化图片:

管理图片:

合并:

五.打乱图片顺序


六.事件


七.美化界面


八.移动图片


九.总体代码
package com.itheima.ui;
?
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.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;
?
public class GameJFrame extends JFrame implements KeyListener,ActionListener{
//GameJFrame游戏的主界面
?? ?//4.创建二维数组,用来管理数据
?? ?int[][] data = new int[4][4];
?? ?int x=0;
?? ?int y=0;
?? ?
?? ?//定义一个变量,展示图片路径
?? ?String path="images\\\\";
?? ?
?? ?
?? ?//定义一个二维数组
?? ?int[][] win = {
?? ??? ??? ?{1,2,3,4},
?? ??? ??? ?{5,6,7,8},
?? ??? ??? ?{9,10,11,12},
?? ??? ??? ?{13,14,15,0}
?? ?};
?? ?
?? ?int step=0;
?? ?//创建选项下面的对象
?? ??? ??? ?JMenuItem replayItem = new JMenuItem("重新游戏");
?? ??? ??? ?JMenuItem reLoginItem = new JMenuItem("重新登入");
?? ??? ??? ?JMenuItem closeItem = new JMenuItem("关闭游戏");
?? ??? ??? ?
?? ??? ??? ?JMenuItem accountItem = new JMenuItem("公众号");
?? ?public GameJFrame() {
?? ??? ?//设置宽高
?? ??? ?this.setSize(640, 700);
?? ??? ?//设置界面的标题
?? ??? ?this.setTitle("拼图单机版1.0");
?? ??? ?//设置界面置顶
?? ??? ?this.setAlwaysOnTop(true);
?? ??? ?//设置界面居中
?? ??? ?this.setLocationRelativeTo(null);
?? ??? ?//设置关闭模式
?? ??? ?this.setDefaultCloseOperation(3);
?? ??? ?//取消默认中间放置
?? ??? ?this.setLayout(null);
?? ??? ?//监听事件
?? ??? ?this.addKeyListener(this);
?? ??? ?
?? ??? ?
?? ??? ?
?? ??? ?//初始化菜单
?? ??? ?//创建菜单对象
?? ??? ?JMenuBar jMenuBar = new JMenuBar();
?? ??? ?//创建菜单上面的选项
?? ??? ?JMenu functionJMenu = new JMenu("功能");
?? ??? ?JMenu aboutJMenu = new JMenu("关于我们");
?? ??? ?
?? ??? ?//将每一个选项下面的条目添加到选项当中
?? ??? ?functionJMenu.add(replayItem);
?? ??? ?functionJMenu.add(reLoginItem);
?? ??? ?functionJMenu.add(closeItem);
?? ??? ?
?? ??? ?aboutJMenu.add(accountItem);
?? ??? ?
?? ??? ?//绑定事件
?? ??? ?replayItem.addActionListener(this);
?? ??? ?reLoginItem.addActionListener(this);
?? ??? ?closeItem.addActionListener(this);
?? ??? ?accountItem.addActionListener(this);
?? ??? ?
?? ??? ?//将菜单里面的两个选项添加到菜单中
?? ??? ?jMenuBar.add(functionJMenu);
?? ??? ?jMenuBar.add(aboutJMenu);
?? ??? ?
?? ??? ?//给整个界面设置菜单
?? ??? ?this.setJMenuBar(jMenuBar);
?? ??? ?
?? ??? ?//初始化数据
?? ??? ?initData();
?? ??? ?
?? ??? ?//初始化图片
?? ??? ?initImage();
?? ??? ?
?? ?
?? ??? ?
?? ??? ?//显示
?? ??? ?this.setVisible(true);
?? ??? ?
?? ?}
?? ?
?? ?//初始化数据
?? ?private void initData() {
?? ?
?? ??? ?//1.定义一维数组
?? ??? ??? ??? ?int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
?? ??? ??? ??? ?//2.打乱数组中的数据顺序
?? ??? ??? ??? ?//遍历数组
?? ??? ??? ??? ?Random r = new Random();
?? ??? ??? ??? ?for(int i=0;i<tempArr.length;i++) {
?? ??? ??? ??? ??? ?//获取到随机索引
?? ??? ??? ??? ??? ?int index = r.nextInt(tempArr.length);
?? ??? ??? ??? ??? ?//拿到遍历数组的数据,和随机交换
?? ??? ??? ??? ??? ?int temp = tempArr[i];
?? ??? ??? ??? ??? ?tempArr[i] = tempArr[index];
?? ??? ??? ??? ??? ?tempArr[index] = temp;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ??? ?//遍历一维数组给二维数组
?? ??? ??? ??? ?for(int i=0;i<tempArr.length;i++) {
?? ??? ??? ??? ??? ?if(tempArr[i]== 0) {
?? ??? ??? ??? ??? ??? ?x=i/4;
?? ??? ??? ??? ??? ??? ?y=i%4;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?data[i /4][i%4] = tempArr[i];
?? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ??? ?
?
?? ?//初始化图片
?? ?//添加图片
private void initImage() {
?? ?//清空原本已经出现的所有图片
?? ?this.getContentPane().removeAll();
?? ?
?? ?if(victory()) {
?? ??? ?JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
?? ??? ?winJLabel.setBounds(60, 59, 500, 500);
?? ??? ?this.getContentPane().add(winJLabel);
?? ?}
?? ?
?? ?
?? ?JLabel stepCount =new JLabel("步数: " +step);
?? ?stepCount.setBounds(50, 30, 100, 20);
?? ?this.getContentPane().add(stepCount);
?? ?
?? ?for(int i=0;i<4;i++) {
?? ??? ?for(int j=0;j<4;j++) {
?? ??? ??? ?//获取当前图片的序号
?? ??? ??? ?int num=data[i][j];
?? ??? ??? ?JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
?? ??? ??? ?//创建一个图片JLabel对象(管理容器)
?? ??? ??? ?//指定图片位=位置
?? ??? ??? ?jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
?? ??? ??? ?//添加边框0/1都可以
?? ??? ??? ?jLabel.setBorder(new BevelBorder(1));
?? ??? ??? ?//把管理容器添加到界面中
?? ??? ??? ?this.getContentPane().add(jLabel);
?? ??? ??? ?
?? ??? ?}
?? ?}
?? ??? ?
?? ??? ?this.getContentPane().repaint();
?? ??? ?
?? ??? ?
?? ?
}
@Override
public void keyTyped(KeyEvent e) {
?? ?// TODO Auto-generated method stub
?? ?
}//按下不松时
@Override
public void keyPressed(KeyEvent e) {
?? ?// TODO Auto-generated method stub
?? ?int code = e.getKeyCode();
?? ?if(code == 65) {
?? ??? ?//清空原本已经出现的所有图片
?? ??? ?this.getContentPane().removeAll();
?? ??? ?//加载完整图片
?? ??? ?JLabel all = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
?? ??? ?all.setBounds(10, 110, 603, 485);
?? ??? ?this.getContentPane().add(all);
?? ??? ?//刷新界面
?? ??? ?this.getContentPane().repaint();
?? ?}
}
@Override
public void keyReleased(KeyEvent e) {
?? ?//判断游戏是否胜利
?? ?if(victory()) {
?? ??? ?return;
?? ?}
?? ?
?? ?
?? ?
?? ?//对上下左右进行判断
?? ?int code = e.getKeyCode();
?? ?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;
?? ?}
?? ?//把空白方块下面的数字赋值给上面
?? ?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();
}
?? ?}
public ?boolean victory() {
?? ?for(int i=0;i<data.length;i++) {
?? ??? ?for(int j=0;j<data[i].length;j++) {
?? ??? ??? ?if(data[i][j] != win[i][j]) {
?? ??? ??? ??? ?return false;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return true;
?? ?
}
?
@Override
public void actionPerformed(ActionEvent e) {
?? ?Object obj =e.getSource();
?? ?//判断
?? ?if(obj == replayItem) {
?? ??? ?System.out.println("重新游戏");
?? ??? ?step = 0;
?? ??? ?initData();
?? ??? ?initImage();
?? ?
?? ?}else if(obj == reLoginItem) {
?? ??? ?System.out.println("重新登入");
?? ??? ?this.setVisible(false);
?? ??? ?new LoginJFrame();
?? ??? ?
?? ??? ?
?? ??? ?
?? ?}else if(obj == closeItem) {
?? ??? ?System.out.println("关闭游戏");
?? ??? ?
?? ??? ?System.exit(0);
?? ?}else if(obj == accountItem) {
?? ??? ?System.out.println("公众号");
?? ?}
?? ?
}
}

package com.itheima.ui;
public class App {
?
?? ?public static void main(String[] args) {
?? ??? ?// TODO Auto-generated method stub
//程序的启动入口
?? ??? ?
?? ??? ?//想要开启谁的界面,就创建谁的对象
?? ?
?
?
?? ??? ?new GameJFrame();
?? ?}
?
}
package com.itheima.ui;
?
public class LoginJFrame {
?
}
十.结果呈现

文章来源:https://blog.csdn.net/wei631291/article/details/135040799
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。