日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/8 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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 搭建游戲主界面

知識點:

  • JFrame 最外層窗體,菜單圖片文字添加到JFrame當中的
  • JMenuBar 菜單欄,菜單上可以添加很多選項,如功能、關于,并且每個選項下面有很多條目進行選擇
  • JLabel 展示圖片,設置圖片的位置和大小
  • 1.1 用JFrame類來創建窗體 (知識點繼承)

    JFrame類是Java提供的,我們無法改動其中的代碼,如果想要在原有的基礎上添加額外的功能,可以使用繼承
    并在構造方法中初始化界面

    import javax.swing.*;public class MyJFrame extends JFrame {public MyJFrame() {//把當前窗體的寬高進行了設置this.setSize(514, 595);//把當前窗體的標題進行了設置this.setTitle("石頭迷陣單機版 V1.0");//把當前窗體的關閉模式進行了設置this.setDefaultCloseOperation(3);//讓當前窗體可以寫到屏幕的正中央this.setLocationRelativeTo(null);//讓當前窗體可以置頂this.setAlwaysOnTop(true);//讓當前窗體可以展示出來this.setVisible(true);} }public class App3 {public static void main(String[] args) {//1.啟動主界面MyJFrame jFrame = new MyJFrame();} }

    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的圖片到界面中
    方法思想:

  • 構造容量為4*4的一維數組,并打亂
  • 構造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();
  • //按下釋放,敲擊 @Override public void keyTyped(KeyEvent e) {}//按下未釋放 @Override public void keyPressed(KeyEvent e) {}@Override public 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 {System.out.println("只能按上下左右");}

    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中顯示出來即可

    JLabel label_step = new JLabel("步數:"+step); label_step.setBounds(50,20,100,20); this.add(label_step);

    2.5 添加重新開始功能

  • 重新開始要綁定一個事件,通過實現ActionListener接口
  • 給重新開始條目綁定事件//給條目綁定一個事件 jMenuItem1.addActionListener(this); jMenuItem2.addActionListener(this);
  • 事件內容:重新打亂順序,計步清零,繪制界面//重新數據打亂數據的順序 initData(); //計步清零 step = 0; //繪制整個界面 initImage();
  • 2.6 關于我們功能

    參照添加重新開始功能的設計

  • 重新開始要綁定一個事件,通過實現ActionListener接口
  • 給重新開始條目綁定事件
  • 事件內容:創建彈窗對象
  • //創建了一個彈窗對象 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);

    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的石头迷阵小游戏的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久久香蕉 | 国产精品主播在线 | 成人精品在线视频 | 精品国产鲁一鲁一区二区张丽 | 国产色呦呦 | 男男肉耽高h彩漫 | 亚洲九九热 | 少妇精品偷拍高潮白浆 | 嫩草在线播放 | 91蜜臀精品国产自偷在线 | 人人超碰97 | 清纯唯美亚洲综合 | 99视频一区二区 | 日本中文字幕在线视频 | 国产手机在线 | 99视频精品| 91在线影院 | 中文无码av一区二区三区 | 麻豆伦理片 | 国产精品入口66mio男同 | 黄色福利社 | 涩涩资源网| 欧洲一级黄色片 | 69中国xxxxxxxxx96| jizz国产视频 | 一区二区在线看 | 国产精品久免费的黄网站 | 国色天香一区二区 | 影音先锋在线观看视频 | 日本午夜激情视频 | av毛片基地 | 91在线一区二区三区 | 日韩视频一区在线 | av色成人| 国产欧美二区 | 丝袜制服一区 | 日韩亚洲国产欧美 | 欧美aa| 久久久久久一级片 | 九九热视 | 99精品视频在线免费观看 | 青草视频在线免费观看 | 日韩激情视频在线观看 | 中文有码在线播放 | 麻豆久久久久久久久久 | 欧美狠狠爱 | 特黄一级视频 | 天天射天天射天天射 | 日本a级c片免费看三区 | 亚洲人毛茸茸 | 痴女扩张宫交脱垂重口小说 | 免费看日韩毛片 | 骑骑上司妻电影 | 韩国女主播一区 | 天堂av免费在线观看 | 日本网站免费观看 | 青青草激情 | 国产福利在线播放 | 男人插女人下面视频 | 在线播放视频高清在线观看 | 无码人妻丰满熟妇啪啪 | 免费在线观看一区二区三区 | 日本狠狠操 | 神马伦理视频 | 日韩久久av | 中文字幕亚洲一区二区三区五十路 | 欧美极品少妇xxxxⅹ免费视频 | 91av片| 国产99re| 黄色三级视屏 | 91综合在线 | a毛片基地| 黄色裸体视频 | 午夜精品视频一区 | 热热热热色 | 人妖videosex高潮另类 | 在线天堂www在线国语对白 | 欧美大色 | av色噜噜 | 青青草原免费观看 | 亚洲欧美久久久 | 波多野结衣中文一区 | 春色激情 | 亚洲AV无码成人精品区先锋 | 精品无码av一区二区三区四区 | 欧洲做受高潮欧美裸体艺术 | 在线精品亚洲欧美日韩国产 | 噜噜噜av | 贵族女沦为官妓h呻吟 | 欧美精产国品一二三 | 日韩精品――中文字幕 | 午夜激情福利 | 怡红院av在线 | 一区二区三区视频免费 | 欧美成人福利视频 | 思思99精品视频在线观看 | 在线观看视频免费 | 国产精品亚洲二区在线观看 | 精品国产乱码 |