基于Java的石头迷阵小游戏的设计与实现
生活随笔
收集整理的這篇文章主要介紹了
基于Java的石头迷阵小游戏的设计与实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 搭建游戲主界面
- 1.1 用JFrame類來創建窗體 (知識點繼承)
- 1.2 菜單制作JMenuBar
- 1.3 添加圖片
- 1.4 代碼
- 2 添加游戲功能
- 2.1 事件監聽機制
- 2.2 設計作弊
- 2.3 設計游戲勝利
- 2.4 添加計步功能
- 2.5 添加重新開始功能
- 2.6 關于我們功能
效果圖如圖所示:
1 搭建游戲主界面
知識點:
1.1 用JFrame類來創建窗體 (知識點繼承)
JFrame類是Java提供的,我們無法改動其中的代碼,如果想要在原有的基礎上添加額外的功能,可以使用繼承
并在構造方法中初始化界面
1.2 菜單制作JMenuBar
private void initMenu() {//1.創建一個菜單對象JMenuBar jMenuBar = new JMenuBar();//2.設置菜單的寬高jMenuBar.setSize(514,20);//3.創建一個選項JMenu jMenu1 = new JMenu("功能");JMenu jMenu2 = new JMenu("關于");//4.創建兩個條目jMenuItem1 = new JMenuItem("重新游戲");jMenuItem2 = new JMenuItem("聯系我們");//5.把條目添加到選項當中jMenu1.add(jMenuItem1);jMenu2.add(jMenuItem2);//6.把選項添加到菜單當中jMenuBar.add(jMenu1);jMenuBar.add(jMenu2);//7.把菜單添加到最外層的窗體當中this.setJMenuBar(jMenuBar); }1.3 添加圖片
//添加一張圖片 ImageIcon imageIcon = new ImageIcon("image\\1.png"); //創建一個JLabel對象,利用JLabel對象來設置圖片的位置和寬高 JLabel jLabel = new JLabel(imageIcon); //設置jLabel的位置和寬高 //第一個參數,第二個參數表示位置 //第三個參數,第四個參數表示寬高 jLabel.setBounds(0,0,100,100); //把JLabel添加到整個窗體當中 this.add(jLabel);通過構建二維數組,加入4*4的圖片到界面中
方法思想:
1.4 代碼
至此一個完整的界面繪制成功,但是還未添加功能
import javax.swing.*; import java.util.Random;public class MyJFrame extends JFrame {//定義一個二維數組方便管理數據private int[][] data = new int[4][4];public MyJFrame() {//添加窗體initFrame();//添加菜單initMenu();//添加圖片initImage();//讓當前窗體可以展示出來this.setVisible(true);}private void initImage() {//隨機二位數組data取得隨機的imgIndexinitData();//創建隨機的4*4圖片for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {int imgIndex = data[i][j];//第0號圖片不放,放15張圖片if (imgIndex != 0) {ImageIcon imageIcon = new ImageIcon("image\\"+imgIndex+".png");JLabel jLabel = new JLabel(imageIcon);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);}/*** 用隨機的二維數組代表圖片下標,從而生成隨機的4*4的圖片* 先構造隨機的4*4的一維數組,然后將每一個隨機的數賦值到二維數組中*/private void initData() {int[] tmp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//打亂tmp一位數組,通過隨機下標,使之成為一維隨機數組for (int i = 0; i < tmp.length; i++) {//2.獲取數組中的一個隨機索引Random r = new Random();int index = r.nextInt(tmp.length);//3.將當前遍歷到的數字,跟隨機索引上的數字兩者進行交換int number = tmp[i];tmp[i] = tmp[index];tmp[index] = number;}//把打亂后的數據添加到二維數組當中,成為隨機二維數組for (int i = 0; i < tmp.length; i++) {data[i/4][i%4]=tmp[i];}}private void initMenu() {//1.創建一個菜單對象JMenuBar jMenuBar = new JMenuBar();//2.設置菜單的寬高jMenuBar.setSize(514,20);//3.創建一個選項JMenu jMenu = new JMenu("功能");//4.創建一個條目JMenuItem jMenuItem = new JMenuItem("重新游戲");//5.把條目添加到選項當中jMenu.add(jMenuItem);//6.把選項添加到菜單當中jMenuBar.add(jMenu);//7.把菜單添加到最外層的窗體當中this.setJMenuBar(jMenuBar);}private void initFrame() {//把當前窗體的寬高進行了設置this.setSize(514, 630);//把當前窗體的標題進行了設置this.setTitle("石頭迷陣單機版 V1.0");//把當前窗體的關閉模式進行了設置this.setDefaultCloseOperation(3);//讓當前窗體可以寫到屏幕的正中央this.setLocationRelativeTo(null);//讓當前窗體可以置頂this.setAlwaysOnTop(true);//取消內部居中放置方式 能靈活調整圖片的位置this.setLayout(null);} }2 添加游戲功能
2.1 事件監聽機制
對動作進行監聽,可以監聽鼠標和鍵盤的事件
接口:Java接口是一系列方法的聲明,是一些方法特征的集合。
實現KeyListener接口(class MyJFrame extends JFrame implements KeyListener),監聽鍵盤
添加鍵盤監聽 initFrame()中增加this.addKeyListener(this);
實現鍵盤行為重寫KeyListener接口的keyTyped、keyPressed、keyReleased方法
每次觸發鍵盤后重新繪制界面,實現類似移動的效果
this.getContentPane().removeAll(); this.getContentPane().repaint();2.2 設計作弊
}else if (keyCode == 87){//按鍵w 表示作弊碼data = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}}; }else {2.3 設計游戲勝利
//勝利標志 private int[][] victory = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};if (isVictory()){//如果該方法的結果是true//那么就表示游戲勝利ImageIcon imageIcon = new ImageIcon("image\\win.png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(514/2-266/2,230,266,88);this.add(jLabel); } private boolean isVictory() {//只要判斷兩個數組中元素是否相同//data 和 victoryfor (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {if (data[i][j] != victory[i][j]){//return --- 可以寫在方法當中//1.停止方法//2.將return后面的數據,返回給調用者return false;}}}return true; }2.4 添加計步功能
在move方法中,每次監聽到一次按鍵就step++
然后在initImage中顯示出來即可
2.5 添加重新開始功能
2.6 關于我們功能
參照添加重新開始功能的設計
3 最終代碼
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random;public class MyJFrame extends JFrame implements KeyListener, ActionListener {//定義一個二維數組方便管理數據private int[][] data = new int[4][4];//定義兩個變量,用來記錄空白的位置 0private int x0 = 0;private int y0 = 0;//勝利標志private int[][] victory = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};//添加計步private int step = 0;//定義兩個條目//定義兩個條目private JMenuItem jMenuItem1;private JMenuItem jMenuItem2;public MyJFrame() {//添加窗體initFrame();//添加菜單initMenu();//隨機圖片位置initData();//添加圖片initImage();//讓當前窗體可以展示出來this.setVisible(true);}private void initImage() {//表示將界面中原來的所有的圖片全部刪除this.getContentPane().removeAll();//判斷游戲是否勝利if (isVictory()){//如果該方法的結果是true//那么就表示游戲勝利ImageIcon imageIcon = new ImageIcon("image\\win.png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(514/2-266/2,230,266,88);this.add(jLabel);}//計步功能JLabel label_step = new JLabel("步數:"+step);label_step.setBounds(50,20,100,20);this.add(label_step);//創建隨機的4*4圖片for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {int imgIndex = data[i][j];//第0號圖片不放,放1-15張圖片if (imgIndex != 0) {ImageIcon imageIcon = new ImageIcon("image\\"+imgIndex+".png");JLabel jLabel = new JLabel(imageIcon);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();}private boolean isVictory() {//只要判斷兩個數組中元素是否相同//datas 和 victoryfor (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {if (data[i][j] != victory[i][j]){//return --- 可以寫在方法當中//1.停止方法//2.將return后面的數據,返回給調用者return false;}}}return true;}/*** 隨機圖片位置* 用隨機的二維數組代表圖片下標,從而生成隨機的4*4的圖片* 先構造隨機的4*4的一維數組,然后將每一個隨機的數賦值到二維數組中代表圖片的位置*/private void initData() {int[] tmp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//打亂tmp一位數組,通過隨機下標,使之成為一維隨機數組for (int i = 0; i < tmp.length; i++) {//2.獲取數組中的一個隨機索引Random r = new Random();int index = r.nextInt(tmp.length);//3.將當前遍歷到的數字,跟隨機索引上的數字兩者進行交換int number = tmp[i];tmp[i] = tmp[index];tmp[index] = number;}//把打亂后的數據添加到二維數組當中,成為隨機二維數組for (int i = 0; i < tmp.length; i++) {data[i/4][i%4]=tmp[i];if (tmp[i] == 0){// 記錄空白圖片的位置,用來識別后續哪個圖片該移動x0 = i/4;y0 = i%4;}}}private void initMenu() {//1.創建一個菜單對象JMenuBar jMenuBar = new JMenuBar();//2.設置菜單的寬高jMenuBar.setSize(514,20);//3.創建一個選項JMenu jMenu1 = new JMenu("功能");JMenu jMenu2 = new JMenu("關于");//4.創建兩個條目jMenuItem1 = new JMenuItem("重新游戲");jMenuItem2 = new JMenuItem("聯系我們");//給條目綁定一個事件jMenuItem1.addActionListener(this);jMenuItem2.addActionListener(this);//5.把條目添加到選項當中jMenu1.add(jMenuItem1);jMenu2.add(jMenuItem2);//6.把選項添加到菜單當中jMenuBar.add(jMenu1);jMenuBar.add(jMenu2);//7.把菜單添加到最外層的窗體當中this.setJMenuBar(jMenuBar);}private void initFrame() {//把當前窗體的寬高進行了設置this.setSize(514, 630);//把當前窗體的標題進行了設置this.setTitle("石頭迷陣單機版 V1.0");//把當前窗體的關閉模式進行了設置this.setDefaultCloseOperation(3);//讓當前窗體可以寫到屏幕的正中央this.setLocationRelativeTo(null);//讓當前窗體可以置頂this.setAlwaysOnTop(true);//增加鍵盤事件監聽機制this.addKeyListener(this);//取消內部居中放置方式 能靈活調整圖片的位置this.setLayout(null);}//按下釋放,敲擊@Overridepublic void keyTyped(KeyEvent e) {}//按下未釋放@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {int keyCode = e.getKeyCode();move(keyCode);//表示重新繪制界面initImage();}private void move(int keyCode) {if (keyCode == 37){//左//表示空格右邊的圖片要向左移動if (y0 == 3){//防止數組越界return;}data[x0][y0] = data[x0][y0+1];data[x0][y0+1] = 0;y0++;step++;}else if (keyCode == 38){//上//表示空格下面的圖片向上移動if (x0 == 3){return;}data[x0][y0] = data[x0+1][y0];data[x0+1][y0] = 0;x0++;step++;}else if (keyCode == 39){//右//表示空格在左邊的圖片要向右移動if (y0 == 0){return;}data[x0][y0] = data[x0][y0-1];data[x0][y0-1] = 0;y0--;step++;}else if (keyCode == 40){//下//表示在空格上面的圖片要向上移動if (x0 == 0){return;}data[x0][y0] = data[x0-1][y0];data[x0-1][y0] = 0;x0--;step++;}else if (keyCode == 87){//按鍵w 表示作弊碼data = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}else {System.out.println("只能按上下左右");}}@Overridepublic void actionPerformed(ActionEvent e) {//判斷://如果點擊的是重新開始,那么才執行下面的代碼//如果點擊的是關于我們,彈出一個對話框if (e.getSource() == jMenuItem1){//重新數據打亂數據的順序initData();//計步清零step = 0;//繪制整個界面initImage();} else if (e.getSource() == jMenuItem2) {//創建了一個彈窗對象JDialog jDialog = new JDialog();//創建了一個圖片對象ImageIcon imageIcon = new ImageIcon("image\\about.png");JLabel jlabel = new JLabel(imageIcon);jlabel.setBounds(0,0,344,344);//把圖片放到彈窗當中jDialog.add(jlabel);//給彈框設置大小jDialog.setSize(344,344);//要把彈框在設置為置頂的效果jDialog.setAlwaysOnTop(true);//要讓jDialog居中jDialog.setLocationRelativeTo(null);//讓jDialog顯示出來jDialog.setVisible(true);}else {System.out.println("沒有這個按鍵");}} }總結
以上是生活随笔為你收集整理的基于Java的石头迷阵小游戏的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: led灯点亮
- 下一篇: fpu测试_仪器仪表 —— 一氧化碳测试