今天用了一個多小時的時間,開發了一個簡單的貪吃蛇游戲
源碼下載:https://pan.baidu.com/s/1GrvTAHbo8s4pQu74jz2yyw
提取碼:3m8y
成品展示圖
其實用到的知識點並不多,下面展示一些自己設計
1、頁面布局
2、自己畫的幾個圖片
3、開始創建一個新的項目,並且按下面來寫
創建StartGame包,並創建Start.java
目的的創建JFrame窗體
package StartGame; import java.awt.Color; import javax.swing.JFrame; import GamePanel.GamePanel; public class Start { public static void main(String[] args) { /* * 1、創建窗體,創建主體面板, * 2、畫靜態的蛇 * 3、讓蛇動起來 (使用線程) * 4、進行鍵盤控制蛇的走動 (使用鍵盤監聽) * 5、計算分數。 */ JFrame jframe = new JFrame(); jframe.setTitle("簡單貪吃蛇游戲"); jframe.setBounds(300, 50, 650, 470); jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.add(new GamePanel()); jframe.setVisible(true); } }
創建Resources包,創建ReadyImages.java
目的是用來存放一些靜態的圖片信息
package Resources; import java.net.URL; import javax.swing.ImageIcon; public class ReadyImages { //准備好圖片 public static URL headleft = ReadyImages.class.getResource("/Resources/snakeheadleft.gif"); public static URL headright = ReadyImages.class.getResource("/Resources/snakeheadright.gif"); public static URL headup = ReadyImages.class.getResource("/Resources/snakeheadup.gif"); public static URL headdown = ReadyImages.class.getResource("/Resources/snakeheaddown.gif"); public static URL body = ReadyImages.class.getResource("/Resources/snakebody.gif"); public static URL food = ReadyImages.class.getResource("/Resources/snakefood.gif"); public static ImageIcon headleftIcon = new ImageIcon(headleft); public static ImageIcon headrightIcon = new ImageIcon(headright); public static ImageIcon headupIcon = new ImageIcon(headup); public static ImageIcon headdownIcon = new ImageIcon(headdown); public static ImageIcon bodyIcon = new ImageIcon(body); public static ImageIcon foodIcon = new ImageIcon(food); }
創建Snake包,並創建Snake.java
這個是蛇的實體類
package Snake; import javax.swing.ImageIcon; import Resources.ReadyImages; public class Snake implements Runnable { // 創建一個蛇類 public int snakeLength; // 蛇的長度 public int[] snakeX = new int[600]; // 蛇的x坐標 public int[] snakeY = new int[500]; // 蛇的y坐標 public String action = "R"; //蛇的動作,默認是向右 public ImageIcon headimages = ReadyImages.headrightIcon;//頭部的圖片 public Snake() { // 初始化蛇的位置 // 每一個格子都有(25高25寬) snakeLength = 3; snakeX[0] = 100;snakeY[0] = 100; snakeX[1] = 75;snakeY[1] = 100; snakeX[2] = 50;snakeY[2] = 100; } // 重寫run方法, @Override public void run() { for (int i = snakeLength - 1; i > 0; i--) { // 除了頭部其他的都向右移 snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } /** 吃的動作 */ public boolean eatfood(int foodx, int foody) { // 吃到食物 if (foodx == snakeX[0] && foody == snakeY[0]) { snakeLength++; // 身體加1 return true; } return false; } /**吃到自己*/ public boolean eatmyself() { for (int i = 1; i < snakeLength; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { return true; } } return false; } /**蛇的邊界問題*/ public void border() { if (action == "L") { // 判斷蛇的動作 snakeX[0] = snakeX[0] - 25; if (snakeX[0] < 25) { snakeX[0] = 600; } headimages = ReadyImages.headleftIcon; } else if (action == "R") { snakeX[0] = snakeX[0] + 25; if (snakeX[0] > 600) { snakeX[0] = 25; } headimages = ReadyImages.headrightIcon; } else if (action == "U") { snakeY[0] = snakeY[0] - 25; if (snakeY[0] < 75) { snakeY[0] = 400; } headimages = ReadyImages.headupIcon; } else if (action == "D") { snakeY[0] = snakeY[0] + 25; if (snakeY[0] > 400) { snakeY[0] = 75; } headimages = ReadyImages.headdownIcon; } } }
創建GamePanel包,並創建GamePanel.java
這個是游戲的主面板,
package GamePanel; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.util.Random; import javax.swing.JPanel; import Controller.GameKeyListener; import Resources.ReadyImages; import Snake.Snake; public class GamePanel extends JPanel{ Snake snake; //蛇的類別 GameKeyListener keyListener; //鍵盤操作 int grade = 0; //積分 boolean start = false; //是否開始游戲。默認不是 boolean dead = false; //蛇是否死亡 int foodX; //設置蛇出現的位置 int foodY; Random random = new Random(); public GamePanel(){ //初始化游戲界面 initGame(); //初始化 } /**初始化游戲*/ public void initGame() { //把線程開起來 snake = new Snake(); keyListener = new GameKeyListener(snake.action,start); foodX = 25 + 25 * random.nextInt(24); //隨機生成食物 foodY = 75 + 25 * random.nextInt(14); this.setFocusable(true); // 焦點可以在游戲上 this.addKeyListener(keyListener); //添加鍵盤事件 } //游戲畫板 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); //畫一個游戲的面板 g.setColor(Color.WHITE); g.fillRect(25, 75, 600, 350); //積分顯示塊 g.setColor(Color.BLACK); g.setFont(new Font("微軟雅黑", Font.BOLD, 18)); g.drawString("積分" + grade, 500, 50); //畫靜態蛇 snake.headimages.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]); for(int i = 1; i < snake.snakeLength; i++) { //i需要從1開始,因為頭部已經設置了 ReadyImages.bodyIcon.paintIcon(this, g, snake.snakeX[i], snake.snakeY[i]); } //畫食物 ReadyImages.foodIcon.paintIcon(this, g, foodX, foodY); //游戲的判斷 snake.action = keyListener.snakeAction(); start = keyListener.isStart(); dead = snake.eatmyself(); //吃到自己 //開始游戲 if(start == true && dead == false) { snake.run(); //讓蛇的線程跑起來 snake.border(); //蛇的邊界問題 boolean eatting = snake.eatfood(foodX, foodY);//吃到食物 if(eatting) { //吃到食物 foodX = 25 + 25 * random.nextInt(24); //隨機生成食物 foodY = 75 + 25 * random.nextInt(14); grade++; } } //暫停游戲 if (start == false && dead == false) { g.setColor(Color.BLACK); g.setFont(new Font("微軟雅黑", Font.BOLD, 30)); g.drawString("按下空格鍵開始游戲", 180, 250); } // 是否吃到自己游戲結束 if (dead) { g.setColor(Color.BLACK); g.setFont(new Font("微軟雅黑", Font.BOLD, 30)); g.drawString("游戲結束,按下空格鍵開始", 180, 250); grade = 0; } //死亡后 if(start == false && dead == true) { start = true; dead = false; initGame(); //重新游戲 } //頁面刷新(幀) repaint(); } }
創建Controller包,並創建GameKeyListener.java
這個是用來對鍵盤的一些監聽操作
package Controller; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class GameKeyListener implements KeyListener{ public String action; public boolean isstart; public GameKeyListener(String action, boolean isstart) { super(); this.action = action; this.isstart = isstart; } /**拿到蛇的操作*/ public String snakeAction() { return action; } /**是否開始游戲*/ public boolean isStart() { return isstart; } @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_SPACE) { // 按下空格鍵 isstart = !isstart; //控制暫停 } else if (keyCode == KeyEvent.VK_LEFT) { action = "L"; } else if (keyCode == KeyEvent.VK_RIGHT) { action = "R"; } else if (keyCode == KeyEvent.VK_UP) { action = "U"; } else if (keyCode == KeyEvent.VK_DOWN) { action = "D"; } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } }
完成上面的編寫,就可以運行了。
不過運行的時候,好像頁面刷新這一塊好像有些問題。希望大伙能幫老弟糾正一些!!!