java制作《石头迷阵》游戏。
java如何制作小時(shí)候玩過的經(jīng)典游戲《石頭迷陣》,打亂數(shù)字按方向鍵進(jìn)行移動(dòng),最終排好序。
下面用到的圖片我放在下面了,大家可以先去自行下載。
↓
《石頭迷陣》所需的圖片
↑
提取碼: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{
//定義二維數(shù)組
int[][] datas = new int[4][4];
// 定義一個(gè)二維勝利數(shù)組
int[][] victory = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
// 定義兩個(gè)變量記錄空白的位置0
int x0 = 0;
int y0 = 0;
// 定義一個(gè)計(jì)步變量
int step = 0;
public MyFrame() {
// 初始化界面
initFrame();
//初始化菜單
initMenu();
// 初始化數(shù)據(jù)
initDate();
// 初始化圖片
initImage();
//設(shè)置窗體可見
this.setVisible(true);
}
//窗體基本規(guī)格設(shè)置
public void initFrame(){
//設(shè)置窗體大小
this.setSize(514, 595);
//設(shè)置窗體標(biāo)題
this.setTitle(“石頭迷陣(海龜制作) v1.0”);
//設(shè)置窗體關(guān)閉程序也關(guān)閉
this.setDefaultCloseOperation(3);
//設(shè)置窗體位置在屏幕中間
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
//添加監(jiān)聽鍵盤
this.addKeyListener(this);
//設(shè)置取消窗體內(nèi)居中放置方式
this.setLayout(null);
}
//窗體菜單欄設(shè)置
public void initMenu() {
//創(chuàng)建菜單欄對(duì)象
JMenuBar jMenuBar = new JMenuBar();
//設(shè)置菜單欄的寬跟高
jMenuBar.setSize(514, 20);
//設(shè)置菜單
JMenu jMenu1 = new JMenu(“功能”);
JMenu jMenu2 = new JMenu(“關(guān)于”);
//設(shè)置子菜單
JMenuItem jMenuItem1 = new JMenuItem(“重新開始”);
JMenuItem jMenuItem2 = new JMenuItem(“聯(lián)系作者”);
//設(shè)置菜單添加子菜單
jMenu1.add(jMenuItem1);
jMenu2.add(jMenuItem2);
//設(shè)置菜單欄添加菜單
jMenuBar.add(jMenu1);
jMenuBar.add(jMenu2);
//設(shè)置菜單欄添加到最外層的窗體中
this.setJMenuBar(jMenuBar);
// 重新開始
jMenuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 調(diào)用打亂數(shù)據(jù)的方法
initDate();
// 計(jì)步器必須清0
step =0;
// 調(diào)用添加圖片的方法
initImage();
}
});
// 聯(lián)系我們
jMenuItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 創(chuàng)建一個(gè)彈窗對(duì)象
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);
// 設(shè)置彈窗大小
jDialog.setSize(344,344);
// 要把彈窗置頂
jDialog.setAlwaysOnTop(true);
// 居中顯示
jDialog.setLocationRelativeTo(null);
jDialog.setVisible(true);
}
});
}
//游戲數(shù)據(jù)邏輯
public void initDate() {
// 創(chuàng)建一個(gè)數(shù)組
int[] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// 遍歷數(shù)組
for(int i =0;i<temp.length;i++) {
// 打亂數(shù)組中的順序
Random r = new Random();
int index = r.nextInt(temp.length);
// 隨機(jī)的索引與遍歷到的數(shù)字交換
int n = temp[i];
temp[i] = temp[index];
temp[index] = n;
}
// 把打亂之后16個(gè)元素添加到二維數(shù)組中
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);
}
//添加計(jì)步器
JLabel StepJLabel = new JLabel(“步數(shù):” + step);
StepJLabel.setFont(new Font(“宋體”,Font.BOLD,20));
StepJLabel.setBounds(50, 20, 100, 20);
this.add(StepJLabel);
//窗體內(nèi)圖片設(shè)置
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);
// 將整個(gè)界面重新繪制
this.getContentPane().repaint();
}
public boolean isVictory() {
// 判斷兩個(gè)數(shù)組是否相等 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]) {
// 只要一個(gè)不相等就返回false
return false;
}
}
}
return true;
}
//按下
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println(“按下”);
}
//松開時(shí)
@Override
public void keyReleased(KeyEvent e) {
// 獲取按鍵的數(shù)字
int keyCode = e.getKeyCode();
move(keyCode);
//重新繪制圖片
initImage();
}
public void move(int keyCode) {
//左(空格向左邊移動(dòng),圖片向右移動(dòng))
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(“錯(cuò)誤!!只能上下左右”);
jLabel.setFont(new Font(“宋體”,Font.BOLD,15));
// 把圖片放到彈窗中
jDialog.add(jLabel);
// 設(shè)置彈窗大小
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”);
}
}
以上就《石頭迷陣》的源碼啦,菜雞博主希望大家可以點(diǎn)點(diǎn)贊。大家有什么意見跟建議可以在下方留言。
總結(jié)
以上是生活随笔為你收集整理的java制作《石头迷阵》游戏。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于GUI的AWT,Swing写的一个餐
- 下一篇: 【科创人】悦跑圈CTO钱荣明:创业成瘾,