贪吃蛇(狂神说)

贪吃蛇(狂神说)

package com.zishi.snake;

import javax.swing.*;

public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame();

frame.setBounds(10,10,900,720);
frame.setResizable(false);//设置窗口大小不可变
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

//正常游戏界面都应该在面板上
frame.add(new GamePanel());

frame.setVisible(true);
}
}
package com.zishi.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]; // 蛇的X坐标
   int[] snakeY = new int[500]; //蛇的Y坐标
   String fx; // 初始方向向右
   //游戏当前状态: 开始,停止
   boolean isStart = false;  //默认不开始
   //游戏失败
   boolean isFail = false;
   //定时器
   Timer timer = new Timer(100,this);
   //食物
   int foodx;
   int foody;
   //随机数
   Random random = new Random();

   int score;//成绩


   //构造器
   public GamePanel(){
       init();
       //获得焦点和键盘事件
       this.setFocusable(true);  //获得焦点事件
       this.addKeyListener(this);//获得键盘监听   this写在了当前类
       timer.start();//游戏一开始定时器就启动
  }

   //初始化方法
   public void init(){
       length = 3;
       snakeX[0] = 100;snakeY[0] = 100;//脑袋位置
       snakeX[1] = 75;snakeY[1] = 100;//第一个身体位置
       snakeX[2] = 50;snakeY[2] = 100;//第二个身体位置
       fx = "R"; //初始方向向右
       //定时器
       Timer timer = new Timer(100,this);
       //把食物随机分布在界面上   随机坐标
       foodx = 25+25*random.nextInt(34);  //25*34=850
       foody = 25+25*random.nextInt(24);   //25*24=650

       score = 0;
  }

   //绘制面板,游戏中的所有东西,都是用这个画笔来画
   @Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);  //清屏
       //绘制静态面板
       this.setBackground(Color.WHITE);
       Data.header.paintIcon(this,g,25,11);//头部广告栏绘制
       g.fillRect(25,75,850,650);//默认游戏界面

       //画积分
       g.setColor(Color.white);
       g.setFont(new Font("微软雅黑",Font.BOLD,18));
       g.drawString("长度:"+length,800,30);
       g.drawString("积分:"+score,800,55);

       //绘制食物
       Data.food.paintIcon(this,g,foodx,foody);

       //绘制小蛇
       if (fx.equals("R")) {
           Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);//蛇头初始化向右,需要通过方向来判断
      }else if (fx.equals("L")){
           Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
      }else if (fx.equals("U")){
           Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);
      }else if (fx.equals("D")){
           Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);
      }

       //绘制身体
       for (int i = 1; i < length ; i++) {
           Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);  //循环绘制各个身体
      }

       //游戏状态
       if(isStart==false){
           g.setColor(Color.white);
           g.setFont(new Font("微软雅黑",Font.BOLD,40));
           g.drawString("按下空格开始游戏",300,300);
      }

       //游戏失败判断
       if (isFail){
           g.setColor(Color.red);
           g.setFont(new Font("微软雅黑",Font.BOLD,40));
           g.drawString("游戏结束,按下空格重新开始游戏",180,300);
      }
  }


   //键盘监听事件
   @Override
   public void keyPressed(KeyEvent e) {
       int keyCode = e.getKeyCode();//获得键盘按钮是哪一个
       if(keyCode== KeyEvent.VK_SPACE){  //如果按下的是空格键
           if (isFail){
               //重新开始
               init();
          }else {
               isStart = !isStart;//取反 空格可以反复使用
          }
           repaint();
      }
       //小蛇移动
       if (keyCode==KeyEvent.VK_UP){
           fx = "U";
      }else if (keyCode==KeyEvent.VK_DOWN){
           fx = "D";
      }else if (keyCode==KeyEvent.VK_LEFT){
           fx = "L";
      }else if (keyCode==KeyEvent.VK_RIGHT){
           fx = "R";
      }
  }
   @Override
   public void keyTyped(KeyEvent e) {

  }
   @Override
   public void keyReleased(KeyEvent e) {

  }

   //事件监听---需要通过固定事件来刷新,1s=10次
   @Override
   public void actionPerformed(ActionEvent e) {
       if(isStart && isFail == false){   //游戏状态是开始状态,就让小蛇移动

           //吃食物
           if (snakeX[0] == foodx && snakeY[0] == foody){
               length++;  //长度+1
               score +=10;
               //再次随机生成食物
               foodx = 25+25*random.nextInt(34);  //25*34=850
               foody = 25+25*random.nextInt(24);   //25*24=650
          }

           //身体的移动 后一节变成前一节的位置
           for (int i = length-1; i > 0 ; i--) {   //后一节变成前一节的位置
               snakeX[i] = snakeX[i-1];   //向前移动一个格子
               snakeY[i] = snakeY[i-1];   //Y其实不用变,但也让它变成前面一节的位置
          }

           //移动反向
           if (fx.equals("R")) {
               snakeX[0] = snakeX[0] + 25;  //右移一格
               //边界判断
               if (snakeX[0] > 850) { snakeX[0] = 25;}
          }else if (fx.equals("L")){
               snakeX[0] = snakeX[0] - 25;  //左移一格
               if (snakeX[0] < 0) { snakeX[0] = 850; }
          }else if (fx.equals("U")){
               snakeY[0] = snakeY[0] - 25;  //上移一格
               if (snakeY[0] < 75) { snakeY[0] = 650; }
          }else if (fx.equals("D")){
               snakeY[0] = snakeY[0] + 25;  //下移一格
               if (snakeY[0] > 650) { snakeY[0] = 75; }
          }

           //游戏失败判断,撞到自己就算失败
           for (int i = 1; i < length; i++) {
               if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
                   isFail = true;
              }
          }

           repaint();//重画页面
      }
       timer.start();
  }
}
package com.zishi.snake;

import javax.swing.*;
import java.net.URL;

//数据中心
public class Data {

   //相对路径 amucas.jpg
   //绝对路径 / 相对于当前的项目
   public static URL headerURL = Data.class.getResource("statics/header.png");
   public static  ImageIcon header = new ImageIcon(headerURL);

   public static URL upURL = Data.class.getResource("statics/up.png");
   public static  ImageIcon up = new ImageIcon(upURL);
   public static URL downURL = Data.class.getResource("statics/down.png");
   public static  ImageIcon down = new ImageIcon(downURL);
   public static URL leftURL = Data.class.getResource("statics/left.png");
   public static  ImageIcon left = new ImageIcon(leftURL);
   public static URL rightURL = Data.class.getResource("statics/right.png");
   public static  ImageIcon right = new ImageIcon(rightURL);

   public static URL bodyURL = Data.class.getResource("statics/body.png");
   public static  ImageIcon body = new ImageIcon(bodyURL);
   public static URL foodURL = Data.class.getResource("statics/food.png");
   public static  ImageIcon food = new ImageIcon(foodURL);



}

 

posted @ 2021-08-24 23:39  子时未临  阅读(164)  评论(0编辑  收藏  举报