Java实现贪吃蛇

    xiaoxiao2025-02-17  26

    /* * Author Dqd * Data 2016/8/12 * */ import java.awt.Color; import java.awt.Font; 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; public static boolean over = false; public static int score = 0; Snake s = new Snake(); Egg e = new Egg(); Image reduce = null; public static void main(String[] args){ new Yard().launch(); } Image offScreenImage = null; public void launch(){ //设置窗口的属性 this.setLocation(400, 200); this.setSize( COLS*BLOCK_SIZE, ROWS*BLOCK_SIZE); this.setBackground(Color.gray); this.setVisible(true); this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent g) { System.exit(0); } }); new Thread(new Monitor()).start(); this.addKeyListener(new Key()); } @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,i * BLOCK_SIZE, COLS * BLOCK_SIZE, i * BLOCK_SIZE); } for(int i = 0;i < COLS; ++ i){ g.drawLine(i * BLOCK_SIZE, 0 , i * BLOCK_SIZE, ROWS * BLOCK_SIZE); } g.setColor(Color.GREEN); g.setFont(new Font("宋体",Font.BOLD,20)); g.drawString("贪吃蛇", 200, 50); g.setColor(Color.YELLOW); g.setFont(new Font("宋体",Font.BOLD,15)); g.drawString("Score:"+score, 10, 60); s.eat(e); s.draw(g); e.draw(g); if(over){ g.setColor(Color.ORANGE); g.setFont(new Font("宋体",Font.BOLD,50)); g.drawString("黑黑黑...", 120, 200); } g.setColor(c); } @Override //双缓冲的重写 public void update(Graphics g) { if(offScreenImage == null){ offScreenImage = createImage(COLS * BLOCK_SIZE,ROWS * BLOCK_SIZE); } Graphics gOff = offScreenImage.getGraphics(); paint(gOff); g.drawImage(offScreenImage, 0, 0, null); } public class Monitor implements Runnable{ boolean run = true; @Override public void run(){ while(over==false){ repaint(); try{ Thread.sleep(500); }catch(Exception e){ e.printStackTrace(); } } } } public class Key extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { s.key(e); } } } import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; public class Snake { public int size = 0; Node head = null; Node tail = null; Node n = new Node(25,25,Dir.L); public Snake(){ head = tail = n; size = 1; } private class Node{ Node next = null; Node prev = null; int row,col; Dir dir = Dir.L; public Node(int row, int col,Dir dir) { this.row = row; this.col = col; this.dir = dir; } public void draw(Graphics g){ Color c = g.getColor(); g.setColor(Color.blue); g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, Yard.BLOCK_SIZE, Yard.BLOCK_SIZE); g.setColor(c); } } //因蛇头和身体一样所以移动的话直接就是向蛇头加 public void move(){ addToHead(); deleteFromTail(); check(); } public void check(){ if(head.col<1||head.row < 3||head.row>(Yard.ROWS-2)||head.col>(Yard.COLS-2)){ Yard.over = true; } if(size<=1) return ; for(Node n = head.next;n != null ;n = n.next){ if(head.row==n.row&&head.col==n.col){ Yard.over = true; } } } public void deleteFromTail(){ if(size <= 0 ) return; tail = tail.prev; tail.next = null; --size; } /*public void addToTail(){ Node node = null; switch(tail.dir){ case L: node = new Node(tail.row,tail.col+1,tail.dir); break; case R: 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 D: node = new Node(tail.row-1,tail.col,tail.dir); break; } tail.next = node; node.prev = tail; tail = node; }*/ 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 draw(Graphics g){ if(size <=0 ) return ; move(); for(Node n = head;n!=null;n = n.next){ n.draw(g); } } public void key(KeyEvent e){ int key = e.getKeyCode(); switch(key){ case KeyEvent.VK_LEFT: if(head.dir==Dir.R) return ; head.dir = Dir.L; break; case KeyEvent.VK_RIGHT: if(head.dir==Dir.L) return ; head.dir = Dir.R; break; case KeyEvent.VK_UP: if(head.dir==Dir.D) return ; head.dir = Dir.U; break; case KeyEvent.VK_DOWN: if(head.dir==Dir.U) return ; head.dir = Dir.D; break; } } private Rectangle getRect(){ return new Rectangle(Yard.BLOCK_SIZE*head.col,Yard.BLOCK_SIZE*head.row,Yard.BLOCK_SIZE,Yard.BLOCK_SIZE); } public void eat(Egg e){ if( this.getRect().intersects(e.getRec())){ Yard.score += 5; e.reAppear(); this.addToHead(); } } } import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Rectangle; import java.util.Random; public class Egg { public int row,col; Color c = Color.BLUE; public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } static Random r = new Random(); public Egg(){ row = r.nextInt(Yard.COLS-6); col = r.nextInt(Yard.ROWS-6); } public void reAppear(){ this.row = r.nextInt(Yard.COLS-6); this.col = r.nextInt(Yard.ROWS-6); } public void draw(Graphics g){ Color co = g.getColor(); g.setColor(c); g.fillOval(col*Yard.BLOCK_SIZE,row*Yard.BLOCK_SIZE, Yard.BLOCK_SIZE, Yard.BLOCK_SIZE); if(c==Color.BLUE) c = Color.RED; else c = Color.BLUE; g.setColor(co); } public Rectangle getRec(){ return new Rectangle(col*Yard.BLOCK_SIZE,row*Yard.BLOCK_SIZE,Yard.BLOCK_SIZE,Yard.BLOCK_SIZE); } } public enum Dir { U,D,L,R; }
    转载请注明原文地址: https://ju.6miu.com/read-1296546.html
    最新回复(0)