1. 程式人生 > 其它 >Java貪吃蛇小遊戲

Java貪吃蛇小遊戲

本文學習自b站up:遇見狂神說!

首先要了解一個概念:幀,如果時間片段足夠小,就是動畫,每秒30幀 60幀。連起來是動畫,拆開就為靜態的圖片

我們這個遊戲呢就是用Java不斷的重畫,使用Timer設定重畫的時間間隔

我們在遊戲設定中也只需要幹三件事:1.定義資料 2.將其繪製於面板 3.設定監聽

首先是將資源包放入src原始檔下:
包名為static
檔案資源來自愛破解網友燭火火
連結:https://pan.baidu.com/s/1YPZSOSjK3nrZ506YpbuVAg
提取碼:mkvc

然後將資料進行封裝存放於Data類內:
package snake;

import javax.swing.*;
import java.net.URL;

//資料中心
public class Data {
//相對路徑 head.jpg
//絕對路徑 / 相當於當前的專案
public static URL headerURL=Data.class.getResource("/statics/header.png");
public static URL upURL=Data.class.getResource("/statics/up.png");
public static URL downURL=Data.class.getResource("/statics/down.png");
public static URL leftURL=Data.class.getResource("/statics/left.png");
public static URL rightURL=Data.class.getResource("/statics/right.png");
public static URL foodURL=Data.class.getResource("/statics/food.png");
public static URL bodyURL=Data.class.getResource("/statics/body.png");
public static URL headURL=Data.class.getResource("/statics/head.png");
public static ImageIcon header=new ImageIcon(headerURL);
public static ImageIcon head=new ImageIcon(headURL);
public static ImageIcon up=new ImageIcon(upURL);
public static ImageIcon down=new ImageIcon(downURL);
public static ImageIcon left=new ImageIcon(leftURL);
public static ImageIcon right=new ImageIcon(rightURL);
public static ImageIcon food=new ImageIcon(foodURL);
public static ImageIcon body=new ImageIcon(bodyURL);
}

接下來就是啟動類,將遊戲啟動起來:

package snake;

import javax.swing.*;

public class Start {
    public static void main(String[] args) {
        JFrame frame = new JFrame();


        frame.setBounds(10,10,915,720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //正常遊戲介面都應該在面上
        frame.add(new GamePanel());//將面板內容新增過來

        frame.setVisible(true);
    }
}

最後就是面板內容:
package snake;

import javax.swing.;
import java.awt.
;
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 GamePanel extends JPanel implements KeyListener , ActionListener {

//定義蛇的資料結構
int length;//蛇的長度
int[] snakeX=new int[600];//蛇的x座標 25*25
int[] snakeY=new int[500];//蛇的x座標 25*25
String found;   //初始方向

//食物的座標
int foodX;
int foodY;
Random random=new Random();

//成績
int score;

boolean isStart =false;//預設遊戲不開始

boolean isFail=false;//預設是不失敗的

//定時器  1000ms=1s
Timer timer=new Timer(100,this);//100毫秒執行一次,delay,單位是ms

public GamePanel() {
    init();
    //獲得焦點和鍵盤事件
    this.setFocusable(true);//獲得焦點事件
    this.addKeyListener(this);//獲得鍵盤監聽
    timer.start();//遊戲一開始監聽器就開始動
}

//初始化方法
public  void init(){
    length =3 ;
    snakeX[0]=100;snakeY[0]=100;//頭的座標
    snakeX[1]=75;snakeY[1]=100;//第一個身體的座標
    snakeX[2]=50;snakeY[2]=100;//第二個身體的座標
    found="R";//初始方向向又

    foodX =25 +25*random.nextInt(35);
    foodY =75 +25*random.nextInt(24);

    score=0;
}


//繪製面板,遊戲中的所有元素都使用這個畫筆
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);//清屏
    this.setBackground(Color.CYAN);
    //繪製靜態的面板
    Data.head.paintIcon(this,g,25,11);//頭部廣告欄
    g.fillRect(25,75,850,600);//預設的遊戲介面

    //畫積分
    g.setColor(Color.white);
    g.setFont(new Font("微軟雅黑",Font.BOLD,18));
    g.drawString("長度"+length,750,30);
    g.drawString("分數"+score,750,50);

    //畫食物
    Data.food.paintIcon(this,g,foodX,foodY);

    //把小蛇畫上去,蛇頭需要方向判斷
    if (found.equals("R")) {//蛇頭向右
        Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);
    }else if (found.equals("L")){//蛇頭向左
        Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
    }else if (found.equals("U")){//蛇頭向上
        Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
    }else if (found.equals("D")){//蛇頭向下
        Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
    }

    for (int i = 1; i < length; i++) {//第一個身體的座標
        Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
    }


    //遊戲狀態
    if (isStart==false){
        g.setColor(Color.white);
        //設定字型
        g.setFont(new Font("微軟雅黑",Font.BOLD,40));
        g.drawString("按下空格開始遊戲",300,300);
    }
    if (isFail==true){
        g.setColor(Color.red);
        g.setFont(new Font("微軟雅黑",Font.BOLD,40));
        g.drawString("失敗,按下空格重新開始",200,300);
    }
}


//鍵盤監聽事件
@Override
public void keyPressed(KeyEvent e) {
    int keyCode=e.getKeyCode();//獲得鍵盤按鍵是哪一個
    if (keyCode==KeyEvent.VK_SPACE){//按下空格建
       if (isFail==true){//判斷遊戲狀態是否失敗
           isFail=false;//重新開始
           init();
       }else {
           isStart = !isStart;//取反
           repaint();
       }
    }
    //小蛇移動
    if (keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){
        if (!found.equals("D")){found="U";}
    }else if (keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){
        if (!found.equals("W")){found="D";}
    }else if (keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){
        if (!found.equals("R")){found="L";}
    }else if (keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D){
        if (!found.equals("L")){found="R";}
    }
}
//事件監聽
@Override
public void actionPerformed(ActionEvent e) {
    if(isStart && isFail==false){//如果遊戲是開始狀態,就讓小蛇動起來

        //吃食物
        if (snakeX[0]==foodX &&snakeY[0]==foodY){
            length++;//長度加一
            score += 10;
            //重新生成食物
            foodX =25 +25*random.nextInt(35);
            foodY =75 +25*random.nextInt(24);
        }

        //移動
        for (int i = length-1; i >0 ; i--) {
            snakeX[i]=snakeX[i-1];//都向前移動一格
            snakeY[i]=snakeY[i-1];
        }

        //走向
        if (found.equals("R")){
            snakeX[0] = snakeX[0]+25;
            if (snakeX[0]>850){ snakeX[0]=25; }//邊界判斷
        }else if (found.equals("L")){
            snakeX[0]=snakeX[0]-25;
            if (snakeX[0]<25){ snakeX[0]=850; }//邊界判斷
        }else if (found.equals("U")){
            snakeY[0]=snakeY[0]-25;
            if (snakeY[0]<75){ snakeY[0]=650; }//邊界判斷
        }else if (found.equals("D")){
            snakeY[0]=snakeY[0]+25;
            if (snakeY[0]>650){ snakeY[0]=75; }//邊界判斷
        }

        //失敗判定
        for (int i = 1; i < length; i++) {
            if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                isFail=true;
            }
        }


        repaint();//重畫頁面
    }
    timer.start();
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {

}

}
最後開始執行就可以開始遊戲了: