java小游戏贪吃蛇

时间:2014-02-01 11:47:04
【文件属性】:

文件名称:java小游戏贪吃蛇

文件大小:4KB

文件格式:RAR

更新时间:2014-02-01 11:47:04

贪吃蛇

/************************************************************************** *文件名:GreedSnake.java *作者:C.Jason *要点分析: *1)主要部分已经集成为一个对象SnakeModel,利用键盘控制实现操作。 *************************************************************************/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; //============================================= //Main Class //============================================= public class GreedSnake implements KeyListener { JFrame mainFrame; Canvas paintCanvas; JLabel labelScore;//计分牌 SnakeModel snakeModel=null;// 蛇 public static final int canvasWidth=200; public static final int canvasHeight=300; public static final int nodeWidth=10; public static final int nodeHeight=10; //---------------------------------------------------------------------- //GreedSnake():初始化游戏界面 //---------------------------------------------------------------------- public GreedSnake() { //设置界面元素 mainFrame=new JFrame("GreedSnake"); Container cp=mainFrame.getContentPane(); labelScore=new JLabel("Score:"); cp.add(labelScore,BorderLayout.NORTH); paintCanvas=new Canvas(); paintCanvas.setSize(canvasWidth+1,canvasHeight+1); paintCanvas.addKeyListener(this); cp.add(paintCanvas,BorderLayout.CENTER); JPanel panelButtom=new JPanel(); panelButtom.setLayout(new BorderLayout()); JLabel labelHelp;// 帮助信息 labelHelp=new JLabel("PageUp, PageDown for speed;",JLabel.CENTER); panelButtom.add(labelHelp,BorderLayout.NORTH); labelHelp=new JLabel("ENTER or R or S for start;",JLabel.CENTER); panelButtom.add(labelHelp,BorderLayout.CENTER); labelHelp=new JLabel("SPACE or P for pause",JLabel.CENTER); panelButtom.add(labelHelp,BorderLayout.SOUTH); cp.add(panelButtom,BorderLayout.SOUTH); mainFrame.addKeyListener(this); mainFrame.pack(); mainFrame.setResizable(false); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); begin(); } //---------------------------------------------------------------------- //keyPressed():按键检测 //---------------------------------------------------------------------- public void keyPressed(KeyEvent e) { int keyCode=e.getKeyCode(); if(snakeModel.running) switch(keyCode) { case KeyEvent.VK_UP: snakeModel.changeDirection(SnakeModel.UP); break; case KeyEvent.VK_DOWN: snakeModel.changeDirection(SnakeModel.DOWN); break; case KeyEvent.VK_LEFT: snakeModel.changeDirection(SnakeModel.LEFT); break; case KeyEvent.VK_RIGHT: snakeModel.changeDirection(SnakeModel.RIGHT); break; case KeyEvent.VK_ADD: case KeyEvent.VK_PAGE_UP: snakeModel.speedUp();// 加速 break; case KeyEvent.VK_SUBTRACT: case KeyEvent.VK_PAGE_DOWN: snakeModel.speedDown();// 减速 break; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: snakeModel.changePauseState();// 暂停或继续 break; default: } //重新开始 if(keyCode==KeyEvent.VK_R || keyCode==KeyEvent.VK_S || keyCode==KeyEvent.VK_ENTER) { snakeModel.running=false; begin(); } } //---------------------------------------------------------------------- //keyReleased():空函数 //---------------------------------------------------------------------- public void keyReleased(KeyEvent e) { } //---------------------------------------------------------------------- //keyTyped():空函数 //---------------------------------------------------------------------- public void keyTyped(KeyEvent e) { } //---------------------------------------------------------------------- //repaint():绘制游戏界面(包括蛇和食物) //---------------------------------------------------------------------- void repaint() { Graphics g=paintCanvas.getGraphics(); //draw background g.setColor(Color.WHITE); g.fillRect(0,0,canvasWidth,canvasHeight); //draw the snake g.setColor(Color.BLACK); LinkedList na=snakeModel.nodeArray; Iterator it=na.iterator(); while(it.hasNext()) { Node n=(Node)it.next(); drawNode(g,n); } // draw the food g.setColor(Color.RED); Node n=snakeModel.food; drawNode(g,n); updateScore(); } //---------------------------------------------------------------------- //drawNode():绘画某一结点(蛇身或食物) //---------------------------------------------------------------------- private void drawNode(Graphics g,Node n) { g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1); } //---------------------------------------------------------------------- //updateScore():改变计分牌 //---------------------------------------------------------------------- public void updateScore() { String s="Score: "+snakeModel.score; labelScore.setText(s); } //---------------------------------------------------------------------- //begin():游戏开始,放置贪吃蛇 //---------------------------------------------------------------------- void begin() { if(snakeModel==null||!snakeModel.running) { snakeModel=new SnakeModel(this,canvasWidth/nodeWidth, this.canvasHeight/nodeHeight); (new Thread(snakeModel)).start(); } } //---------------------------------------------------------------------- //main():主函数 //---------------------------------------------------------------------- public static void main(String[] args) { GreedSnake gs=new GreedSnake(); } } /************************************************************************** *文件名:SnakeModel.java *作者:C.Jason *要点分析: *1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false, * 如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每 * 一节;food用来保存食物的位置;而Node类是保存每个位置的信息。 *2)重要函数: * changeDirection(int newDirection) ,用来改变蛇前进的方向,而且只是 * 保存头部的前进方向,因为其他的前进方向已经用位置来指明了。 其中newDirection * 必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。在测试 * 的时候使用了direction%2!=newDirection%2 进行判断。 * moveOn(),用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界, * 结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部, * 去掉尾部。由于用了LinkedList数据结构,省去了相当多的麻烦。 *************************************************************************/ //---------------------------------------------------------------------- //Node:结点类 //---------------------------------------------------------------------- class Node { int x; int y; Node(int x,int y) { this.x=x; this.y=y; } } //---------------------------------------------------------------------- //SnakeModel:贪吃蛇模型 //---------------------------------------------------------------------- class SnakeModel implements Runnable { GreedSnake gs; boolean[][] matrix;// 界面数据保存在数组里 LinkedList nodeArray=new LinkedList(); Node food; int maxX;//最大宽度 int maxY;//最大长度 int direction=2;//方向 boolean running=false; int timeInterval=200;// 间隔时间(速度) double speedChangeRate=0.75;// 速度改变程度 boolean paused=false;// 游戏状态 int score=0; int countMove=0; // UP和DOWN是偶数,RIGHT和LEFT是奇数 public static final int UP=2; public static final int DOWN=4; public static final int LEFT=1; public static final int RIGHT=3; //---------------------------------------------------------------------- //GreedModel():初始化界面 //--------------------------------------------------


【文件预览】:
贪吃蛇
----必读.txt(516B)
----Java源码.url(132B)
----GreedSnake.java(11KB)

网友评论

  • 大学生学习用还是可以,适合新手。
  • 不错类。帮了我大忙了。
  • 很简单的一款小游戏,对我有些帮助,了解了基本的模型
  • 很简单的小游戏,有些小bug,不过能够用,有个基本模型。
  • 很简单的一款小游戏,没有融入智能算法