这个是游戏页面的源代码
package Puzzle;
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.*; //注意这是一个导包 JFrame的导包
//JFrame 表示:界面 windows的对象,能实现最大化,最小化,关闭。
import javax.swing.border.BevelBorder; // ActionListener 的导包。
import org.w3c.dom.events.EventTarget; import org.w3c.dom.events.MouseEvent; import org.w3c.dom.views.AbstractView;
public class gamePage extends JFrame implements KeyListener,ActionListener{
int Data[][] = new int[4][4]; //当个成员变量.
//游戏相关的代码都写在这个里面.
//记录空白方块在数组里面的位置.
int x = 0;
int y = 0;
int step = 0 ; // 计数器 记载进行的步数.
//String path ="E:\\JAVA实现算法分析\\拼图\\image.0\\girl\\girl"+11+"\\"; //定义路径 方便更换图片.
String path = "image\\sport\\sport"+8+"\\";
int[][] win = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0},
};
JMenuItem girl = new JMenuItem("美女");
JMenuItem animal = new JMenuItem("动物");
JMenuItem sport = new JMenuItem("运动");
JMenuItem repalyItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
public gamePage() {
//初始化界面
initFrame();
//初始化菜单
initJM();
//初始化数据
initDate();
//初始化图片
initimage();
//展示页面
this.setVisible(true); // 表示是否展示该页面 true展示,false不展示。
}
private void initDate () {
//定义一个一维数组。
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
//打乱数组中的数据
//遍历数组,得到每一个元素并且和随机索引进行交换.
Random r = new Random();
for(int i =0 ; i<arr.length;i++) {
int index = r.nextInt(arr.length);
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//给二维数组添加数据.
for(int i = 0 ;i<arr.length ; i++) {
if(arr[i] == 0) {
x = i / 4;
y = i % 4;
}
Data[i / 4][i % 4] = arr[i]; //不管是不是零都要添加到二维数组里面.
}
}
//初始化图片
private void initimage() {
// 清除原本已经有的所有图片
this.getContentPane().removeAll();
if(victory()) {
JLabel win = new JLabel(new ImageIcon("image\\win.png"));
win.setBounds(203,283,197,73);
this.getContentPane().add(win);
}
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];
//创建一个图片ImageIcon的对象. // E:\JAVA实现算法分析\拼图\image.0\animal\animal2\11.jpg
ImageIcon icon = new ImageIcon(path+num+".jpg"); //绝对位置,可以通过属性里面查找
//创建一个JLabel的对象(管理容器) 管理文字和图片.
JLabel JL = new JLabel(icon);
//设置图片的位置.
JL.setBounds(105*j+80,105*i+125,105,105);
// 给图片添加一个边框.
JL.setBorder(new BevelBorder(1)); // 0 是凹起来 1 是突起来 // 可以记住 是固定形式.
//把管理容器添加到界面当中.
this.getContentPane().add(JL); //注意这个this指的是整个界面
}
}
//在循环后面添加 //细节 先添加图片会在上面,后加载的会在下面。
JLabel background = new JLabel(new ImageIcon("image\\background.png")); // 到时候把地址补齐就行.
background.setBounds(40,40,508,560);
//把背景插入到界面当中.
this.getContentPane().add(background); // getContentPane() 作用就是引出界面
this.getContentPane().repaint(); // 刷新页面 //要刷新的原因是 现在一直在改变的是数据 页面是没有任何操作,所以需要刷新,把页面加载出来.
}
private void initFrame() {
//在创建登录页面的时候,同时给这个页面设置一些信息。
//比如 宽高,直接展示出来.
this.setSize(602,680); // 表示该页面的长度603px,宽度680px. this表示当前对象的地址值。
this.setTitle("拼图单机版 v1.0");//表示的是页面左上角的文字 也就是游戏名字.
//this.setAlwaysOnTop(true); //表示 该页面在所以的软件的最上边。
this.setLocationRelativeTo(null);//设置 界面居中
this.setDefaultCloseOperation(3); //关闭页面,也直接关闭程序。一共有4个数字
//0 表示关不掉
//1表示关掉了但是程序还在运行
//2表示在有多个页面的时候全部页面关闭完程序才停止 并且是全部页面都设置才可以
//3表示关掉其中一个页面程序就会停止。
//取消默认的居中放置,只有取消了才会按照xy轴的形式来添加组件。(图片)
this.setLayout(null);
// 给整个页面添加家键盘接听事件.
this.addKeyListener(this); // 括号里面的this 是指调用本类里面对应的代码 片面的理解为: 本类里面的重写方法
}
private void initJM() {
//1.创建菜单JMenuBar的对象
JMenuBar jMenuBar = new JMenuBar();
//2.创建菜单上面的两个选项JMenu
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建更换图片
JMenu changeImage = new JMenu("更换图片");
//4.把美女,动物,运动添加到更换图片当中
changeImage.add(girl);
changeImage.add(animal);
changeImage.add(sport);
//5.把更换图片,重新游戏,重新登录,关闭游戏添加到功能当中
functionJMenu.add(changeImage);
functionJMenu.add(repalyItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
//6.把公众号添加到关于我们当中
aboutJMenu.add(accountItem);
//5.把功能,关于我们添加到JMenuBar当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//6.把整个菜单JMenuBar添加到整个界面当中
this.setJMenuBar(jMenuBar);
girl.addActionListener(this);
animal.addActionListener(this);
sport.addActionListener(this);
repalyItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//给整个页面设置菜单
this.setJMenuBar( jMenuBar);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override //按下不松的话调用.
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == 65) {
//1.先把界面中的图片全部删除.
this.getContentPane().removeAll();
//加载第一个完整照片.
JLabel all = new JLabel(new ImageIcon(path+"all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//加载背景图片
JLabel background = new JLabel(new ImageIcon("image\\background.png")); // 到时候把地址补齐就行.
background.setBounds(40,40,508,560);
//把背景插入到界面当中.
this.getContentPane().add(background); // getContentPane() 作用就是引出界面
this.getContentPane().repaint(); // 刷新页面 //要刷新的原因是 现在一直在改变的是数据 页面是没有任何操作,所以需要刷新,把页面加载出来.
}
}
@Override //松开时调用
public void keyReleased(KeyEvent e) {
if(victory()) {
return;
}
int code = e.getKeyCode();
System.out.println(code);
if(code == 37) {
System.out.println("向左移动");
if(y==0) {
return;
}
// x y 为空白方块的位置
// x y-1 表示是上面的位置。
Data[x][y] = Data[x][y-1];
Data[x][y-1] = 0;
y--;
step++;
// 调用方法.
initimage();
}else if (code == 38) {
System.out.println("向上移动");
if(x==0) {
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==3) {
return;
}
// x y 为空白方块的位置
// x y-1 表示是上面的位置。
Data[x][y] = Data[x][y+1];
Data[x][y+1] = 0;
y++;
step++;
// 调用方法.
initimage();
}else if (code == 40) {
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 == 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 < 4 ; i++) {
for(int j = 0 ;j < 4 ;j++) {
if(Data[i][j] != win[i][j]) {
return false;
}
}
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) { // ActionEvent 这个事件是接受鼠标左键和空格的.
//定义随机数 用来交换图片用
Random r = new Random();
Object obj = e.getSource();
// 获取当前被点击的条目对象.
if(obj == repalyItem) {
//步数清零
step = 0;
//打乱图片
initDate();
//重新加载
initimage();
}else if(obj == reLoginItem) {
// 关闭当前页面
this.setVisible(false);
// 出现登录页面
new landPage();
}else if(obj == closeItem) {
System.exit(0); //直接关闭虚拟机
}else if(obj == accountItem) {
//1.创建一个弹框对象.
JDialog log = new JDialog();
//2.创建一个管理图片的容器 JLabel
JLabel JL = new JLabel(new ImageIcon("image\\damie.jpg"));
//3.设置位置
JL.setBounds(0,0,630,650);
//4.把土图片添加到弹框中.
log.getContentPane().add(JL);
//5.设置弹框大小
log.setSize(800,800);
//6.让弹框居中
log.setLocationRelativeTo(null);
//7.弹框不关闭 没办法进行游戏
log.setModal(true);
//8.显示出来
log.setVisible(true);
}else if(obj == girl) {
System.out.println("随机交换美女图片");
int temp = r.nextInt(11)+1;
path = "image\\girl\\girl"+temp+"\\";
//重新加载
reGame();
}else if(obj == animal) {
System.out.println("随机交换动物图片");
int temp = r.nextInt(8)+1;
path = "image\\animal\\animal"+temp+"\\";
//重新加载
reGame();
}else if(obj == sport) {
System.out.println("随机交换运动图片");
int temp = r.nextInt(10)+1;
path = "image\\sport\\sport"+temp+"\\";
// 重新加载
reGame();
}
}
// 加载函数 用来加载点击过后的页面
private void reGame() {
// 重新加载
// 1.快捷键 a 和 w 的背景要换
// 2.加载里面的图片
//快捷键a
//加载里面的照片
//步数清零
step = 0;
//打乱图片
initDate();
//重新加载
initimage();
}
}
下面是 实现类
package Puzzle;
public class test {
public static void main(String[] args) {
//表示游戏的启动入口
//如果我们想要开启一个页面,就创建对应的对象就行了.
//new landPage(); //创建了lanPage的对象 this 表示的是该对象的地址值 [new landPage()]
new gamePage(); //创建了gamePage的对象
//new registrationPage(); //创建了registrationPage的对象
}
}
因为一些特殊的原因 照片我就不上传了 里面的地址代码可以换成你喜欢的照片 挺好玩的 而且在里面我添加了一些作弊的事件 比如点击w可以一键胜利,点击a可以看看完整的效果图 也可以换照片 有美女和运动和动物三中选择
特别注意的是 照片的地址位置你要写成相对位置 这样代码阅读性更高而且方便后来写换图片的源代码
运行结果如下
这个游戏挺不错的可以练习一下
标签:java,拼图,int,add,小游戏,new,JLabel,Data,页面 From: https://blog.51cto.com/u_15831800/5893734