贪吃蛇代码

贪吃蛇

//主页面
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);
  }
}
//游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {

   //蛇的数据结构
   int length;
   int[] snakeX = new int[600];//蛇的X坐标
   int[] snakeY = new int[500];//蛇的Y坐标
   String fx;

   int foodX,foodY;//食物的坐标
   Random random = new Random();

   int score; //成绩

   boolean isStart = false;//游戏状态,默认停止

   boolean isFail = false;//游戏是否失败,默认不失败

   Timer timer = new Timer(100,this);//定时器,100毫秒执行一次

   //构造器
   public GamePanel(){
       init();
       this.setFocusable(true);//获得焦点事件
       this.addKeyListener(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";//初始方向向右
       score = 0;

       //将食物随机放到页面中
       foodX = 25 + 25 * random.nextInt(34);
       foodY = 75 + 25 * random.nextInt(24);
  }


   //绘制面板
   @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,600);//默认游戏界面

       //画积分
       g.setColor(Color.white);
       g.setFont(new Font("微软雅黑",Font.BOLD,18));
       g.drawString("长度" + length,750,35);
       g.drawString("分数" + score,750,50);


       //画食物
       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("游戏失败,按下空格重新开始",200,300);
      }

  }

   //键盘监听事件
   @Override
   public void keyPressed(KeyEvent e) {
       int keyCode = e.getKeyCode();//获得键盘案件


       if(keyCode == KeyEvent.VK_SPACE){ //按下空格键切换状态
           if(isFail){
               //重新开始
               isFail = false;
               init();
          }else {
               isStart = !isStart;
          }
           repaint();
      }
       //小蛇移动
       if(keyCode == KeyEvent.VK_UP && !fx.equals("D")){
           fx = "U";
      }else if(keyCode == KeyEvent.VK_DOWN && !fx.equals("U")){
           fx = "D";
      }else if(keyCode == KeyEvent.VK_LEFT && !fx.equals("R")){
           fx = "L";
      }else if(keyCode == KeyEvent.VK_RIGHT && !fx.equals("L")){
           fx = "R";
      }
  }

   @Override
   public void keyReleased(KeyEvent e) {}

   @Override
   public void keyTyped(KeyEvent e) {}

   //事件监听,需要固定事件刷新
   @Override
   public void actionPerformed(ActionEvent e) {
       //如果游戏是开始状态,让小车动起来
       if(isStart && isFail == false){
           //吃食物
           if(snakeX[0] == foodX && snakeY[0] == foodY){
               length++;
               //吃一个食物增加分数
               score = score + 10;
               //吃掉食物之后生成新的
               foodX = 25 + 25 * random.nextInt(34);
               foodY = 75 + 25 * random.nextInt(24);
          }

           //移动
           for (int i = length - 1; i > 0; i--){ //身体移动,后一节的身体变成前一节的身体
               snakeX[i] = snakeX[i - 1];
               snakeY[i] = snakeY[i - 1];
          }

           //走向边界判断
           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] < 25){ 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();//开启定时器
  }
}
//数据中心
public class Data {
   public static URL headerRUL = Data.class.getResource("statics/header.png");
   public static ImageIcon header = new ImageIcon(headerRUL);
   public static URL upRUL = Data.class.getResource("statics/up.png");
   public static ImageIcon up = new ImageIcon(upRUL);
   public static URL downRUL = Data.class.getResource("statics/down.png");
   public static ImageIcon down = new ImageIcon(downRUL);
   public static URL leftRUL = Data.class.getResource("statics/left.png");
   public static ImageIcon left = new ImageIcon(leftRUL);
   public static URL rightRUL = Data.class.getResource("statics/right.png");
   public static ImageIcon right = new ImageIcon(rightRUL);
   public static URL bodyRUL = Data.class.getResource("statics/body.png");
   public static ImageIcon body = new ImageIcon(bodyRUL);
   public static URL foodRUL = Data.class.getResource("statics/food.png");
   public static ImageIcon food = new ImageIcon(foodRUL);
}
 
posted @   坚持发博客  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示