Java写的贪吃蛇

     三周前,就与同学约定好了,花三周时间写个贪吃蛇,就用自己现在所学的Java,我想可以啊。学校里教不出什么东西,那就自己搞吧!于是我们信誓旦旦开始了几天。不料五一一来,把所有的都拉下了。最后一周了,没办法,通宵吧!于是连续几天苦干,终于写出来了.虽然有点粗糙,因为学校还没开始教GUI和线程,以后我会改善这代码的

 


import java.awt.*;
import java.awt.event.*;
import java.util.*;

 

//===================该类是控制蛇移动的窗口===================================================
class snakeCanvas extends Panel implements Runnable, KeyListener
{
 private Label b[] ;  //蛇的主体
 private Button food ;  // 食物
 private Thread thread;  //线程
 private int count = 1, i;  //count表示蛇的数量
 private int xFood, yFood ; //表示食物的坐标 
 private int x = 5, y = 0; //控制蛇头的坐标
 private boolean  up = false, down = false, right = true, left = false;  //用来控制蛇的方向
 private boolean Game = true ;  // 判断游戏是否结束

 snakeCanvas()
 {
  setSize( 510, 515 );
  thread = new Thread(this);
  setLayout(null);
  setBackground(Color.green); //设置背景颜色
  
  b = new Label[50] ; 
  //对蛇的初始化
  for ( int i = 0; i < 30; i++ )
  {
   b[i] = new Label("口") ;
   b[i].setSize( 10, 10 ) ;
  }
  b[0].setBounds(5, 0, 10, 10);
  add(b[0]); //添加组件

  //====================食物的随机坐标=================================
  xFood = 10*(int)( ( Math.random() + 0.01 ) * 50 ) + 5 ;
  yFood = 10*(int)( ( Math.random() + 0.01 ) * 50 )  ;
  
 }

 public void keyTyped( KeyEvent e){} 
 public void keyReleased(KeyEvent e){}
 //=========键盘事件=========================
 public void keyPressed(KeyEvent e)
 {
  if ( e.getKeyCode()  == KeyEvent.VK_DOWN && up == false )
  { 
   up = false ;
   down = true ;
   right = false ;
   left = false ;
  }
  else if (e.getKeyCode() == KeyEvent.VK_UP && down == false )
  {
   up = true;
   down = false ;
   right = false ;
   left = false ;
  }
  else if (e.getKeyCode() == KeyEvent.VK_LEFT && right == false )
  {
   up = false;
   down = false ;
   right = false ;
   left = true ;
  }
  else if (e.getKeyCode() == KeyEvent.VK_RIGHT && left == false )
  {
   up = false;
   down = false ;
   right = true ;
   left = false ;
  }     
 }

 public void start()  //线程启动
 {
  requestFocus();   //获取键盘焦点
  addKeyListener(this) ;
  thread.start();
 }
 public void stop()
 {
  Game = false ;
 }
 public void restart()  // 再来一次游戏
 {
  x = 5 ;
  y = 0 ;
  up = false;
  down = false ;
  right = true ;
  left = false ;
  Game = true ;
  repaint();
  
 }

