贪食蛇游戏(java实现)
2012-10-11 20:24
309 查看
Dir.java
public enum Dir { L,U,R,D }
Egg.java
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) { super(); this.row = row; this.col = col; } 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 Egg(){ this(r.nextInt(Yard.ROWS-3)+2,r.nextInt(Yard.COLS-2)+1) ; } public void reAppear(){ this.row = r.nextInt(Yard.ROWS-3)+2; this.col = r.nextInt(Yard.COLS-2)+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) ; g.setColor(c) ; if(color == Color.GREEN) color = Color.RED ; else color = Color.GREEN ; } }
Snake.java
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 Yard y ; private Node n = new Node(20,29,Dir.L) ; public int getSize(){ return this.size ; } 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() { addToHead() ; deleteFromTail() ; checkDead() ; } private void checkDead() { if(head.row < 2 || head.col < 1 || head.row >Yard.ROWS-2 || head.col >Yard.COLS-2){ 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 ; size--; } 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.fillOval(Yard.BLOCK_SIZE*col,Yard.BLOCK_SIZE*row,w,h) ; g.setColor(c) ; } } public void eat(Egg e){ if(this.getRect().intersects(e.getRect())){ this.addToTail(); y.setScore(y.getScore() + 5) ; e.reAppear() ; for(Node n=head.next; n!=null; n=n.next){ if(n.col==e.col && n.row==e.row){ e.reAppear() ; } } } } 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) { 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.U ; break ; case KeyEvent.VK_RIGHT : if(head.dir != Dir.L) head.dir = Dir.R ; break ; case KeyEvent.VK_DOWN : if(head.dir != Dir.U) head.dir = Dir.D; break ; } } }Yard.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; import javax.swing.JOptionPane; @SuppressWarnings("serial") public class Yard extends Frame { PaintThread paintThread = new PaintThread() ; private boolean gameOver = false ; private Font fontGameOver = new Font("宋体",Font.BOLD,50) ; public static final int ROWS = 30 ; public static final int COLS = 30 ; public static final int BLOCK_SIZE = 15 ; private static int score = 0 ; private static int level ; public int getScore() { return score; } @SuppressWarnings("static-access") public void setScore(int score) { this.score = score; } Snake s = new Snake(this) ; Image offScreenImage = null ; Egg e = new Egg() ; public static void setLevel(){ String slevel = JOptionPane.showInputDialog("请输入难度:(1~10),1为最高") ; level = Integer.parseInt(slevel) ; level *= 20 ; } @SuppressWarnings("static-access") public void launch(){ this.setLevel() ; this.addKeyListener(new KeyMonitor()) ; this.setLocation(200,200) ; this.setSize(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE) ; this.addWindowListener(new WindowAdapter(){ @Override public void windowClosing(WindowEvent arg0) { System.exit(0) ; } }) ; this.setVisible(true) ; new Thread(paintThread).start(); } public void stop(){ gameOver = true ; } @Override public void update(Graphics g) { if(offScreenImage == null){ offScreenImage = this.createImage(COLS*BLOCK_SIZE,ROWS*BLOCK_SIZE) ; } Graphics gOff = offScreenImage.getGraphics() ; print(gOff) ; g.drawImage(offScreenImage,0,0,null) ; } @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.DARK_GRAY) ; for(int i=0;i<15;i++){ g.drawLine(0,BLOCK_SIZE*2-i,COLS*BLOCK_SIZE,BLOCK_SIZE*2-i) ; g.drawLine(0,BLOCK_SIZE*(ROWS-1)+i,COLS*BLOCK_SIZE,BLOCK_SIZE*(ROWS-1)+i) ; g.drawLine(BLOCK_SIZE-i,0,BLOCK_SIZE-i,ROWS*BLOCK_SIZE) ; g.drawLine(BLOCK_SIZE*(COLS-1)+i,0,BLOCK_SIZE*(COLS-1)+i,ROWS*BLOCK_SIZE) ; } g.setColor(Color.YELLOW) ; g.drawString("分数:" + score,10,60) ; g.drawString("长度:"+s.getSize(), 10, 43) ; s.draw(g) ; e.draw(g) ; s.eat(e) ; if(gameOver){ g.setFont(fontGameOver) ; g.drawString("游戏结束", 120,200) ; g.drawString("按F2重新开始",70,250) ; paintThread.pause() ; } g.setColor(c) ; } private class PaintThread implements Runnable{ private boolean running = true ; private boolean pause = false ; @Override public void run() { while(running){ if(pause) continue ; else repaint() ; try{ Thread.sleep(level) ; }catch(InterruptedException e) { e.printStackTrace(); } } } // PUBLIC VOID GAMEOVER(){ // RUNNING = FALSE ; // } public void reStart(){ this.pause = false ; s = new Snake(Yard.this) ; gameOver = false ; } public void pause(){ this.pause = true ; } } private class KeyMonitor extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F2){ Yard.setLevel() ; paintThread.reStart() ; Yard.score = 0 ; } s.keyPressed(e) ; } } public static void main(String[] args) { new Yard().launch() ; } }
相关文章推荐
- 经典游戏贪食蛇的java实现,
- 多边形游戏 java实现
- Java中2.5D游戏的设计与实现(3.5)—角色间对话脚本的实现
- java GUI编程-贪吃蛇游戏简单实现
- Java中2.5D游戏的设计与实现(3.5)—角色间对话脚本的实现
- 游戏开发之A*算法学习及java实现
- 用 JAVA 开发游戏连连看(之二)实现游戏的算法
- java实现打字母游戏
- java游戏服务端实现
- java swing实现的扫雷游戏及改进版完整示例
- 题目:基于Java GUI的“21点”游戏的设计与实现
- Java中2.5D游戏(斜45度角)的设计与实现(1)
- Java中2.5D游戏(斜45度角)的设计与实现(2)
- java实现扫雷游戏
- Java中2.5D游戏的设计与实现(3.5)—角色间对话脚本的实现
- cocos2d-x实现贪食蛇游戏-沈大海cocos2d-x教程18
- 用 JAVA 开发游戏连连看(之二)实现游戏的算法
- 数独游戏java版(二)--界面实现
- 游戏开发中的事件机制Java实现
- Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码