首页 > 编程语言 >java 简单拼图小游戏的实现

java 简单拼图小游戏的实现

时间:2022-11-28 22:04:11浏览次数:44  
标签:java 拼图 int add 小游戏 new JLabel Data 页面



这个是游戏页面的源代码

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 简单拼图小游戏的实现_java



java 简单拼图小游戏的实现_java拼图游戏_02

                          

java 简单拼图小游戏的实现_java_03


这个游戏挺不错的可以练习一下

标签:java,拼图,int,add,小游戏,new,JLabel,Data,页面
From: https://blog.51cto.com/u_15831800/5893734

相关文章

  • java:[5,51] 程序包com.alibaba.dru id.spring.boot.autoconfigure不存在
    一、报错信息二、解决方案mvn-Uidea:idea ......
  • Java开发中String.format的妙用
    format方法是String类中的一个方法,主要作用是用来格式化字符串。当前做的一个功能当中,刚好用到了这个方法,代码处理起来非常简便。因此就写篇博客记录下来。分析......
  • Java学习八
    一.小结1.类是对象的模板。它定义对象的属性,并提供创建对象的构造方法以及对对象进行操作的方法。2.类也是一种数据类型。可以用它声明对象引用变量。对象引用变量中似乎......
  • java n皇后问题 详细源代码 并且把结果一一打印出来了
    packageNqueen;importjava.util.Scanner;publicclassnQueen{publicstaticintvrb1;//定义一个全局变量用来使用publicstaticvoidmain(String[]args){Scan......
  • javaSE基础-语法基础
    基础语法Java语言出现于1991年,JDK1.0版本正式发布于1995年Java之父:JamesGosling(詹姆斯•高斯林)Java是一种面向对象的编程语言Java语言是一种编译解释型语言Java语......
  • javaSE基础-目录导航
    目录导航+语法基础+数组+面向对象(OOP)-接口-抽象-内部类+异常+集合-泛型+其他常用类-时期时间-比较器-字符串+IO流+多线程+网络编程+......
  • java泛型机制
    泛型概述泛型使用的必要性泛型类泛型接口泛型对象引用传递的解决方案泛型方法泛型的简单应用---本文中将介绍泛型的基础知识以及简单应用,后面还计划......
  • java泛型机制(基础知识总结篇)
    泛型概述泛型使用的必要性泛型类泛型接口泛型对象引用传递的解决方案泛型方法泛型的简单应用---本文中将介绍泛型的基础知识以及简单应用,后面还计划......
  • 从 Java 到 Kotlin - 介绍 Kotlin
    B站视频:​​https://www.bilibili.com/video/BV1Ti4y197u9/?share_source=copy_web&vd_source=74448386fecd6b0affd408eabb573749​​语法层面可空对象(和C#的<Nullable>......
  • Java8 Function 用法简介
    publicclassFunctionTest{publicstaticvoidmain(String[]args){Function<Numbers,Integer>test1=i->i.getN1()-i.getN2();Funct......