java制作《石头迷阵》游戏。

java如何制作小时候玩过的经典游戏《石头迷阵》,打乱数字按方向键进行移动,最终排好序。
在这里插入图片描述
下面用到的图片我放在下面了,大家可以先去自行下载。

《石头迷阵》所需的图片

提取码:204n

话不多说,上源码
import java.awt.Font;
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.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class MyFrame extends JFrame implements KeyListener{

//定义二维数组
int[][] datas = new int[4][4];

// 定义一个二维胜利数组
int[][] victory = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

// 定义两个变量记录空白的位置0
int x0 = 0;
int y0 = 0;

// 定义一个计步变量
int step = 0;

public MyFrame() {
// 初始化界面
initFrame();
//初始化菜单
initMenu();

// 初始化数据
initDate();

// 初始化图片
initImage();
//设置窗体可见
this.setVisible(true);
}

//窗体基本规格设置
public void initFrame(){
//设置窗体大小
this.setSize(514, 595);
//设置窗体标题
this.setTitle(“石头迷阵(海龟制作) v1.0”);
//设置窗体关闭程序也关闭
this.setDefaultCloseOperation(3);
//设置窗体位置在屏幕中间
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
//添加监听键盘
this.addKeyListener(this);
//设置取消窗体内居中放置方式
this.setLayout(null);
}

//窗体菜单栏设置
public void initMenu() {
//创建菜单栏对象
JMenuBar jMenuBar = new JMenuBar();
//设置菜单栏的宽跟高
jMenuBar.setSize(514, 20);
//设置菜单
JMenu jMenu1 = new JMenu(“功能”);
JMenu jMenu2 = new JMenu(“关于”);
//设置子菜单
JMenuItem jMenuItem1 = new JMenuItem(“重新开始”);
JMenuItem jMenuItem2 = new JMenuItem(“联系作者”);
//设置菜单添加子菜单
jMenu1.add(jMenuItem1);
jMenu2.add(jMenuItem2);
//设置菜单栏添加菜单
jMenuBar.add(jMenu1);
jMenuBar.add(jMenu2);
//设置菜单栏添加到最外层的窗体中
this.setJMenuBar(jMenuBar);
// 重新开始
jMenuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 调用打乱数据的方法
initDate();
// 计步器必须清0
step =0;
// 调用添加图片的方法
initImage();
}
});

// 联系我们
jMenuItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 创建一个弹窗对象
JDialog jDialog = new JDialog();
ImageIcon iconDD = new ImageIcon(“image\dd.png”);
JLabel jLabel = new JLabel(iconDD);
jLabel.setBounds(0, 0, 398, 344);

// 把图片放到弹窗中
jDialog.add(jLabel);
// 设置弹窗大小
jDialog.setSize(344,344);
// 要把弹窗置顶
jDialog.setAlwaysOnTop(true);
// 居中显示
jDialog.setLocationRelativeTo(null);
jDialog.setVisible(true);
}
});
}

//游戏数据逻辑
public void initDate() {
// 创建一个数组
int[] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// 遍历数组
for(int i =0;i<temp.length;i++) {

// 打乱数组中的顺序
Random r = new Random();
int index = r.nextInt(temp.length);

// 随机的索引与遍历到的数字交换
int n = temp[i];
temp[i] = temp[index];
temp[index] = n;
}
// 把打乱之后16个元素添加到二维数组中
for(int i =0;i<temp.length;i++) {
datas[i / 4][i % 4] = temp[i];
if(temp[i]==0) {
x0 = i / 4;
y0 = i / 4;
}
}
}

public void initImage() {

//删除原先的图片
this.getContentPane().removeAll();

// 绘制图片之前判断是否胜利
if(isVictory()) {
ImageIcon icon = new ImageIcon(“image\win.png”);
JLabel iconJLabel = new JLabel(icon);
iconJLabel.setBounds(514/2-266/2, 230,266, 88);
this.add(iconJLabel);
}

//添加计步器
JLabel StepJLabel = new JLabel(“步数:” + step);
StepJLabel.setFont(new Font(“宋体”,Font.BOLD,20));
StepJLabel.setBounds(50, 20, 100, 20);
this.add(StepJLabel);

//窗体内图片设置
for(int i = 0; i <datas.length; i++){
for(int j = 0 ; j < datas[i].length; j++) {
int data = datas[i][j];
if(data != 0) {
ImageIcon icon = new ImageIcon(“image\”+data+".png");
JLabel jLabel = new JLabel(icon);
jLabel.setBounds(j * 100 + 50, i * 100 +90, 100, 100);
this.add(jLabel);
}
}
}
//添加背景图
ImageIcon background = new ImageIcon(“image\background.png”);
JLabel backgroundJLabel = new JLabel(background);
backgroundJLabel.setBounds(26, 30,450, 484);
this.add(backgroundJLabel);
// 将整个界面重新绘制
this.getContentPane().repaint();

}

public boolean isVictory() {
// 判断两个数组是否相等 datas,victory
for(int i = 0; i <datas.length; i++){
for(int j = 0 ; j < datas[i].length; j++) {
if (datas[i][j] != victory[i][j]) {
// 只要一个不相等就返回false
return false;
}
}
}
return true;
}
//按下
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println(“按下”);
}

//松开时
@Override
public void keyReleased(KeyEvent e) {
// 获取按键的数字
int keyCode = e.getKeyCode();
move(keyCode);
//重新绘制图片
initImage();

}

public void move(int keyCode) {
//左(空格向左边移动,图片向右移动)
if (keyCode == 37) {
datas[x0][y0] = datas[x0][y0 + 1];
datas[x0][y0 + 1] = 0;
y0++;
step++;
} //上
else if (keyCode == 38) {
datas[x0][y0] = datas[x0 + 1][y0];
datas[x0 + 1][y0] = 0;
x0++;
step++;
}//右
else if (keyCode == 39) {
datas[x0][y0] = datas[x0][y0 - 1];
datas[x0][y0 - 1]= 0;
y0–;
step++;
}// 下
else if (keyCode == 40) {
datas[x0][y0] = datas[x0 - 1][y0];
datas[x0 - 1][y0]=0;
x0–;
step++;
}
// 作弊码
else if (keyCode == 87) {
datas = new int[][]{ {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
}
else {
JDialog jDialog = new JDialog();
JLabel jLabel = new JLabel(“错误!!只能上下左右”);
jLabel.setFont(new Font(“宋体”,Font.BOLD,15));

// 把图片放到弹窗中
jDialog.add(jLabel);
// 设置弹窗大小
jDialog.setSize(200,150);
// 要把弹窗置顶
jDialog.setAlwaysOnTop(true);
// 居中显示
jDialog.setLocationRelativeTo(null);
jDialog.setVisible(true);
}
}

@Override
public void keyTyped(KeyEvent e) {
return;
}

public static void main(String[] args) {
MyFrame myFrame = new MyFrame();
System.getProperty(“sun.arch.data.model”);

}
}

以上就《石头迷阵》的源码啦,菜鸡博主希望大家可以点点赞。大家有什么意见跟建议可以在下方留言。

猜你喜欢

转载自blog.csdn.net/guihua55/article/details/108027330