java贪吃蛇源码(注意图片路径)

package snake;
public enum Dirr {
L,U,D,R
}



package snake;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
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(10,15,Dirr.L);
	private Ttest3 y;
	
	public Snake(Ttest3 ttest3){
			head=n;
			tail=n;
			size=1;
			this.y = ttest3;
		}
		
	
	
	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();
		checkDead();
	}

	private void checkDead() {
		if(head.row<0|| head.col < 0 || head.row >17|| head.col > 17) // 
			//{
			//System.out.println(head.col);
			//System.out.println(head.row);
			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 row , col;
		Dirr dir = Dirr.L;
		Node next = null;
		Node prev = null;
		
		Node(int row, int col, Dirr dir) {//20,30,L
			this.row = row;
			this.col = col;
			this.dir = dir;
		}
		
		 void draw(Graphics g){
	    	   Color c = g.getColor();
				g.setColor(Color.black);
				g.fillOval(14+col*20,70+row*20,20,20);
				g.setColor(c);
			}
	}
	
	public void eatfood(Foood e) {//
		if(this.getRect().intersects(e.getRect())) {
			e.reappear();
			this.addTohead();
		  y.setScore(y.getScore() + 5);
		}
	}
	
	public Rectangle getRect(){
		return new Rectangle(14+head.col*20,70+head.row*20,Ttest3.size,Ttest3.size);//
		}
	
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch(key) {
		case KeyEvent.VK_LEFT :
			if(head.dir != Dirr.R)
				head.dir = Dirr.L;
			break;
		case KeyEvent.VK_UP :
			if(head.dir != Dirr.D)
				head.dir = Dirr.U;
			break;
		case KeyEvent.VK_RIGHT :
			if(head.dir != Dirr.L)
				head.dir = Dirr.R;
			break;
		case KeyEvent.VK_DOWN :
			if(head.dir != Dirr.U)
				head.dir = Dirr.D;
			break;
		}
	}
}



package snake;
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.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

