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”);

}
}

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

java制作《石头迷阵》游戏。相关推荐

  1. 使用Java完成石头迷阵游戏

    石头迷阵游戏 在一张4X4的地图上,有15个数字方块以及1个空白块. 每局的排序都是随机生成,不重复,如图1所示. 使用键盘的上下左右按键控制空白方块的移动. 记录操作步数. 可以重新开始. 作弊码: ...

  2. 【教程1】Java制作国际象棋小游戏-01

    Java 制作国际象棋小游戏-01 菜鸟学了几天Java之后手痒痒了,所以开始谋划写个小游戏什么的练练手,刚好一门面向对象的课程布置了一个project,不限内容不限语言,所以菜鸟的小组决定做个国际象 ...

  3. 基于Java的石头迷阵小游戏的设计与实现

    文章目录 1 搭建游戏主界面 1.1 用JFrame类来创建窗体 (知识点继承) 1.2 菜单制作JMenuBar 1.3 添加图片 1.4 代码 2 添加游戏功能 2.1 事件监听机制 2.2 设计 ...

  4. 用JAVA制作抓老鹰游戏_Java制作最难练手速游戏,Faker都坚持不了一分钟

    原标题:Java制作最难练手速游戏,Faker都坚持不了一分钟 想练手速,来啊,互相伤害啊 Java制作最难练手速游戏,目测Faker也坚持不了一分钟 制作思路:只靠Java实现.Java.Java. ...

  5. 类似java制作计算器的游戏_急求一Java编写的类似计算机带的计算器的程序!!...

    展开全部 No 1. import java.awt.*; import java.awt.event.*; import java.applet.*; public class Calculator ...

  6. 《石头迷阵》游戏业务数据设计、游戏功能制作、游戏界面绘制

    石头迷阵 JFrame类就是用来表示窗体的类 import javax.swing.*; public class App {public static void main(String[] args ...

  7. 自学Java篇之JFrame创建《石头迷阵小游戏》

    自学Java篇之JFrame创建<石头迷阵小游戏> 根据黑马程序员java教程自学完java基础,觉得石头迷阵小游戏案例具有一定的编程练习价值,记录之. 最终效果: 案例主要思想流程: ​ ...

  8. Java石头迷阵小游戏

    //测试类 import javax.swing.*;public class Test {public static void main(String[] args) {new MainFrame( ...

  9. 黑马程序员_石头迷阵小游戏

    黑马程序员_石头迷阵小游戏 源代码 一些说明: 1)这些是我看b站黑马程序员的视频,自己手打的,想分享一下,如果有侵权啥的请联系我,马上删除 2)一些比较重要的我都有给注释 3)工具idea idk版 ...

最新文章

  1. vb 怎样指定 dll 引用路径_C#/VB.NET 比较两个Word文档差异
  2. 坐标和变换的数学基础(2)
  3. Xamarin.Forms使用Slider注意问题
  4. 大连网络推广浅谈网站过度优化的表现以及解决方法!
  5. 设置eclipse启动时使用的jdk
  6. 时速4000公里高速列车:如何30分钟北京到武汉
  7. Codeforces 815C. Karen and Supermarket【树形DP】
  8. 解决VsCode中C程序无法键盘输入的问题
  9. Golang 二叉树系列【二叉树深度】
  10. PhotoZoom放大图片,真的能无损吗?
  11. AC日记——阶乘之和 洛谷 P1009(高精度)
  12. win32汇编实现一个时钟
  13. 游戏场景设计探究:冬夏季节光色模型
  14. FPGA经典设计:再读正点原子SDRAM控制器
  15. 基于增强现实的室内导航系统如何设计架构
  16. RLC谐振电路简单计算公式
  17. 蓝桥杯历年真题大全+题型分布+分数分布
  18. “外卖式”售后服务体验来袭 沃丰科技ServiceGo让售后服务更智能
  19. php制作搜索框_搜索功能(search.php)模板制作 - WordPress模板开发
  20. Android 开发环境搭建

热门文章

  1. 懒人精灵飞桨插件的使用
  2. 普元ESO 逻辑流返回值选择java--浏览卡住
  3. J9数字论:如何去在Web2和Web3的融合中获得自己的优势呢?
  4. [QT][问题]关于QT语言家使用失败的原因之一
  5. 一文彻底搞懂MySQL基础:B树和B+树的区别
  6. org.hibernate.hql.internal.ast.QuerySyntaxException错误原因
  7. hashCode()方法是什么,hashCode相同代表什么
  8. 一些可以参考的文档集合7
  9. 玩转Jetson Nano(一)烧写系统
  10. 通过DataEase行列权限设置实现数据权限管控