 public void run() //运行线程
 {
 
  while(Game)  //判断是否结束游戏
  {
   
   for (; x <= 500; x += 10  )
   {
    /*
    **此循环是控制向右方向,并且判断蛇是否碰到自己的身体,如果碰到身体,设置Game为false,游戏结束
    */
    if ( right && Game )
    {
     try{
      //如果蛇吃到食物
      if ( x == xFood && y == yFood )
      {
       xFood = 10*(int)( ( Math.random() + 0.01 ) * 50 ) + 5 ;
       yFood = 10*(int)( ( Math.random() + 0.01 ) * 50 )  ;
       add( b[count++] );
       repaint();
      }
      
      //设置蛇的移动位置
      for ( i = count-1; i > 0; i-- )
      {
        b[i].setLocation( b[i-1].getX(), b[i-1].getY() );
      }
      b[i].setLocation( x, y );

      //判断蛇是否碰到身体,如有就设置Game为false
      for ( i = 4; i < count ; i++ )
      {
       if ( x == b[i].getX() && y == b[i].getY() )
       {
        Game = false ;
        break ;
       }
      }

      thread.sleep(100);
     }catch(InterruptedException e){
      System.out.println("n");
     }
    }
    else
     break;
   }
   //判断蛇是否碰墙以及游戏是否结束
   if ( x > 500 || Game == false )
   {
    Game = false ;
    repaint();
    continue ;
   }

   for (; y <= 500; y += 10  )
   {
    /*
    **此循环是控制向下方向,并且判断蛇是否碰到自己的身体,如果碰到身体,设置Game为false,游戏结束
    */
    if ( down && Game )
    {
     try
     {
      //如果蛇吃到食物
      if ( x == xFood && y == yFood )
      {
       xFood = 10*(int)( ( Math.random() + 0.01 ) * 50 ) + 5 ;
       yFood = 10*(int)( ( Math.random() + 0.01 ) * 50 )  ;
       add( b[count++] );
       repaint();
      }
      //设置蛇的移动位置
      for ( i = count-1; i > 0; i-- )
      {
        b[i].setLocation( b[i-1].getX(), b[i-1].getY() );
      }
      b[i].setLocation( x, y );
      //判断蛇是否碰到身体,如有就设置Game为false
      for ( i = 4; i < count ; i++ )
      {
       if ( x == b[i].getX() && y == b[i].getY() )
       {
        Game = false ;
        break ;
       }
      }
      thread.sleep(100);
     }catch(InterruptedException e){
      System.out.println("n");
     }
    }
    else
     break;
   }
   //判断蛇是否碰墙以及游戏是否结束
   if ( y > 500 || Game == false)
   {
    Game = false ;
    repaint();
    continue;
   }

   for (; x >= 5; x -= 10  )
   {
    /*
    **此循环是控制向右方向,并且判断蛇是否碰到自己的身体,如果碰到身体,设置Game为false,游戏结束
    */
    if ( left && Game )
    {
     try{
      //如果蛇吃到食物
      if ( x == xFood && y == yFood )
      {
       xFood = 10*(int)( ( Math.random() + 0.01 ) * 50 ) + 5 ;
       yFood = 10*(int)( ( Math.random() + 0.01 ) * 50 )  ;
       add( b[count++] );
       repaint();
      }
      //设置蛇的移动位置
      for ( i = count-1; i > 0; i-- )
      {
        b[i].setLocation( b[i-1].getX(), b[i-1].getY() );
      }
      b[i].setLocation( x, y );
      //判断蛇是否碰到身体,如有就设置Game为false
      for ( i = 4; i < count ; i++ )
      {
       if ( x == b[i].getX() && y == b[i].getY() )
       {
        Game = false ;
        break ;
       }
      }
      thread.sleep(100);
     }catch(InterruptedException e){
      System.out.println("n");
     }
    }
    else
     break;
   }
   //判断蛇是否碰墙以及游戏是否结束
   if ( x < 5 ||Game == false )
   {
    Game = false ;
    repaint();
    continue ;
   }
   for (;  y >= 0; y -= 10  )
   {
    if ( up && Game )
    {
     /*
    **此循环是控制向右方向,并且判断蛇是否碰到自己的身体,如果碰到身体,设置Game为false,游戏结束
    */
     try{
      //如果蛇吃到食物
      if ( x == xFood && y == yFood )
      {
       xFood = 10*(int)( ( Math.random() + 0.01 ) * 50 ) + 5 ;
       yFood = 10*(int)( ( Math.random() + 0.01 ) * 50 )  ;
       add( b[count++] );
       repaint();
      }
      //设置蛇的移动位置
      for ( i = count-1; i > 0; i-- )
      {
        b[i].setLocation( b[i-1].getX(), b[i-1].getY() );
      }
      b[i].setLocation( x, y );
      //判断蛇是否碰到身体,如有就设置Game为false
      for ( i = 4; i < count ; i++ )
      {
       if ( x == b[i].getX() && y == b[i].getY() )
       {
        Game = false ;
        break ;
       }
      }
      thread.sleep(100);
     }catch(InterruptedException e){
      System.out.println("n");
     }
    }
    else
     break;
   }
   //判断蛇是否碰墙以及游戏是否结束
   if ( y < 0 || Game == false )
   {
    Game = false ;
    repaint();
    continue ;
   }
  }
  //stop( this) ;
 }
 
 public void paint(Graphics g)
 {
  g.drawRect( 5, 1, 500, 509) ;  //描绘边框
  g.drawRect( xFood, yFood, 10, 10) ; //描绘食物
  
  if ( !Game ) // 判断游戏是否结束,是的话就显示you failed!
   g.drawString("you failed!", 250, 250);
 }
}

//===================该类是整个的窗口=====================================================
class canvas  extends Frame
{
 Thread thread;
 snakeCanvas s;
 public canvas()
 {
  thread = new Thread();
  setSize(510, 625 );
  setLayout( null );
  setLocation(200,50);

  Label title = new Label("这是一个贪吃蛇小游戏(有点难看,不要介意哦!)") ;
  title.setBounds( 120, 30, 250, 30 );
  add( title ) ;
  Button start = new Button("开始");
  start.setBounds( 100, 60, 80, 50 );
  add( start );
  Button stop = new Button("停止");
  stop.setBounds( 220, 60, 80, 50 ) ;
  add( stop );
  Button restart = new Button("再来一次") ;
  restart.setBounds(350, 60, 80, 50 );
  add( restart ) ;
  
  s = new snakeCanvas();
  s.setLocation( 0, 110 );
  add(s);
  setVisible(true);
  validate();

  start.addActionListener(new start()); //按钮监听器 + 匿名类
  stop.addActionListener( new stop() );
  restart.addActionListener(new restart()); //按钮监听器 + 匿名类
  addWindowListener( new WindowAdapter()  //键盘事件
      {
       public void windowClosing( WindowEvent e)
        {System.exit(0);}
      }) ;

  
 }
 public class start implements ActionListener  //开始按钮事件
 {
  public void actionPerformed(ActionEvent e)
  {
   s.start();
  }
 }
 public class stop implements ActionListener  //停止按钮事件
 {
  public void actionPerformed(ActionEvent e)
  {
   s.stop();
  }
 }
 public class restart implements ActionListener  //重开始按钮事件
 {
  public void actionPerformed( ActionEvent e )
  {
   s.restart();
  }
 }
}
 
