服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用java编写的小游戏源代码分析


  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import java.util.*;
  
  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;
  
   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();
   }
  
   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();
    }
   }
  
   public void keyreleased(keyevent e){
   }
  
   public void keytyped(keyevent e){
   }
  
  
   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();
   }
  
   private void drawnode(graphics g, node n){
    g.fillrect(n.x*nodewidth,
          n.y*nodeheight,
          nodewidth-1,
          nodeheight-1);
   }
   
   public void updatescore(){
    string s = "score: " + snakemodel.score;
    labelscore.settext(s);
   }
  
   void begin(){
    if (snakemodel == null || !snakemodel.running){
     snakemodel = new snakemodel(this,
                   canvaswidth/nodewidth,
                   canvasheight/nodeheight);
     (new thread(snakemodel)).start();
    }
   }
  
   public static void main(string[] args){
    greedsnake gs = new greedsnake();
   }
  }
  
  ///////////////////////////////////////////////////
  // 文件2
  ///////////////////////////////////////////////////
  
  import java.util.*;
  import javax.swing.*;
  
  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 and down should be even
   // right and left should be odd
   public static final int up = 2;
   public static final int down = 4;
   public static final int left = 1;
   public static final int right = 3;
  
   public snakemodel(greedsnake gs, int maxx, int maxy){
    this.gs = gs;
    this.maxx = maxx;
    this.maxy = maxy;
  
    // initial matirx
    matrix = new boolean[maxx][];
    for(int i=0; i<maxx; ++i){
     matrix[i] = new boolean[maxy];
     arrays.fill(matrix[i],false);
    }
  
    // initial the snake
    int initarraylength = maxx > 20 ? 10 : maxx/2;
    for(int i = 0; i < initarraylength; ++i){
     int x = maxx/2+i;
     int y = maxy/2;
     nodearray.addlast(new node(x, y));
     matrix[x][y] = true;
    }
  
    food = createfood();
    matrix[food.x][food.y] = true;
   }
  
   public void changedirection(int newdirection){
    if (direction % 2 != newdirection % 2){
     direction = newdirection;
    }
   }
  
   public boolean moveon(){
    node n = (node)nodearray.getfirst();
    int x = n.x;
    int y = n.y;
  
    switch(direction){
     case up:
      y--;
      break;
     case down:
      y++;
      break;
     case left:
      x--;
      break;
     case right:
      x++;
      break;
    }
  
    if ((0 <= x && x < maxx) && (0 <= y && y < maxy)){
     if (matrix[x][y]){
      if(x == food.x && y == food.y){
       nodearray.addfirst(food);
       
       int scoreget = (10000 - 200 * countmove) / timeinterval;
       score += scoreget > 0? scoreget : 10;
       countmove = 0;
       
       food = createfood();
       matrix[food.x][food.y] = true;
       return true;
      }
      else
       return false;
     }
     else{
      nodearray.addfirst(new node(x,y));
      matrix[x][y] = true;
      n = (node)nodearray.removelast();
      matrix[n.x][n.y] = false;
      countmove++;
      return true;