貪吃蛇小遊戲程式碼
阿新 • • 發佈:2020-12-15
貪吃蛇小遊戲程式碼
以下為貪吃蛇程式碼和簡介
前言
提示:首先建立Java專案,new一個包game,在new三個class,分別為SnakePanel、Main、Cell
引入庫
SnakePanel程式碼如下(示例):
package game;
import javax.imageio.ImageIO;
//匯入面板類
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
//匯入畫筆類 提示的快捷鍵:alt+/
import java.awt. Graphics;
//匯入隨機數類
import java.util.Random;
import java.awt.event.KeyEvent;
//匯入鍵盤監聽器介面
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
//匯入陣列工具類
import java.util.Arrays;
/**
* 蛇面板類
* @author
*/
/*繼承:子類繼承父類,子類擁有父類的方法和屬性
* 子類可以重寫和假期父類的方法
* 語法:子類extends 父類
* 語法:子類extends父類
* 介面:準則,標準
* 鍵盤控制蛇,需要實現鍵盤監聽器介面--KeyListener
* 語法:實現類implements 介面
*/
public class SnakePanel extends JPanel implements KeyListener{
//定義食物
Cell food;
//定義蛇
Cell[] snake;
/*定義四個方向:左,右,上,下
* 1、用數字代替方向,準確,方便,快
* 2、final:最終的,不可改變的,被final修飾的變數不可變
* 3、不可改變的量,同意用大寫
*/
final int LEFT =-1;
final int RIGHT = 1;
final int UP = -2;
final int DOWN = 2;
//定義蛇的方向,預設向右
int direction =DOWN ;
//定義圖片
BufferedImage background;
private boolean isStart;
private boolean isFail;
/*構造方法:給屬性賦初始值
* 語法:
* 類名(){賦值的過程}
*/
SnakePanel(){
//載入圖片
try{
background = ImageIO.read(SnakePanel.class.getResource("background.jpg"));
}catch (IOException e){
e.printStackTrace();
}
//給food的賦值
food = new Cell();
//造隨機數工具,變數ran
Random ran = new Random();
//給food的x和y賦值
food.x = ran.nextInt(20)*15;
food.y = ran.nextInt(20)*15;
//造格子陣列,賦值給snake
snake = new Cell[3];
//for迴圈給snake陣列元素賦值
/*
//造格子,賦值給snake的第0個元素
snake[0] = new Cell();
snake [0].x = 0;
snake [0].y = 0;
//造格子,賦值給snake的第1個元素
snake[1] = new Cell();
snake [1].x = 15;
snake [1].y = 0;
//造格子,賦值給snake的第2個元素
snake[2] = new Cell();
snake [2].x = 30;
snake [2].y = 0;
*/
for(int i=0; i<snake.length; i++){
snake[i] = new Cell();
snake [i].x = i*15;
snake [i].y = 0;
}
}
/*paint方法:專門畫畫的方法,在這裡畫畫板,食物,蛇
* int a :宣告整型變數a
* Graphics g:宣告畫筆類變數g,g就是畫筆
*/
public void paint(Graphics g){
//擦乾淨面板,暫時理解為固定的寫法
super.paint(g);
//畫筆畫遊戲面板
g.drawRect(0, 0, 300, 300);
//畫遊戲背景圖片
g.drawImage(background,0, 0, null);
//畫食物
g.fillRect(food.x, food.y, food.width, food.height);
//畫分數
g.drawString("SCORE:"+(snake.length-3)*10,10, 20);
//畫蛇
//練習,吧畫蛇的程式碼改成for迴圈
for(int i=0; i<snake.length; i++){
//設定畫筆的顏色
if(i%3==0){//如下標為偶數,紅色
g.setColor(Color.red);
}else if(i%3==1){//如下標為奇數,黃色
g.setColor(Color.yellow);
}else{//如下標%3=2,藍色
g.setColor(Color.blue);
}
g.fillRect(snake[i].x, snake[i].y, snake[i].width, snake[i].height);
}
//遊戲提示
if (isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微軟雅黑",Font.BOLD,20));
g.drawString("按下空格開始遊戲!",100,300);
}
//失敗判斷
if (isFail){
g.setColor(Color.RED);
g.setFont(new Font("微軟雅黑",Font.BOLD,20));
g.drawString("失敗, 按下空格重新開始",100,300);
}
}
//run方法負責蛇的移動
public void run(){
//while迴圈讓蛇不斷移動
while(true){
//1改變座標
for(int i =0; i<=snake.length-2; i++){
snake[i] = snake[i+1];
}
//新建格子,裝入蛇頭
snake[snake.length-1] =new Cell();
/*如果向右移動
* 蛇頭的x等於倒數第二格子的x+15
* 蛇頭的y等於倒數第二格子的y
*/
if(direction==RIGHT){
snake[snake.length-1].x = snake[snake.length-2].x+15;
snake[snake.length-1].y = snake[snake.length-2].y;
}
/*如果向左移動
* 蛇頭的x等於倒數第二格子的x-15
* 蛇頭的y等於倒數第二格子的y
*/
if(direction==LEFT){
snake[snake.length-1].x = snake[snake.length-2].x-15;
snake[snake.length-1].y = snake[snake.length-2].y;
}
/*如果向下移動
* 蛇頭的x等於倒數第二格子的x
* 蛇頭的y等於倒數第二格子的y+15
*/
if(direction==DOWN){
snake[snake.length-1].x = snake[snake.length-2].x;
snake[snake.length-1].y = snake[snake.length-2].y+15;
}
/*如果向上移動
* 蛇頭的x等於倒數第二格子的x
* 蛇頭的y等於倒數第二格子的y-15
*/
if(direction==UP){
snake[snake.length-1].x = snake[snake.length-2].x;
snake[snake.length-1].y = snake[snake.length-2].y-15;
}
/*
* 如果蛇頭的x==300
* 或者蛇頭的x==-15
* 或者蛇頭的y==300
* 或者蛇頭的y==-15
* 則蛇停止移動
*/
if(snake[snake.length-1].x==300||
snake[snake.length-1].x==-15||
snake[snake.length-1].y==300||
snake[snake.length-1].y==-15){
break;
}
/*
* 蛇吃到食物
* 條件:蛇頭的座標等於食物的座標
* 結果:
* 1給蛇陣列擴容一個位置
* 2吧食物裝進蛇
* 3再造食物
*/
if(snake[snake.length-1].x==food.x &&
snake[snake.length-1].y==food.y){
//1給蛇陣列擴容一個位置
snake = Arrays.copyOf(snake, snake.length+1);
//2吧食物裝進蛇頭
snake[snake.length-1]=food;
//3再造食物
//給food的賦值
food = new Cell();
//造隨機數工具,變數ran
Random ran = new Random();
//給food的x和y賦值
food.x = ran.nextInt(20)*15;
food.y = ran.nextInt(20)*15;
}
/*
* 蛇咬到自己,停止執行
* 1、for迴圈出每個格子,(除了倒數4個格子外)
* 2、對比蛇頭和身體的格子的座標,如果相等,則停止執行
*/
//定義開關,預設是關的
boolean flag = false;
for(int i=0; i<=snake.length-5; i++){
if(snake[snake.length-1].x==snake[i].x&&
snake[snake.length-1].y==snake[i].y){
flag =true;//咬到了,開關開啟
break;
}
}
//判斷開關,如果flag為true,則開啟開關,釋放break,中斷迴圈
if(flag){
break;
}
//2擦乾淨面板,重畫
repaint();
//3控制速度
/*Thread:暫時理解為程式,在這裡指代貪吃蛇遊戲
* sleep(500):程式休眠500毫秒,蛇每走一步,停頓500毫秒
*/
try {
//定義速度
int speed=400;
//如果設的長度大於等於20,則speed=50
if(snake.length>=20){
speed=50;
}
//如果設的長度大於等於15,小於20,則speed=100
if(snake.length>=15 && snake.length<20){
speed=100;
}
//如果設的長度大於等於10, 小於15 ,則speed=200
if(snake.length>=10 && snake.length<15){
speed=200;
}
//如果設的長度大於等於5,小於10, 則speed=300
if(snake.length>=5 && snake.length<10){
speed=300;
}
Thread.sleep(speed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
/*
* KyePresed:按鍵方法,通過按下某個鍵實現特定的功能
* KeyEvent e:宣告鍵盤事件,也就是按下鍵盤這個事情,
* 也是物件,呼叫e的方法,獲取按鍵編碼
*/
@Override
public void keyPressed(KeyEvent e) {
//獲取按鍵的編碼
int code = e.getKeyCode();
//System.out.println(code);
/*如果code==37並且原來的方向不等於右,那麼蛇向左移動
* 如果code==38並且原來的方向不等於下,那麼蛇向上移動
* 如果code==39並且原來的方向不等於左,那麼蛇向右移動
* 如果code==40並且原來的方向不等於上,那麼蛇向下移動
*/
if(code==37 && direction !=RIGHT){
direction=LEFT;
}
if(code==38 && direction !=DOWN){
direction=UP;
}
if(code==39 && direction !=LEFT){
direction=RIGHT;
}
if(code==40 && direction !=UP){
direction=DOWN;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
Main程式碼如下(示例):
package game;
import java.awt.Window;
//匯入視窗類
import javax.swing.JFrame;
/**
* 這是遊戲的主執行檔案,啟動遊戲在本檔案啟動
* @author
*
*/
public class Main {
//這是入口
public static void main(String[] args) {
//造視窗,變數名window
JFrame window = new JFrame();
//設定視窗大小
window.setSize(400,500);
//設定視窗居中
window.setLocationRelativeTo(null);
//設定預設關閉操作
window.setDefaultCloseOperation(3);
//造面板,變數名panel
SnakePanel panel = new SnakePanel();
//視窗新增面板
window.add(panel);
//設定視窗可見
window.setVisible(true);
//視窗新增鍵盤監聽器
window.addKeyListener(panel);
//面板新增鍵盤監聽器
panel.addKeyListener(panel);
//呼叫run方法
panel.run();
}
}
Cell程式碼如下(示例):
package game;
/**
* 格子類,用於造食物和蛇
* @author
*
*/
public class Cell {
//格子的寬
int width = 15;
//格子的高
int height = 15;
//格子的X座標
int x;
//格子的Y座標
int y;
}
執行結果
提示:顯示分數
感悟
歡迎各位大佬提出意見