⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snake.java

📁 实现了一个贪吃蛇的基本功能
💻 JAVA
字号:
package calculator;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入

public class Snake extends JPanel{
private String dir;//要走的方向


private int blockWidth=10;//块大小
private int blockSpace=2;//块之间的间隔
private long sleepTime;//重画的进间间隔
private MySnake my;
private int total;//代表蛇的长度
private Rectangle food;//代表蛇的食物
private volatile boolean go;
private int round;//表示第几关
public Snake(JFrame jf){
  initOther();
  //为顶级窗口类JFrame添加事件处理函数
  jf.addKeyListener(new KeyAdapter(){
   public void keyReleased(KeyEvent ke){
    int code=ke.getKeyCode();
    if(code==KeyEvent.VK_RIGHT){
     if(dir!="WEST")
      dir="EAST";
    }
     
    else if(code==KeyEvent.VK_LEFT){
     if(dir!="EAST")
      dir="WEST";
    }
     
    else if(code==KeyEvent.VK_UP){
     if(dir!="SOUTH")
      dir="NORTH";
    }
     
    else if(code==KeyEvent.VK_DOWN){
     if(dir!="NORTH")
      dir="SOUTH";
    }
    else if(code==KeyEvent.VK_ENTER){
     if(!go)
     initOther();
    }
   }
  });
  this.setBounds(300,300,400,400);
  this.setVisible(true);
}
//随机生成一个食物的位置
private void makeFood(){
  int x=40+(int)(random()*30)*12;
  int y=10+(int)(random()*30)*12;
  food=new Rectangle(x,y,10,10);
}
//做一些初始化的工作
private void initOther(){
  dir="EAST";
  sleepTime=500;
  my=new MySnake();
  makeFood();
  total=3;
  round=1;
  new Thread(new Runnable(){
   public void run(){
    go=true;
    while(go){
     try{
      Thread.sleep(sleepTime);
      repaint();
     }
     catch(Exception exe){
      exe.printStackTrace();
     }
    }
   }
  }).start();
}
//处理多少关的函数
private void handleRound(){
  if(total==6){
   round=2;
   sleepTime=300;
  }
  else if(total==10){
   round=3;
   sleepTime=200;
  }
  else if(total==15){
   round=4;
   sleepTime=100;
  }
  else if(total==18){
   round=5;
   sleepTime=50;
  }
  else if(total==20){
   round=6;
   sleepTime=20;
  }
  else if(total>21){
   round=7;
   sleepTime=15;
  }
}
//把自己的组件全部画出来
public void paintComponent(Graphics g){
   g.setColor(Color.PINK);
   g.fillRect(0,0,this.getWidth(),this.getHeight());
   g.setColor(Color.BLACK);
   g.drawRect(40,10,358,360);
   if(go){
    my.move();
    my.draw(g);
    g.setFont(new Font("黑体",Font.BOLD,20));
    g.drawString("您的得分:"+(total*10)+"      第"+round+"关",40,400);
   }
   else{
    g.setFont(new Font("黑体",Font.BOLD,20));
    g.drawString("游戏结束,按回车(ENTER)键重玩!",40,440);
   }
   g.setColor(Color.RED);
   g.fillRect(food.x,food.y,food.width,food.height);
}
private class MySnake{
  private ArrayList<Rectangle> list;//改为private ArrayList list;后面的都去掉//<Rectangle>
  public MySnake(){
   list=new ArrayList<Rectangle>();
   list.add(new Rectangle(160+24,130,10,10));
   list.add(new Rectangle(160+12,130,10,10));
   list.add(new Rectangle(160,130,10,10));
  }
  //蛇移动的方法
  public void move(){
   if(isDead()){
    go=false;
    return;
   }
   if(dir=="EAST"){
    Rectangle rec=list.get(0);//找到蛇头
    Rectangle rec1=new Rectangle(rec.x+(blockWidth+blockSpace),rec.y,rec.width,rec.height);
    list.add(0,rec1);
   }
   else if(dir=="WEST"){
    Rectangle rec=list.get(0);
    Rectangle rec1=new Rectangle(rec.x-(blockWidth+blockSpace),rec.y,rec.width,rec.height);
    list.add(0,rec1);
   }
   else if(dir=="NORTH"){
    Rectangle rec=list.get(0);
    Rectangle rec1=new Rectangle(rec.x,rec.y-(blockWidth+blockSpace),rec.width,rec.height);
    list.add(0,rec1);
   }
   else if(dir=="SOUTH"){
    Rectangle rec=list.get(0);
    Rectangle rec1=new Rectangle(rec.x,rec.y+(blockWidth+blockSpace),rec.width,rec.height);
    list.add(0,rec1);
   }
   if(isEat()){
    handleRound();
    makeFood();
   }
   else{
    list.remove(list.size()-1);
   }
   
  }
  //判断是否吃到了食物
  private boolean isEat(){
   if(list.get(0).contains(food)){
    total++;
    return true;
   }
   else 
    return false;
  }
  //判断是否死了,如果碰壁或者自己吃到自己都算死了
  private boolean isDead(){
   Rectangle temp=list.get(0);
   if(dir=="EAST"){
    if(temp.x==388)
     return true;
    else{
     Rectangle comp=new Rectangle(temp.x+12,temp.y,10,10);
     for(Rectangle rec:list){
      if(rec.contains(comp))
       return true;
     }
    }
     return false;
   }
   else if(dir=="WEST"){
    if(temp.x==40)
     return true;
    else {
     Rectangle comp=new Rectangle(temp.x-12,temp.y,10,10);
     for(Rectangle rec:list){
      if(rec.contains(comp))
       return true;
     }
    }
     return false;
   }
   else if(dir=="NORTH"){
    if(temp.y==10)
     return true;
    else{
     Rectangle comp=new Rectangle(temp.x,temp.y-12,10,10);
     for(Rectangle rec:list){
      if(rec.contains(comp))
       return true;
     }
    }
     return false;
   }
   else if(dir=="SOUTH"){
    if(temp.y==358)
     return true;
    else{
     Rectangle comp=new Rectangle(temp.x,temp.y+12,10,10);
     for(Rectangle rec:list){
      if(rec.contains(comp))
       return true;
     }
    }
     return false;
   }
   else{
    return false;
   }
  }
  //把自己画出来
  public void draw(Graphics g){
   for(Rectangle rec:list){
    g.fillRect(rec.x,rec.y,rec.width,rec.height);
   }
  }
  
}
public static void main(String arsg[]){
  JFrame jf=new JFrame("贪吃蛇");
  Snake s=new Snake(jf);
  jf.getContentPane().add(s,BorderLayout.CENTER);
  jf.setBounds(300,300,500,500);
  jf.setVisible(true);
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -