<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
人類建造迷宮已有5000年的歷史。在世界的不同文化發展時期,這些奇特的建築物始終吸引人們沿著彎彎曲曲、困難重重的小路吃力地行走,尋找真相。迷宮類小遊戲應運而生。在遊戲中,迷宮被表現為冒險舞臺裡,藏有各式各樣奇妙與謎題或寶藏的危險區域。型態有洞窟、人工建築物、怪物巢穴、密林或山路等。迷宮內有惡徒或凶猛的生物(真實存在或想像物體都有)徘徊,其中可能會有陷阱、不明設施、遺蹟等。
《簡單迷宮》遊戲是用java語言實現,採用了swing技術進行了介面化處理,設計思路用了物件導向思想。
主要需求
方向鍵控制移動,角色走出迷宮,遊戲勝利。
1、構建遊戲地圖面板
2、設定迷宮地圖,包含可走的通道,不可走的牆體,還有出口位置
3、鍵盤的上下左右按鍵,來控制角色的移動
4、角色移動的演演算法,通道可走,遇到牆體不可走
5、走到終點,有成功通關的提示。
遊戲開始頁面
移動介面
通關的介面
public class MainApp extends JFrame { public MainApp(){ // 設定表單名稱 setTitle("簡易迷宮遊戲"); // 獲取自定義的遊戲地圖面板的範例物件 MapPanel panel=new MapPanel(); Container contentPane = getContentPane(); contentPane.add(panel); // 執行並構建表單設定 pack(); } public static void main(String[] args) { MainApp app=new MainApp(); // 允許表單關閉操作 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; // 設定背景方格預設行數和列數 private static final int ROW = 15; private static final int COLUMN = 15; // 設定表單單個影象,採用30x30大小的圖形,一行設定15個,即450畫素,即表單預設大小 private static final int SIZE = 30; // 設定迷宮地圖 private static final byte FLOOR = 0;// 0表示通道地板 private static final byte WALL = 1;// 1表示牆 private static final byte END = 2;// 2表示終點 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} }; // 設定顯示的影象物件 private Image floorImage; private Image wallImage; private Image heroImage; private Image endImage; // 角色座標 private int x, y; // 區分上下左右按鍵的移動 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() { // 設定面板大小 setPreferredSize(new Dimension(WIDTH, HEIGHT)); // 載入圖片 loadImage(); // 初始化角色座標 this.x = 1; this.y = 1; // 設定焦點在本表單並且監聽鍵盤事件 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() { // 獲取當前類對應相對位置image資料夾下的地板影象 ImageIcon icon = new ImageIcon(getClass().getResource("images/floor.png")); // 將地板影象範例賦給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(); // 獲取終點影象 icon = new ImageIcon(getClass().getResource("images/end.png")); endImage = icon.getImage(); } /** * 根據map[i][j]中記錄的地圖資訊繪製圖案畫出地圖 * 標記0為地板,標記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: // 標記為0時畫出地板,在指定位置載入影象 g.drawImage(floorImage, j * SIZE, i * SIZE, this); break; case 1: // 標記為1時畫出城牆 g.drawImage(wallImage, j * SIZE, i * SIZE, this); break; case 2: // 標記為2時畫出終點 g.drawImage(endImage, j * SIZE, i * SIZE, SIZE, SIZE, this); default: break; } } } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { // 根據按鍵進行移動 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, "恭喜通關!"); } } @Override public void keyReleased(KeyEvent e) { } /** * 判斷是否允許移動,如果傳入的座標不是牆則可以移動 * * @param x * @param y * @return 允許移動則返回true,否則返回false */ private boolean isAllowMove(int x, int y) { // 以判斷(x,y)是WALL還是FLOOR來作為是否能移動的根據 // 1表示牆,不能移動;0表示地板,可以移動 if (x < COLUMN && y < ROW) {// 進行引數校驗,不能超過陣列的長度 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; } } /** * 傳入人物的座標來判斷是否到達終點 * * @param x * @param y * @return */ private boolean isFinish(int x, int y) { // 2表示終點影象 // 注意:x座標表示第幾列,y座標表示第幾行,所以是map[y][x]而不是map[x][y] return map[y][x] == END; } }
通過此次的《簡易迷宮》遊戲實現,讓我對swing的相關知識有了進一步的瞭解,對java這門語言也有了比以前更深刻的認識。
java的一些基本語法,比如資料型別、運運算元、程式流程控制和陣列等,理解更加透徹。java最核心的核心就是物件導向思想,對於這一個概念,終於悟到了一些。
到此這篇關於Java實現簡單的迷宮遊戲詳解的文章就介紹到這了,更多相關Java迷宮遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45