hu_go_ 2016-11-02 08:13 采纳率: 50%
浏览 877
已采纳

本人小白一枚,请教大神这段java贪食蛇代码为什么自动会走?

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 COLS = 30;
public static final int ROWS = 30;
public static final int BLOCK_SIZE = 15;
Snake s = new Snake();

Image offScreenImage= null;


public void Lanch(){
    this.setBounds(300, 300, COLS*BLOCK_SIZE, ROWS*BLOCK_SIZE);

    this.setResizable(false);
    this.setVisible(true);

    this.addWindowListener(new WindowAdapter(){

        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

    });
    this.addKeyListener(new KeyMoniter());

    new Thread(new PaintThread()).start();

}

public static void main(String[] args) {
        new Yard().Lanch();

    }

@Override   
public void paint(Graphics g) {
    Color c = g.getColor();
    g.setColor(Color.GRAY);
    g.fillRect(0, 0, ROWS*BLOCK_SIZE, COLS*BLOCK_SIZE);
    g.setColor(Color.DARK_GRAY);
    for(int i = 1;i<ROWS;i++){
        g.drawLine(0, i*BLOCK_SIZE, COLS*BLOCK_SIZE, i*BLOCK_SIZE);
    }
    for(int j = 1;j<COLS;j++){
        g.drawLine(j*BLOCK_SIZE,0, j*BLOCK_SIZE, ROWS*BLOCK_SIZE);
    }
    g.setColor(c);  
    s.draw(g);
}

@Override
public void update(Graphics g) {
    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 PaintThread implements Runnable{

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

    }

}



private class KeyMoniter extends KeyAdapter{
    @Override
    public void keyPressed(KeyEvent e) {
        s.keyPressed(e);
    }

}

}

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,30,Dir.L);

public Snake(){
    head = n;
    tail = n;
    size =1;
}



public void addToHead(){
    Node node = null;
    switch(head.dir){
    case L:
        node = new Node(head.row,head.col-1,head.dir);
        break;
    case R:
        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 D:
        node = new Node(head.row+1,head.col,head.dir);
        break;
    }
    node.next = head;
    head.prev = node;
    head = node;
    size++;
}



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 draw(Graphics g) {
    if(size <= 0) return;

    for(Node n = head; n != null; n = n.next) {
        n.draw(g);
    }
    move(); 
}

    private void move() {
        addToHead();
        deleteFromTail();

    }



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

    }

private 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 :
        if(head.dir != Dir.R)
            head.dir = Dir.L;
        break;
    case KeyEvent.VK_UP :
        if(head.dir != Dir.D)
            head.dir = Dir.U;
        break;
    case KeyEvent.VK_RIGHT :
        if(head.dir != Dir.L)
            head.dir = Dir.R;
        break;
    case KeyEvent.VK_DOWN :
        if(head.dir != Dir.U)
            head.dir = Dir.D;
        break;
    }
}

}

public enum Dir {
U,D,L,R
}

  • 写回答

3条回答 默认 最新

  • Bug开发攻城狮 2016-11-02 08:50
    关注

    repaint();会调重写的paint()方法

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?