• 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;
    }
    

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

    。。。

  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/he-shao/p/4986096.html
Copyright © 2020-2023  润新知