最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)簡單的迷宮游戲詳解

 更新時間:2022年02月10日 11:14:25   作者:小虛竹and掘金  
迷宮游戲作為經(jīng)典的小游戲,一直深受大家的喜愛。本文小編將為大家詳細(xì)介紹一下如何用Java實(shí)現(xiàn)一個簡單的迷宮小游戲,感興趣的可以動手試一試

前言

人類建造迷宮已有5000年的歷史。在世界的不同文化發(fā)展時期,這些奇特的建筑物始終吸引人們沿著彎彎曲曲、困難重重的小路吃力地行走,尋找真相。迷宮類小游戲應(yīng)運(yùn)而生。在游戲中,迷宮被表現(xiàn)為冒險(xiǎn)舞臺里,藏有各式各樣奇妙與謎題或?qū)毑氐奈kU(xiǎn)區(qū)域。型態(tài)有洞窟、人工建筑物、怪物巢穴、密林或山路等。迷宮內(nèi)有惡徒或兇猛的生物(真實(shí)存在或想像物體都有)徘徊,其中可能會有陷阱、不明設(shè)施、遺跡等。

《簡單迷宮》游戲是用java語言實(shí)現(xiàn),采用了swing技術(shù)進(jìn)行了界面化處理,設(shè)計(jì)思路用了面向?qū)ο笏枷搿?/p>

主要需求

方向鍵控制移動,角色走出迷宮,游戲勝利。

主要設(shè)計(jì)

1、構(gòu)建游戲地圖面板

2、設(shè)定迷宮地圖,包含可走的通道,不可走的墻體,還有出口位置

3、鍵盤的上下左右按鍵,來控制角色的移動

4、角色移動的算法,通道可走,遇到墻體不可走

5、走到終點(diǎn),有成功通關(guān)的提示。

功能截圖

游戲開始頁面

移動界面

通關(guān)的界面

代碼實(shí)現(xiàn)

窗口布局

public class MainApp extends JFrame {
    public MainApp(){
        // 設(shè)置窗體名稱
        setTitle("簡易迷宮游戲");
        // 獲取自定義的游戲地圖面板的實(shí)例對象
        MapPanel panel=new MapPanel();
        Container contentPane = getContentPane();
        contentPane.add(panel);
        // 執(zhí)行并構(gòu)建窗體設(shè)定
        pack();
    }

    public static void main(String[] args) {
        MainApp app=new MainApp();
        // 允許窗體關(guān)閉操作
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 顯示窗體
        app.setVisible(true);
    }
}

核心算法

public class MapPanel extends JPanel implements KeyListener {
    // 窗體的寬和高
    private static final int WIDTH = 450;
    private static final int HEIGHT = 450;
    // 設(shè)定背景方格默認(rèn)行數(shù)和列數(shù)
    private static final int ROW = 15;
    private static final int COLUMN = 15;
    // 設(shè)置窗體單個圖像,采用30x30大小的圖形,一行設(shè)置15個,即450像素,即窗體默認(rèn)大小
    private static final int SIZE = 30;

