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) {
}
}
最後開始執行就可以開始遊戲了: