R-B 发表于 2015-07-06 14:26

贪吃蛇电脑版本

Frame.javapackage snake;

import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Frame extends JFrame implements KeyListener {

    /**
   *
   */
   
    Boolean isAlive;
    Boolean isPause;
    Panel panel;
    Characterdirection;
    private static final long serialVersionUID = 1L;

    public Frame(){
      // TODO Auto-generated constructor stub
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(300,300);
      addKeyListener(this);
      panel = new Panel();
      add(panel);
      setVisible(true);
      isAlive = true;
      isPause = false;
      direction = new Character('d');
      MenuBar menuBar = new MenuBar();
      Menu menu = new Menu("menu");
      MenuItem reset = new MenuItem("newgame");
      MenuItem pause= new MenuItem("pause");
         
      pause.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if(!isPause) isPause= true;
                else         isPause= false;
            }
            
      });
         
      reset.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                reset();
            }
            
      });
         
      menu.add(reset);
      menu.add(pause);
      menuBar.add(menu);
      setMenuBar(menuBar);
         
         
    }
   
    public void reset(){
      panel.reset();
      isAlive = true;
    }

    @Override
    public void keyTyped(KeyEvent e) {
      // TODO Auto-generated method stub
         
    }

    @Override
    public void keyPressed(KeyEvent e) {
      // TODO Auto-generated method stub
      if(e.getKeyCode()==KeyEvent.VK_UP)    direction = 'w';
      if(e.getKeyCode()==KeyEvent.VK_DOWN)direction = 's';
      if(e.getKeyCode()==KeyEvent.VK_LEFT)direction = 'a';
      if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd';
    }

    @Override
    public void keyReleased(KeyEvent e) {
      // TODO Auto-generated method stub
         
    }
   
    public void paint(Graphics g){
      panel.repaint();
    }

}Launch.javapackage snake;

import java.util.Timer;
import java.util.TimerTask;

public class Launch extends TimerTask {

    Frame frame = new Frame();
    public Launch() {
      // TODO Auto-generated constructor stub
         
    }
   
    boolean crashWall(){
      SnakeBody sb = frame.panel.snake.getFirst();
      if((sb.x<0)||(sb.y<0)||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE))
            return true;
      else
            return false;
    }
    void initial(){
      frame.panel.snake.add(newBody());
      frame.panel.food = newBody();
    }
    @Override
    public void run() {
      // TODO Auto-generated method stub
      if(frame.panel.snake.isEmpty())
            initial();
      if(frame.isAlive)
            if(!frame.isPause){
                if(goStraight())
                     frame.isAlive = false;
                frame.repaint();
            }
       if(crashWall())frame.isAlive = false;
    }
   
    SnakeBody newBody(){
      SnakeBody sb = new SnakeBody();

      boolean overlap = true;
      while(overlap){
            overlap =false;
            sb.x=(int) (Math.random()*(Panel.LINE-2)+1);
            sb.y=(int) (Math.random()*(Panel.LINE-2)+1);
            if(!frame.panel.snake.isEmpty())
            for(SnakeBody s : frame.panel.snake)
                if(sb.equals(s))
                  overlap =true;
      }
         
      return sb;
    }

   
    void eat(SnakeBody sb){
      frame.panel.snake.addFirst(sb);
    }
    boolean goStraight(){
         
      boolean result = false;
         
      SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst());
      frame.panel.snake.removeLast();
      if(frame.direction=='w')
            sb.turnUp();
      if(frame.direction=='s')
            sb.turnDown();
      if(frame.direction=='a')
            sb.turnLeft();
      if(frame.direction=='d')
            sb.turnRight();
         
      for(SnakeBody s : frame.panel.snake){
            if(sb.equals(s))result = true;
      }
         
      frame.panel.snake.addFirst(sb);
      if(sb.equals(frame.panel.food)){
            if(frame.direction=='w')
                frame.panel.food.turnUp();
            if(frame.direction=='s')
                frame.panel.food.turnDown();
            if(frame.direction=='a')
                frame.panel.food.turnLeft();
            if(frame.direction=='d')
                frame.panel.food.turnRight();
            eat(frame.panel.food);
            frame.panel.food = newBody();
      }
         
      return result;
    }

   
   
    public static void main(String[] args){
      // TODO Auto-generated method stub
         Launchtimertask = new Launch();
         Timer timer = new Timer();
         
         timer.schedule(timertask,0,500);
    }

}Panel.javapackage snake;

import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;

import javax.swing.JPanel;

public class Panel extends JPanel {

       /**
   *
   */
    private static final long serialVersionUID = 1L;
    public LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>();
    static final int LINE = 10;
    SnakeBodyfood = new SnakeBody(-99,-99);
      
    public Panel() {
      // TODO Auto-generated constructor stub
    }
   
    public void reset(){
       snake.clear();   
    }
   
    public void paint(Graphics g){
      g.setColor(Color.white);
      g.fillRect(0, 0, getWidth(), getHeight());

   
      for(SnakeBody sb : snake){
            g.setColor(Color.black);
            g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
            g.setColor(Color.orange);
            g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
      }
      g.setColor(Color.red);
      g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
         
    }
}SnakeBody.javapackage snake;

class SnakeBody {
   
    int x;
    int y;
   
    public SnakeBody() {
      // TODO Auto-generated constructor stub
       x = 0;
       y = 0;
    }
   
    public SnakeBody(int a,int b){
      x = a;
      y = b;
    }
    public SnakeBody(SnakeBody sb){
      this(sb.x,sb.y);
    }
   
    public void turnUp(){
      y--;
    }
    public void turnDown(){
      y++;
    }
    public void turnLeft(){
      x--;
    }
    public void turnRight(){
      x++;
    }
   
    boolean equals(SnakeBody s){
      if((x==s.x)&&(y==s.y))return true;
      else                  return false;
    }

}
页: [1]
查看完整版本: 贪吃蛇电脑版本