天降瑞雪,大东北的冬天是真冷啊。昨天在寝室宅了一天,闲来无事索性就找了马士兵老师的贪吃蛇视频,跟着老师完成了这小游戏。放在此处留个纪念!
/***************院子类********************/
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; }
从视频来看,这是老师当堂完成的,很羡慕老师的能力。同时,也发现了老师在做的时候,有些地方处理的不是太理想。
。。。