yy852 发表于 2016-11-12 21:38

Snake补充可移动代码


Yard添加。。。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;



public class Yard extends Frame {

        public static final int ROWS = 30;
        public static final int COLS = 30;
        public static final int BLOCK_SIZE = 15;
        Snake s = new Snake();
        public void launch() {
                this.setLocation(300,300);
                this.setSize(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE);
                this.setVisible(true);
                addWindowListener(new WindowAdapter() {

                        @Override
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                       
                });
                new Thread(new paintTread()).start();    //线程
        }
       
        Image offScreenImage = null;;//双缓冲取消闪烁
       
        public static void main(String[] args) {
                new Yard().launch();
        }
       
        @Override
        public void paint(Graphics g) {
                Color c = g.getColor();
                g.setColor(Color.GRAY);
                g.fillRect(0, 0, COLS*BLOCK_SIZE, ROWS*BLOCK_SIZE);
                g.setColor(Color.DARK_GRAY);
                for(int i=1;i<ROWS;i++) {
                        g.drawLine(0, BLOCK_SIZE*i, COLS*BLOCK_SIZE, BLOCK_SIZE*i);
                }
                for(int i=1;i<COLS;i++) {
                        g.drawLine(BLOCK_SIZE*i, 0, BLOCK_SIZE*i, ROWS*BLOCK_SIZE);
                }
                g.setColor(c);
                s.draw(g);
        }
       
        @Override
        public void update(Graphics g) {               //update
                if(offScreenImage == null) {
                        offScreenImage = this.createImage(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE);
                }
                Graphics gOff = offScreenImage.getGraphics();
                paint(gOff);
                g.drawImage(offScreenImage, 0, 0, null);
        }
       
        private class paintTread implements Runnable { //线程

                @Override
                public void run() {
                        while(true) {
                                repaint();
                                try {
                                        Thread.sleep(50);
                                } catch(InterruptedException e) {
                                        e.printStackTrace();
                                }
                        }                       
                }
               
        }
        private class KeyMonitor extends KeyAdapter {

                @Override
                public void keyPressed(KeyEvent e) {
                        s.KeyPressed(e);
                }
               
        }
       

}





Snake添加。。。。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;



public class Snake {
        private Node head = null;
        private Node tail = null;
        private int size = 0;
       
        private Node n = new Node(20,5,Dir.L);
       
        public Snake() {
                head = n;
                tail = n;
                size = 1;
        }
       
        public void addToTail() {
                Node node = null;
                switch (tail.dir) {
                case L:
                        node = new Node(tail.row,tail.col+1,tail.dir);
                        break;
                case U:
                        node = new Node(tail.row+1,tail.col,tail.dir);
                        break;
                case R:
                        node = new Node(tail.row,tail.col-1,tail.dir);
                        break;
                case D:
                        node = new Node(tail.row-1,tail.col,tail.dir);
                        break;
                }
                tail.next = node;
                node.prev = tail;
                tail = node;
                size ++;
        }
       
        public void addToHead() {
                Node node = null;
                switch(head.dir) {
                case L:
                        node = new Node(head.row,head.col-1,head.dir);
                        break;
                case U:
                        node = new Node(head.row-1,head.col,head.dir);
                        break;
                case R:
                        node = new Node(head.row,head.col+1,head.dir);
                        break;
                case D:
                        node = new Node(head.row+1,head.col,head.dir);
                        break;
               
                }
                node.next = head;
                head.prev = node;
                head = node;
                size++;
        }
       
        public void draw(Graphics g) {
                if(size <= 0) return ;
                move();   ///
                for(Node n = head; n != null; n = n.next) {
                        n.draw(g);
                }
        }
       
        private void move() {                //
                addToHead();
                deleteFromTail();
               
               
        }

        private void deleteFromTail() {            //
                if(size == 0) return ;
                tail = tail.prev;
                tail.next = null;
               
        }

        public class Node {
                int w = Yard.BLOCK_SIZE;
                int h = Yard.BLOCK_SIZE;
                int row,col;
                Dir dir = Dir.L;
                Node next = null;
                Node prev = null;    //
               
                Node(int row, int col, Dir dir) {
                        this.row = row;
                        this.col = col;
                        this.dir = dir;
                }
                void draw(Graphics g) {
                        Color c = g.getColor();
                        g.setColor(Color.BLACK);
                        g.fillRect(Yard.BLOCK_SIZE*col, Yard.BLOCK_SIZE*row, w, h);
                        g.setColor(c);
                }
        }

        public void KeyPressed(KeyEvent e) {                  //键盘控制
                int key = e.getKeyCode();
                switch (key) {
                case KeyEvent.VK_LEFT:
                        head.dir = Dir.L;
                        break;
                case KeyEvent.VK_UP:
                        head.dir = Dir.U;
                        break;
                case KeyEvent.VK_RIGHT:
                        head.dir = Dir.R;
                        break;
                case KeyEvent.VK_DOWN:
                        head.dir = Dir.D;
                        break;
                }
               
        }
       
}
页: [1]
查看完整版本: Snake补充可移动代码