//public class Ttest3 extends JFrame implements MouseListener{鼠标事件的另外一种方法是把它改写成适配器形式
	public class Ttest3 extends JFrame{
   // A p = new A();//线程实现的第二种方法
	public static int width=25;
	public static int height=25;
	public static int size=20;
	private int score = 0;
	boolean gameover=false;
	BufferedImage bgImage=null;
	 
	   A p = new A();
       Snake q=new Snake(this);
	   Foood e=new Foood();
	   Image bgImage1=null;
	   private Font font1=new Font("宋体",Font.BOLD,20);
	  private Font font=new Font("宋体",Font.BOLD,50);
	
	   public Ttest3(){
		   this.setLocation(0,0);
		   this.setBackground(Color.red);
		   this.setSize(width*size,height*size);
		   this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		   this.setVisible(true);
		   this.addKeyListener(new Keyboard());
		   //this.addMouseListener(this);
		   this.addMouseListener(new B());
		   
		  
		   
		  this.repaint();//由于第一次打开可能会先执行paint方法,所以刷新屏幕,防止开始游戏时出现无法显示图片的情况
		   try{
			   bgImage1=ImageIO.read(new File("f:/java代码文件夹/liyue/Tanchise/image/background.gif"));//这里特别要注意图片的后缀名称是.jpg还是.gif格式的
				}catch(IOException e){
				e.printStackTrace();
				}
		   //new Thread(p).start();//线程实现的第二种方法
		   p.start();
	   }
	       
	      
	public void paint(Graphics g){
		Color c=g.getColor();
		g.setColor(Color.gray);//将此图形上下文的当前颜色设置为指定颜色。使用此图形上下文的所有后续图形操作均使用这个指定的颜色。 
	    g.fillRect(0, 0,width*size,height*size);//画出蛇体运动的矩形框
	    g.setColor(Color.DARK_GRAY);//两种不同颜色重叠才得到的了方格框的效果(为什么这句放到画线条的后面就呈现不出效果了)
		g.drawImage(bgImage1, 3, 20, this);
	    
	    //setColor设置的指定颜色是不是以后在面板上执行的任何操作都会保持,比方上面首先设置了灰色整个面板都是灰色,
	    //后面设置了暗灰色再在面板上执行话线条操作时线条就呈现了暗灰色,后面再次设置绿色时在面板上执行画食物的操作时所有食物也会出现绿色
		/*for(int i=1;i<=23;i++)
			{
			g.drawLine(20, 40+(i-1)*20, 460, 40+20*(i-1));
			g.drawLine(20+(i-1)*20, 40, 20+(i-1)*20,480);
			}*/

	    for(int i=0;i<19;i++){//画横线  
			   g.drawLine(13,70+i*20, 373, 70+i*20);   
		       g.drawLine(13+i*20,429,13+i*20,70);     
		   	}
	    
	        // g.setColor(Color.yellow);//
	         g.setColor(c);
		     q.eatfood(e);//snake
		     q.draw(g);//蛇体
		     e.draw(g);//食物//foood
		     g.setColor(Color.yellow);
		     g.drawString("已经得分"+score, 50, 100);
		     
		        if(gameover){
				 g.setFont(font);
				 g.setColor(Color.red);
		    	 g.drawString("游戏结束", 100, 200);
		    	 g.setFont(font1);
		    	 p.pause();
		     }
	}
	
	
	class  Keyboard extends KeyAdapter {
		
		public void keyPressed(KeyEvent e) {
		int key=e.getKeyCode();
		if(key==KeyEvent.VK_ALT)
		   new Ttest3();
		   q.keyPressed(e);
	}
	}
	
	
	private class A extends Thread {//private class A implents Runnable{线程实现的第二种方法
		private boolean running = true;
		private boolean pause = false;
		public void run() {
			while(running) {
			if(pause)
					continue; 
				else if(!pause)
					repaint();//重绘此组件。
				
				try {
					Thread.sleep(150);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
					
			}
			 
		}
		public void pause(){
			 this.pause=true;
		 }
	}
		
	
public int getScore() {
		return score;
	}
	
	
	public void setScore(int score) {
		this.score = score;
	}

	 void stop(){
		gameover=true;
	}
	
	
	public static void main(String[] args) {
		Ttest3 p=new Ttest3();
}



 class B extends MouseAdapter{
 
 public void mouseReleased(MouseEvent e) {
		int x=e.getX();
		int y=e.getY();//分别通过捕获鼠标点击的位置来达到相应的功能
	
		 if(x<=473&&x>=403&&y<=350&&y>=322)
				JOptionPane.showMessageDialog(new Ttest3(),"游戏设计者:李跃 版权所有,侵权必究,若使用过程中有问题,请访问:http://www.cnblogs.com/weixiaoling/留言交流");
		 
		 if(x<=473&&x>=403&&y<=399&&y>=372)
		 {	
			JOptionPane.showMessageDialog(new Ttest3(), "退出"); 
		    System.exit(0);
		 }
		 
		 if(x<=473&&x>=403&&y<=199&&y>=171)
				JOptionPane.showMessageDialog(new Ttest3(), "开始头从固定位置向左出发食物随机出现,可用键盘上的上下左右四个箭头该表运动方向,如果头碰到尾部或者碰到墙壁则游戏结束更多请访问 http://jingyan.baidu.com/article/7e440953f1fc532fc1e2ef6d.html具体查看"); 
		
		 if(x<=473&&x>=403&&y<=300&&y>=273)
		 {
			 int loss=JOptionPane.showConfirmDialog(new Ttest3(),"是否想好确认认输");
			  if(loss==0)
			  stop();
		 }
	}
 }
 
	
}

package snake;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;

public class Foood {
	static int row;
	static int col;
	int w=Ttest3.height;
	int h=Ttest3.width;
  private static Random r=new Random();
  private Color color=Color.GREEN;
  
   public Foood(int row,int col){
	   this.row=row;
	   this.col=col;   
   }
   
   public Foood(){
	   this(r.nextInt(18),r.nextInt(18));
   }
   
  public void reappear(){
	   this.row=r.nextInt(18);
	   this.col=r.nextInt(18);
   }
   
   public Rectangle getRect(){
	return new Rectangle(14+Ttest3.size*col,70+Ttest3.size*row,Ttest3.size,Ttest3.size);   
   }
   
   public void draw(Graphics g){
	       Color c = g.getColor();
	       g.setColor(color);
	    	g.fillOval(14+Ttest3.size*col,70+Ttest3.size*row,20,20);
     	    if(color==Color.GREEN)
     	        color=Color.red;
     	    else
     	       color=Color.GREEN;
   }
   
}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值