//================================================================================
public class snake
{
 public static void main(String args[])
 {
  canvas c = new canvas();
 }
}

好的,以下是一个简单的Java贪吃蛇游戏的代码示例: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; public class SnakeGame extends JPanel implements Runnable, KeyListener { private static final long serialVersionUID = 1L; private static final int WIDTH = 500; private static final int HEIGHT = 500; private Thread thread; private boolean running; private boolean right = true, left = false, up = false, down = false; private BodyPart b; private ArrayList<BodyPart> snake; private int xCoor = 10, yCoor = 10, size = 5; private int ticks = 0; private Point apple; private Random random; private int score; public SnakeGame() { setFocusable(true); addKeyListener(this); setPreferredSize(new Dimension(WIDTH, HEIGHT)); random = new Random(); snake = new ArrayList<BodyPart>(); start(); } public void start() { running = true; thread = new Thread(this); thread.start(); } public void stop() { running = false; try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public void tick() { if (snake.size() == 0) { b = new BodyPart(xCoor, yCoor, 10); snake.add(b); } ticks++; if (ticks > 250000) { if (right) xCoor++; if (left) xCoor--; if (up) yCoor--; if (down) yCoor++; ticks = 0; b = new BodyPart(xCoor, yCoor, 10); snake.add(b); if (snake.size() > size) { snake.remove(0); } } if (apple != null) { if (xCoor == apple.x && yCoor == apple.y) { size++; score++; apple.setLocation(random.nextInt(49) * 10, random.nextInt(49) * 10); } } else { apple = new Point(random.nextInt(49) * 10, random.nextInt(49) * 10); } for (int i = 0; i < snake.size(); i++) { if (xCoor == snake.get(i).getxCoor() && yCoor == snake.get(i).getyCoor()) { if (i != snake.size() - 1) { stop(); } } } if (xCoor < 0 || xCoor > 49 || yCoor < 0 || yCoor > 49) { stop(); } } public void paint(Graphics g) { g.clearRect(0, 0, WIDTH, HEIGHT); g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); g.setColor(Color.WHITE); g.drawString("Score: " + score, 10, 20); for (int i = 0; i < snake.size(); i++) { snake.get(i).draw(g); } g.setColor(Color.RED); g.fillRect(apple.x, apple.y, 10, 10); g.setColor(Color.WHITE); g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1); } public void run() { while (running) { tick(); repaint(); } } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_RIGHT && !left) { right = true; up = false; down = false; } if (key == KeyEvent.VK_LEFT && !right) { left = true; up = false; down = false; } if (key == KeyEvent.VK_UP && !down) { up = true; left = false; right = false; } if (key == KeyEvent.VK_DOWN && !up) { down = true; left = false; right = false; } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public static void main(String[] args) { JFrame frame = new JFrame(); SnakeGame snakeGame = new SnakeGame(); frame.add(snakeGame); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Snake Game"); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } class BodyPart { private int xCoor, yCoor, width, height; public BodyPart(int xCoor, int yCoor, int tileSize) { this.xCoor = xCoor; this.yCoor = yCoor; width = tileSize; height = tileSize; } public void tick() {} public void draw(Graphics g) { g.setColor(Color.GREEN); g.fillRect(xCoor * width, yCoor * height, width, height); } public int getxCoor() { return xCoor; } public void setxCoor(int xCoor) { this.xCoor = xCoor; } public int getyCoor() { return yCoor; } public void setyCoor(int yCoor) { this.yCoor = yCoor; } } ``` 这个代码中,我们用到了Java的Swing库来创建游戏窗口和绘制游戏界面。SnakeGame类继承了JPanel类,并实现了Runnable和KeyListener接口。在start()方法中,我们启动了一个新的线程来运行游戏逻辑。在tick()方法中,我们处理了蛇的移动、吃苹果、撞墙、碰到自己等情况,并更新游戏状态。在paint()方法中,我们绘制了游戏界面。在keyPressed()方法中,我们处理了用户的方向键输入,并更新蛇的移动方向。最后,在main()方法中,我们创建了一个JFrame对象,并将SnakeGame添加到其中,然后显示窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值