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

貪吃蛇小遊戲程式碼

技術標籤:計算機HTMLwebjava遊戲程式語言

貪吃蛇小遊戲程式碼

以下為貪吃蛇程式碼和簡介


前言

提示:首先建立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;
}

執行結果

提示:顯示分數
在這裡插入圖片描述

感悟

歡迎各位大佬提出意見

學習內容:

1、 搭建 Java 開發環境 2、 掌握 Java 基本語法 3、 掌握條件語句 4、 掌握迴圈語句