1. 程式人生 > 其它 >Python-1 Python之路,Day2 - Python基礎2

Python-1 Python之路,Day2 - Python基礎2

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) {

}

}