    // 設(shè)定迷宮地圖
    private static final byte FLOOR = 0;// 0表示通道地板
    private static final byte WALL = 1;// 1表示墻
    private static final byte END = 2;// 2表示終點(diǎn)
    private byte[][] map = {
            {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
            {1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1},
            {1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
            {1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1},
            {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1},
            {1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1},
            {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1},
            {1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1},
            {1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1},
            {1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1},
            {1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
            {1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1},
            {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 2, 1}
    };

    // 設(shè)定顯示的圖像對象
    private Image floorImage;
    private Image wallImage;
    private Image heroImage;
    private Image endImage;

    // 角色坐標(biāo)
    private int x, y;

    // 區(qū)分上下左右按鍵的移動
    private static final byte LEFT = 0;
    private static final byte RIGHT = 1;
    private static final byte UP = 2;
    private static final byte DOWN = 3;

    public MapPanel() {
        // 設(shè)定面板大小
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        // 加載圖片
        loadImage();
        // 初始化角色坐標(biāo)
        this.x = 1;
        this.y = 1;
        // 設(shè)定焦點(diǎn)在本窗體并且監(jiān)聽鍵盤事件
        setFocusable(true);
        addKeyListener(this);
    }

    /**
     * 畫地圖和角色
     *
     * @param g 畫筆
     */
    public void paintComponent(Graphics g) {
        drawMap(g);
        drawRole(g);
    }

    /**
     * 畫角色(英雄)
     *
     * @param g 畫筆
     */
    private void drawRole(Graphics g) {
        g.drawImage(heroImage, x * SIZE, y * SIZE, SIZE, SIZE, this);
    }

    private void loadImage() {
        // 獲取當(dāng)前類對應(yīng)相對位置image文件夾下的地板圖像
        ImageIcon icon = new ImageIcon(getClass().getResource("images/floor.png"));
        // 將地板圖像實(shí)例賦給floorImage變量
        floorImage = icon.getImage();
        // 獲取墻體圖像
        icon = new ImageIcon(getClass().getResource("images/wall.gif"));
        wallImage = icon.getImage();
        // 獲取英雄圖像
        icon = new ImageIcon(getClass().getResource("images/hero.png"));
        heroImage = icon.getImage();
        // 獲取終點(diǎn)圖像
        icon = new ImageIcon(getClass().getResource("images/end.png"));
        endImage = icon.getImage();
    }

    /**
     * 根據(jù)map[i][j]中記錄的地圖信息繪制圖案畫出地圖
     * 標(biāo)記0為地板,標(biāo)記1為墻
     *
     * @param g
     */
    private void drawMap(Graphics g) {
        for (int i = 0; i < ROW; i++) {
            for (int j = 0; j < COLUMN; j++) {
                switch (map[i][j]) {
                    case 0:
                        // 標(biāo)記為0時畫出地板,在指定位置加載圖像
                        g.drawImage(floorImage, j * SIZE, i * SIZE, this);
                        break;
                    case 1:
                        // 標(biāo)記為1時畫出城墻
                        g.drawImage(wallImage, j * SIZE, i * SIZE, this);
                        break;
                    case 2:
                        // 標(biāo)記為2時畫出終點(diǎn)
                        g.drawImage(endImage, j * SIZE, i * SIZE, SIZE, SIZE, this);
                    default:
                        break;
                }
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // 根據(jù)按鍵進(jìn)行移動
        int keyCode = e.getKeyCode();// 獲取按鍵編碼
        switch (keyCode) {
            // 左方向鍵或'A'鍵,都可以左移
            case KeyEvent.VK_LEFT:
                move(LEFT);
                break;
            case KeyEvent.VK_A:
                move(LEFT);
                break;
            // 右方向鍵或'D'鍵,都可以右移
            case KeyEvent.VK_RIGHT:
                move(RIGHT);
                break;
            case KeyEvent.VK_D:
                move(RIGHT);
                break;
            // 上方向鍵或'W'鍵,都可以上移
            case KeyEvent.VK_UP:
                move(UP);
                break;
            case KeyEvent.VK_W:
                move(UP);
                break;
            // 下方向鍵或'S'鍵,都可以下移
            case KeyEvent.VK_DOWN:
                move(DOWN);
                break;
            case KeyEvent.VK_S:
                move(DOWN);
                break;
            default:
                break;
        }
        // 重新繪制窗體圖像
        repaint();
        if (isFinish(x, y)) {
            // 移動到出口
            JOptionPane.showMessageDialog(this, "恭喜通關(guān)!");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    /**
     * 判斷是否允許移動,如果傳入的坐標(biāo)不是墻則可以移動
     *
     * @param x
     * @param y
     * @return 允許移動則返回true,否則返回false
     */
    private boolean isAllowMove(int x, int y) {
        // 以判斷(x,y)是WALL還是FLOOR來作為是否能移動的根據(jù)
        // 1表示墻,不能移動;0表示地板,可以移動
        if (x < COLUMN && y < ROW) {// 進(jìn)行參數(shù)校驗(yàn),不能超過數(shù)組的長度
            return map[y][x] != 1;
        }
        return false;
    }

    /**
     * 移動角色人物
     *
     * @param event 傳入移動方向,分別可以是LEFT、RIGHT、UP、DOWN
     */
    private void move(int event) {
        switch (event) {
            case LEFT:// 左移
                if (isAllowMove(x - 1, y)) {// 判斷左移一步后的位置是否允許移動(不是墻就可以移動)
                    x--;
                }
                break;
            case RIGHT:// 右移
                if (isAllowMove(x + 1, y)) {
                    x++;
                }
                break;
            case UP:// 上移
                if (isAllowMove(x, y - 1)) {
                    y--;
                }
                break;
            case DOWN:// 下移
                if (isAllowMove(x, y + 1)) {
                    y++;
                }
            default:
                break;
        }
    }

    /**
     * 傳入人物的坐標(biāo)來判斷是否到達(dá)終點(diǎn)
     *
     * @param x
     * @param y
     * @return
     */
    private boolean isFinish(int x, int y) {
        // 2表示終點(diǎn)圖像
        // 注意:x坐標(biāo)表示第幾列,y坐標(biāo)表示第幾行,所以是map[y][x]而不是map[x][y]
        return map[y][x] == END;
    }
}

總結(jié)

通過此次的《簡易迷宮》游戲?qū)崿F(xiàn),讓我對swing的相關(guān)知識有了進(jìn)一步的了解,對java這門語言也有了比以前更深刻的認(rèn)識。

java的一些基本語法,比如數(shù)據(jù)類型、運(yùn)算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,對于這一個概念,終于悟到了一些。

到此這篇關(guān)于Java實(shí)現(xiàn)簡單的迷宮游戲詳解的文章就介紹到這了,更多相關(guān)Java迷宮游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法

    SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法

    這篇文章主要介紹了SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java.lang.Runtime.exec() Payload知識點(diǎn)詳解

    java.lang.Runtime.exec() Payload知識點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java.lang.Runtime.exec() Payload知識點(diǎn)相關(guān)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2020-03-03
  • Maven提示jdk版本不正確的問題

    Maven提示jdk版本不正確的問題

    這篇文章主要介紹了Maven提示jdk版本不正確的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MyBatisPlus+SpringBoot實(shí)現(xiàn)樂觀鎖功能詳細(xì)流程

    MyBatisPlus+SpringBoot實(shí)現(xiàn)樂觀鎖功能詳細(xì)流程

    樂觀鎖是針對一些特定問題的解決方案,主要解決丟失更新問題,下面這篇文章主要給大家介紹了關(guān)于MyBatisPlus+SpringBoot實(shí)現(xiàn)樂觀鎖功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java語言Lang包下常用的工具類介紹

    Java語言Lang包下常用的工具類介紹

    這篇文章主要介紹了Java語言Lang包下常用的工具類介紹,次奧變覺得挺不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • 老生常談spring boot 1.5.4 日志管理(必看篇)

    老生常談spring boot 1.5.4 日志管理(必看篇)

    下面小編就為大家?guī)硪黄仙U剆pring boot 1.5.4 日志管理(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • java打印指定年月份的日歷

    java打印指定年月份的日歷

    這篇文章主要為大家詳細(xì)介紹了java打印指定年、指定月份的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 遠(yuǎn)程調(diào)用@FeignClient注解屬性使用詳解

    遠(yuǎn)程調(diào)用@FeignClient注解屬性使用詳解

    這篇文章主要為大家介紹了遠(yuǎn)程調(diào)用@FeignClient注解屬性使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 三步輕松實(shí)現(xiàn)Java的SM2前端加密后端解密

    三步輕松實(shí)現(xiàn)Java的SM2前端加密后端解密

    SM2算法和RSA算法都是公鑰密碼算法,SM2算法是一種更先進(jìn)安全的算法,在我們國家商用密碼體系中被用來替換RSA算法,這篇文章主要給大家介紹了關(guān)于如何通過三步輕松實(shí)現(xiàn)Java的SM2前端加密后端解密的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 詳解spring boot整合JMS(ActiveMQ實(shí)現(xiàn))

    詳解spring boot整合JMS(ActiveMQ實(shí)現(xiàn))

    本篇文章主要介紹了詳解spring boot整合JMS(ActiveMQ實(shí)現(xiàn)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

洪洞县| 广水市| 田阳县| 民和| 兴海县| 嘉黎县| 镇江市| 汾阳市| 吉木萨尔县| 安乡县| 漯河市| 林甸县| 宿迁市| 西和县| 灌南县| 安西县| 淳化县| 大足县| 安阳县| 泰宁县| 合作市| 平山县| 沈丘县| 博湖县| 衡山县| 内江市| 宜良县| 博野县| 丽水市| 巴林左旗| 株洲市| 延安市| 桂东县| 安阳县| 肇庆市| 越西县| 甘孜县| 宝山区| 固安县| 呼图壁县| 牙克石市|