Python-1 Python之路,Day2 - Python基礎2
阿新 • • 發佈:2022-04-06
package com.Gui.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];
int[] snakeY = new int[600];
//小蛇朝向
String direction = "R";//R右 L左 D下 U上
//是否開始
boolean isStart = false;
//移動計時器
Timer timer = new Timer(100,this);//100ms重新整理一次
//隨機數
Random random = new Random();
//食物的座標
int foodX,foodY;
//是否失敗
boolean isFale = false;
int score;//分數
public GamePanel(){ init(); this.setFocusable(true); this.addKeyListener(this); //食物隨機出現 foodX = 25 + 25 * random.nextInt(33); foodY = 75 + 25 * random.nextInt(25); } //初始化 public void init(){ length = 3; snakeX[0] = 100;snakeY[0] = 100; snakeX[1] = 75;snakeY[1] = 100; snakeX[2] = 50;snakeY[2] = 100; //初始化小蛇的朝向 direction = "R"; //計時器開始 timer.start(); } //繪製面板,遊戲中的所有東西,都由這個畫筆來畫 @Override protected void paintComponent(Graphics g) { super.paintComponent(g);//清屏 this.setBackground(Color.BLACK); Date.header.paintIcon(this,g,25,13);//繪製頭部廣告欄 g.fillRect(25,75,850,650);//繪製遊戲區域 //根據方向判斷畫哪個小蛇頭的朝向 if(direction.equals("R")){ Date.right.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (direction.equals("L")){ Date.lift.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (direction.equals("U")){ Date.up.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (direction.equals("D")){ Date.down.paintIcon(this,g,snakeX[0],snakeY[0]); } //畫身體 for (int i=1 ; i < length ; i++){ Date.body.paintIcon(this,g,snakeX[i],snakeY[i]); } //畫食物 Date.food.paintIcon(this,g,foodX,foodY); //長度,分數 g.setColor(Color.BLACK); g.setFont(new Font("楷書",Font.BOLD,18)); g.drawString("長度:"+length,775,35); g.drawString("分數:"+score,775,55); //按下空格 if (isStart==false){ g.setColor(Color.WHITE); g.setFont(new Font("楷書",Font.BOLD,40)); g.drawString("按下空格開始",300,300); } //失敗後 if (isFale){ g.setColor(Color.RED); g.setFont(new Font("楷書",Font.BOLD,40)); g.drawString("遊戲結束,按空格重新開始",190,300); score=0; } } @Override public void keyPressed(KeyEvent e) { int keycode = e.getKeyCode(); //空格 if (keycode==KeyEvent.VK_SPACE){ //判斷空格是停止還是重新開始 if (isFale){ isFale = false; init(); }else { isStart = !isStart; } repaint();//重新整理 } //根據鍵盤輸入判斷朝向 if (keycode==KeyEvent.VK_UP&&direction!="D"){ direction = "U"; }else if (keycode==KeyEvent.VK_DOWN&&direction!="U"){ direction = "D"; }else if (keycode==KeyEvent.VK_LEFT&&direction!="R"){ direction = "L"; }else if (keycode==KeyEvent.VK_RIGHT&&direction!="L"){ direction = "R"; } } @Override public void actionPerformed(ActionEvent e) { //小蛇身體的移動 if (isStart && isFale == false){ for (int i = length - 1 ; i > 0 ; i--){ snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; } //判斷小蛇頭部是否接觸邊界,如果接觸從另一端邊界出來 if (direction.equals("R")){ snakeX[0] = snakeX[0] + 25;if (snakeX[0] >= 875){ snakeX[0] = 25; } }else if (direction.equals("L")){ snakeX[0] = snakeX[0] - 25;if (snakeX[0] <= 0){ snakeX[0] = 850; } }else if (direction.equals("U")){ snakeY[0] = snakeY[0] - 25;if (snakeY[0] <= 50){ snakeY[0] = 700; } }else if (direction.equals("D")){ snakeY[0] = snakeY[0] + 25;if (snakeY[0] >= 725){ snakeY[0] = 75; } } //吃到食物,長度,分數變化。食物重新隨機生成 if (snakeX[0]==foodX&&snakeY[0]==foodY){ length++; score++; foodX = 25 + 25 * random.nextInt(33); foodY = 75 + 25 * random.nextInt(25); } //失敗判定 for (int i = 1;i<length;i++){ if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){ isFale = true; } } repaint(); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { }
}