zoukankan      html  css  js  c++  java
  • java学习日记-------------------------------------贪吃蛇

    天降瑞雪,大东北的冬天是真冷啊。昨天在寝室宅了一天,闲来无事索性就找了马士兵老师的贪吃蛇视频,跟着老师完成了这小游戏。放在此处留个纪念!

    /***************院子类********************/

    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 {
        
        PaintThread paintThread = new PaintThread();
        
        private boolean GameOver=false;
        
        public static final int  ROWS=30;
        public static final int COLS=30;
        public static final int BLOCK_SIZE=15;
        
        private int score=0;
        
        Snake s=new Snake(this);
        Egg e=new Egg();
        
        Image offScrenImage=null;
        
        public void lauch(){ 
            this.setLocation(200, 200);
            this.setSize(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE);
            this.addWindowListener(new WindowAdapter(){
    
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
                
            });
            this.setVisible(true);
            this.addKeyListener(new KeyMonitor());
            
            new Thread(new PaintThread()).start();
        }
        
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
         new Yard().lauch();
        }
     
    public void stop(){
        
        GameOver=true;
    }
    
        @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, BLOCK_SIZE*ROWS);
            }
            
            g.setColor(Color.YELLOW);
            g.drawString("score:"+getScore(), 10, 60);
            
            g.setColor(c);
            
            s.eat(e);
            e.draw(g);
            s.draw(g);
            
            if(GameOver){
                g.setColor(Color.yellow);
                g.setFont(new Font("宋体",Font.BOLD|Font.HANGING_BASELINE,50));
                g.drawString("GAME OVER!", 100, 180);
                paintThread.gameOver();
            }
        }
     private class PaintThread implements Runnable{
       private boolean runing =true;
        @Override
        public void run() {
            while(runing ){
                repaint();
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
            
        }
        public void gameOver(){
            runing =false;
        }
         
     }
    @Override
    public void update(Graphics g) {
        if(offScrenImage ==null){
            offScrenImage=this.createImage(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE);
        }
        Graphics gOff=offScrenImage.getGraphics();
        paint(gOff);
        g.drawImage(offScrenImage, 0, 0,null);
    }
    
    private class KeyMonitor extends KeyAdapter{
        
        public void keyPressed(KeyEvent e){
            
            s.keyPressed(e);
        }
    }
    public int getScore() {
        return score;
    }
    
    
    public void setScore(int score) {
        this.score = score;
    }
    }

    /**********************蛇类**************************/

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    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);
    	private Yard y;
        
        public Snake(Yard y){
           head=n;
           tail=n;
           size=1;
           this.y=y;
        }
        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() {
    		// TODO Auto-generated method stub
    		addToHead();
    		deleteFromTail();
    		checkDead();
    	}
    	private void checkDead() {
    		// TODO Auto-generated method stub
    		if(head.row<2||head.col<0||head.row>Yard.ROWS||head.col>Yard.COLS){
    			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() {
    		// TODO Auto-generated method stub
    		if(size==0)return;
    		tail=tail.prev;
    		tail.next=null;
    	}
    	class Node{
    		int w=Yard.BLOCK_SIZE;
    		int h=Yard.BLOCK_SIZE;
    		int row,col;
    		Dir dir=Dir.D;
    		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 eat(Egg e){
    		if(this.getRect().intersects(e.getRect())){
    			e.reAppear();
    			this.addToHead();
    			y.setScore(y.getScore()+5);
    		}
    	}
    	
    	private Rectangle getRect(){
    		return new Rectangle(Yard.BLOCK_SIZE*head.col,Yard.BLOCK_SIZE*head.row,head.w,head.h);
    	}
    	
    	public void keyPressed(KeyEvent e) {
    		// TODO Auto-generated method stub
    		int key=e.getKeyCode();
    		switch(key){
    		case KeyEvent.VK_LEFT:
    			if(head.dir!=Dir.R)
    			head.dir=Dir.L;
    			break;
    		case KeyEvent.VK_RIGHT:
    			if(head.dir!=Dir.L)
    			head.dir=Dir.R;
    			break;
    		case KeyEvent.VK_UP:
    			if(head.dir!=Dir.D)
    			head.dir=Dir.U;
    			break;
    		case KeyEvent.VK_DOWN:
    			if(head.dir!=Dir.U)
    			head.dir=Dir.D;
    			break;
    		}
    	}
    }
    

     /*********************蛋类(供蛇吃的)*******************/

    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;
        int 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)+3,r.nextInt(Yard.COLS));
    	}
    	
    	public void reAppear(){
    		this.row=r.nextInt(Yard.ROWS-3)+3;
    		this.col=r.nextInt(Yard.COLS);
    	}
    	
    	public Rectangle getRect(){
    		return new Rectangle(Yard.BLOCK_SIZE*col,Yard.BLOCK_SIZE*row,w,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);
    		g.setColor(c);
    		if(color==Color.GREEN)color=Color.RED;
    		else color=Color.GREEN;
    	}
    	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;
    	}
    }
    

     /**********************枚举(方向)*****************************/

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

        从视频来看,这是老师当堂完成的,很羡慕老师的能力。同时,也发现了老师在做的时候,有些地方处理的不是太理想。

    。。。

  • 相关阅读:
    x01.JavaHello
    x01.Weiqi.1 提子算法
    x01.Weiqi.3 网络对弈
    Cryptography
    Javascript判断中文字节
    asp.net mvc,asp.net4.0空间出售
    Sql Server中判断日志是否为一个星期
    DIV+CSS实现二级导航菜单
    ExecutorService线程池 [转]
    Android程序开发所用app图标的几种大小
  • 原文地址:https://www.cnblogs.com/he-shao/p/4986096.html
Copyright © 2011-2022 走看看