java開發簡單貪吃蛇游戲


今天用了一個多小時的時間,開發了一個簡單的貪吃蛇游戲

 

源碼下載: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
        
    }

}

 

  完成上面的編寫,就可以運行了。

  不過運行的時候,好像頁面刷新這一塊好像有些問題。希望大伙能幫老弟糾正一些!!!

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM