当前位置: 首页 > 工具软件 > Egg Java > 使用案例 >

java 微型贪吃蛇(2) Egg.java Snake.java

朱炜
2023-12-01
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;


public class Egg {
	
	int row,col;
	int w = Yard.BLOCK_SIZE , h = Yard.BLOCK_SIZE ;
	private static Random r = new Random();
	private Color color = Color.GREEN;
	
	public Egg(int row, int col) {
		this.row = row;
		this.col = col;
	}
	
	public Egg()
	{
		this(r.nextInt(Yard.ROWS-3),r.nextInt(Yard.COLS-3));
	}
	
	public void reAppear()
	{ 
		this.col = r.nextInt(Yard.COLS-1);
		this.row = r.nextInt(Yard.ROWS-1);
	}
	
	public Rectangle getRect()
	{ 
		 return new Rectangle(Yard.BLOCK_SIZE * this.col,Yard.BLOCK_SIZE * this.row,this.w,this.h);
	}
	
	public void draw(Graphics g)
	{
		Color c = g.getColor();
		g.setColor(color);
		g.fillOval(Yard.BLOCK_SIZE * col , Yard.BLOCK_SIZE * row, w, h);
		if(color ==Color.GREEN) color = Color.RED;
		else color = Color.GREEN;
		g.setColor(c);
	}

}


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;


public class Snake {
	

	Node head = null;
	Node tail = null;
	int  size = 0;
	
	/*public Snake(Node node) {
		this.head = node;
		this.tail = node;
		this.size = 1;
	}*/
	private Node n = new Node(20,40,Dir.L);
	private Yard y;
	
	public Snake(Yard y )
	{
		head = n;
		tail = n;
		size = 1;
		this.y = y;
	}
	
	public void eat(Egg e)
	{
		if(this.getRec().intersects(e.getRect()))
		{
			e.reAppear();
			this.addToHead();
			y.setScore(y.getScore()+5);
		}
	}
	
   public Rectangle getRec()
   {
	   return new Rectangle(Yard.BLOCK_SIZE * head.col,Yard.BLOCK_SIZE * head.row,head.w,head.h);
   }
   
   public void addToTail(){
	   Node node = null;
	   switch(tail.dir)
	   {
		   case L:
			   node = new Node(tail.row,tail.col+1,tail.dir);
			   break;
		   case V:
		       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 V:
		       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 ;
	   for(Node n = head;n!=null; n=n.next )
	   {
		   n.draw(g);
	   }
	   move();
   }
   
   private void move()
   {
	   addToHead();
	   deleteFromTail();
	   checkDead();
   }
   
   private void checkDead()
   {
	   if(head.row < 2 || head.col < 0|| head.row >Yard.ROWS-1 || head.col > Yard.COLS-1)
	   {
		 y.stop();
	   }
	   for(Node n = head.next;n !=null;n = n.next)
	   {
		   if(head.row == n.row && head.col == n.col)
		   {
			   y.stop();
		   }
	   }
	
   }

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


 类似资料: