查看完整图片
package Puzzlegame.com.wxj.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJframe extends JFrame implements KeyListener {
//游戏主界面
//创建一个二维数组
//目的:管理数据
//加载图片的时候,会根据二维数组中的数据进行加载
int [][] data=new int[4][4];
//记录空白方块在二维数组中的位置
int x=0;
int y=0;
//定义一个变量,记录当前展示的路径
String path="F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\animal\\animal3\\";
public GameJframe(){
//初始化界面
initJFrame();
//初始化菜单
initJmenuBar();
//初始化数据(打乱)
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;
}
//5.给二维数组添加数据
//解法一
//遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组中
for (int i = 0; i < tempArr.length; i++) {
if(tempArr[i]==0){
x=i/4;
y=i%4;
}else {
data[i/4][i%4]=tempArr[i];
}
}
}
//初始化图片
//添加图片的时候,就需要按照二维数组中的数据添加图片
private void initImage() {
//清除原本已经出现的图片
this.getContentPane().removeAll();
//路径分为两种;
//绝对路径:一定是从盘符开始
//相对路径:相对当前项目而言
//细节:
//先加载的图片在上方,后加载的图片在下方
//外循环
for (int i = 0; i < 4; i++) {
//内循环
for (int j = 0; j < 4; j++) {
//获取当前要加载图片的序号
int num= data[i][j];
//创建一个JLabel对象(管理容器)
JLabel jLabel=new JLabel(new ImageIcon(path+num+".jpg"));
//指定图片的位置
jLabel.setBounds(105*j+83,105*i+134,105,105);
//给图片添加边框
jLabel.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
//添加背景图片
JLabel background=new JLabel(new ImageIcon("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
private void initJmenuBar() {
//创建整个菜单对象
JMenuBar jMenuBar=new JMenuBar();
//创建菜单上的两个选项的对象(功能 关于我们)
JMenu functionJMenu=new JMenu("功能");
JMenu aboutJMenu=new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("公众号");
//将每一个选项下面的条目添加到选项中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
//初始化界面
private void initJFrame() {
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图单机版 V1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(3);
//取消默认的居中放置,只有取消了才能按照xy轴的形式添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松时会调用这个代码
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==65){
//把界面中的所有图片全部删除
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("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//对上下左右进行判断
//左:37,上:38,右:39,下:40
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++;
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++;
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--;
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--;
initImage();
}else if(code==65){
initImage();
}
}
}
作弊码
package Puzzlegame.com.wxj.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJframe extends JFrame implements KeyListener {
//游戏主界面
//创建一个二维数组
//目的:管理数据
//加载图片的时候,会根据二维数组中的数据进行加载
int [][] data=new int[4][4];
//记录空白方块在二维数组中的位置
int x=0;
int y=0;
//定义一个变量,记录当前展示的路径
String path="F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\animal\\animal3\\";
public GameJframe(){
//初始化界面
initJFrame();
//初始化菜单
initJmenuBar();
//初始化数据(打乱)
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;
}
//5.给二维数组添加数据
//解法一
//遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组中
for (int i = 0; i < tempArr.length; i++) {
if(tempArr[i]==0){
x=i/4;
y=i%4;
}else {
data[i/4][i%4]=tempArr[i];
}
}
}
//初始化图片
//添加图片的时候,就需要按照二维数组中的数据添加图片
private void initImage() {
//清除原本已经出现的图片
this.getContentPane().removeAll();
//路径分为两种;
//绝对路径:一定是从盘符开始
//相对路径:相对当前项目而言
//细节:
//先加载的图片在上方,后加载的图片在下方
//外循环
for (int i = 0; i < 4; i++) {
//内循环
for (int j = 0; j < 4; j++) {
//获取当前要加载图片的序号
int num= data[i][j];
//创建一个JLabel对象(管理容器)
JLabel jLabel=new JLabel(new ImageIcon(path+num+".jpg"));
//指定图片的位置
jLabel.setBounds(105*j+83,105*i+134,105,105);
//给图片添加边框
jLabel.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
//添加背景图片
JLabel background=new JLabel(new ImageIcon("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
private void initJmenuBar() {
//创建整个菜单对象
JMenuBar jMenuBar=new JMenuBar();
//创建菜单上的两个选项的对象(功能 关于我们)
JMenu functionJMenu=new JMenu("功能");
JMenu aboutJMenu=new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("公众号");
//将每一个选项下面的条目添加到选项中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
//初始化界面
private void initJFrame() {
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图单机版 V1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(3);
//取消默认的居中放置,只有取消了才能按照xy轴的形式添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松时会调用这个代码
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==65){
//把界面中的所有图片全部删除
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("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//对上下左右进行判断
//左:37,上:38,右:39,下:40
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++;
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++;
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--;
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--;
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();
}
}
}
判断胜利
package Puzzlegame.com.wxj.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJframe extends JFrame implements KeyListener {
//游戏主界面
//创建一个二维数组
//目的:管理数据
//加载图片的时候,会根据二维数组中的数据进行加载
int [][] data=new int[4][4];
//记录空白方块在二维数组中的位置
int x=0;
int y=0;
//定义一个变量,记录当前展示的路径
String path="F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\animal\\animal3\\";
//定义一个二维数组,存储正确的数据
int[][] win={ {1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}};
public GameJframe(){
//初始化界面
initJFrame();
//初始化菜单
initJmenuBar();
//初始化数据(打乱)
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;
}
//5.给二维数组添加数据
//解法一
//遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组中
for (int i = 0; i < tempArr.length; i++) {
if(tempArr[i]==0){
x=i/4;
y=i%4;
}else {
data[i/4][i%4]=tempArr[i];
}
}
}
//初始化图片
//添加图片的时候,就需要按照二维数组中的数据添加图片
private void initImage() {
//清除原本已经出现的图片
this.getContentPane().removeAll();
if (victory()) {
//显示胜利的图片
JLabel winJLabel=new JLabel(new ImageIcon("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\win.png"));
winJLabel.setBounds(203,283,197,73);
this.getContentPane().add(winJLabel);
}
//路径分为两种;
//绝对路径:一定是从盘符开始
//相对路径:相对当前项目而言
//细节:
//先加载的图片在上方,后加载的图片在下方
//外循环
for (int i = 0; i < 4; i++) {
//内循环
for (int j = 0; j < 4; j++) {
//获取当前要加载图片的序号
int num= data[i][j];
//创建一个JLabel对象(管理容器)
JLabel jLabel=new JLabel(new ImageIcon(path+num+".jpg"));
//指定图片的位置
jLabel.setBounds(105*j+83,105*i+134,105,105);
//给图片添加边框
jLabel.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
//添加背景图片
JLabel background=new JLabel(new ImageIcon("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
private void initJmenuBar() {
//创建整个菜单对象
JMenuBar jMenuBar=new JMenuBar();
//创建菜单上的两个选项的对象(功能 关于我们)
JMenu functionJMenu=new JMenu("功能");
JMenu aboutJMenu=new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("公众号");
//将每一个选项下面的条目添加到选项中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
//初始化界面
private void initJFrame() {
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图单机版 V1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(3);
//取消默认的居中放置,只有取消了才能按照xy轴的形式添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松时会调用这个代码
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==65){
//把界面中的所有图片全部删除
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("F:\\javaEE\\src\\Puzzlegame\\com\\wxj\\ui\\image\\background.png"));
background.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//判断游戏是否胜利,如果胜利此方法需要直接结束,不能在执行下面的移动代码
if (victory()) {
//结束方法
return;
}
//对上下左右进行判断
//左:37,上:38,右:39,下:40
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++;
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++;
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--;
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--;
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();
}
}
//判断data数组中数据是否和win数组中相同
//如果全部相同返回true否则返回false
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;
}
}