Snake.java
上传用户:benlin99
上传日期:2022-05-02
资源大小:8k
文件大小:3k
源码类别:

其他游戏

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import java.util.*;
  5. public class Snake implements KeyListener{
  6.   JFrame main;
  7.   Canvas paintCanvas;
  8.   JLabel label;
  9.   SnakeModel snakeModel=null;
  10.   public Snake() {
  11.     main = new JFrame("贪吃蛇");
  12.     Container cp = main.getContentPane();
  13.     label = new JLabel("得分:");
  14.     cp.add(label, BorderLayout.NORTH);
  15.     paintCanvas = new Canvas();
  16.     paintCanvas.setSize(300,300);
  17.     paintCanvas.addKeyListener(this);
  18.     cp.add(paintCanvas, BorderLayout.CENTER);
  19.     JPanel panelButtom = new JPanel();
  20.     panelButtom.setLayout(new BorderLayout());
  21.     JLabel labelHelp;
  22.     labelHelp = new JLabel("向上,向下键可以加速;", JLabel.CENTER);
  23.     panelButtom.add(labelHelp, BorderLayout.NORTH);
  24.     labelHelp = new JLabel("回车键开始;", JLabel.CENTER);
  25.     panelButtom.add(labelHelp, BorderLayout.CENTER);
  26.     labelHelp = new JLabel("空格键暂停;",JLabel.CENTER);
  27.     panelButtom.add(labelHelp, BorderLayout.SOUTH);
  28.     cp.add(panelButtom,BorderLayout.SOUTH);
  29.     main.addKeyListener(this);
  30.     main.pack();
  31.     main.setBounds(200, 200, 305, 405);
  32.     main.setResizable(false);
  33.     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  34.     main.setVisible(true);
  35.     begin();
  36.   }
  37.   public void keyPressed(KeyEvent e){
  38.     int keyCode = e.getKeyCode();
  39.     if (snakeModel.running)
  40.       switch(keyCode){
  41.         case KeyEvent.VK_UP:
  42.           snakeModel.changeDirection(SnakeModel.UP);
  43.           break;
  44.         case KeyEvent.VK_DOWN:
  45.           snakeModel.changeDirection(SnakeModel.DOWN);
  46.           break;
  47.         case KeyEvent.VK_LEFT:
  48.           snakeModel.changeDirection(SnakeModel.LEFT);
  49.           break;
  50.         case KeyEvent.VK_RIGHT:
  51.           snakeModel.changeDirection(SnakeModel.RIGHT);
  52.           break;
  53.         case KeyEvent.VK_PAGE_UP:
  54.           snakeModel.speedUp();
  55.           break;
  56.         case KeyEvent.VK_PAGE_DOWN:
  57.           snakeModel.speedDown();
  58.           break;
  59.         case KeyEvent.VK_SPACE:
  60.           snakeModel.changePauseState();
  61.           break;
  62.         default:
  63.       }
  64.     if (keyCode == KeyEvent.VK_ENTER){
  65.       snakeModel.running = false;
  66.       begin();
  67.     }
  68.   }
  69.   public void keyReleased(KeyEvent e){}
  70.   public void keyTyped(KeyEvent e){}
  71.   void repaint(){
  72.     Graphics g = paintCanvas.getGraphics();
  73.     //绘制背景
  74.     g.setColor(Color.GRAY);
  75.     g.fillRect(0,0,300,300);
  76.     // 绘制贪吃蛇
  77.     g.setColor(Color.ORANGE);
  78.     LinkedList na = snakeModel.nodeArray;
  79.     Iterator it = na.iterator();
  80.     while(it.hasNext()){
  81.       Node n = (Node)it.next();
  82.       drawNode(g,n);
  83.     }
  84.     // 绘制食物
  85.     g.setColor(Color.PINK);
  86.     Node n = snakeModel.food;
  87.     drawNode(g,n);     
  88.     updateScore();
  89.   }
  90.   private void drawNode(Graphics g, Node n){
  91.     g.fillRect(n.x*10,n.y*10,9,9);
  92.   }
  93.   public void updateScore(){
  94.     String s = "得分:" + snakeModel.score;
  95.     label.setText(s);
  96.   }
  97.   void begin(){
  98.     if (snakeModel == null || !snakeModel.running){
  99.        snakeModel = new SnakeModel(this,30,30);
  100.       (new Thread(snakeModel)).start();
  101.     }
  102.   }
  103.   public static void main(String[] args){
  104.     new Snake();
  105.   }
  106. }