贪吃蛇

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

}

}

posted @ 2022-04-09 20:27  星星淮  阅读(66)  评论(0)    收藏  举报