Puyo Game_一个好玩的游戏!

原创 2005年04月30日 16:54:00

这是我为了应聘一个游戏公司写的小游戏,以前不怎么接触java,还是第一次正式写java程序,有错误的地方,还望见谅!

下面是对游戏的一个简介:因为公司要求用英文,我就不翻译了,嘿嘿!

Guide and Improvements of Puyo Game

Author: handwolf  2005-4-30

Email: handwolf@tom.com

--------------- 
Rules of Game:
---------------
   (1) Spheres come down from the top of the game board in pairs.  A player can rotate and move them on their way down as following :
       Press Key                   Sphere action
          left                       move left by 1 step
          right                     move right by 1 step
          down                      move down by 1 step
          blank space              deasil turn by 1 step
 
   (2) Spheres come in  4 different colors: red, blue, green, and yellow. New sphere's color is generated randomly.
 
   (3) Removes spheres from screen when more than four same_color spheres links(horizontally, vertically or both(as in tetris)). Allowing any sphere remaining to drop and fill the vacated space. This may lead to several possible "chain combos" if additional colors match.
 
   (4) If one sphere is blocked because there is something underneath, the other one will continue falling (with no player control over it) until it reaches something.

   (5) About the score:
       4 same-color spheres link in one line:   +4
       5 same-color spheres link in one line:   +8
       6 same-color spheres link in one line:   +12


------------------------
The function of Buttons:
------------------------
  (1) "Play" Button : Push this button to start a puyo game. while the game is playing, pushing this button will restart the puyo game.
 
  (2) "Pause" Button: When text on this button is "Pause", pushing this button will pause the playing game, and the text on this button will changed to "Continue".
                      When text on this button is "Continue", pushing this button will continue the paused game, and the text on this button will changed to "Pause".
 
  (3) "Level Up" Button: Push this button to add the game level, the highter level, the more difficult. And the highest level is 10.
 
  (4) 'Level Down" Button: Push this button to reduce the game level, the lower level, the less difficult. And the lowest level is 1.
 
  (5) 'Quit" Button: Once push this button, the application will be closed.


--------------------
Improvements
--------------------
I think once generate 2 spheres is a bit simple to players.
If once generate 3 or 4 new spheres, and make the game board larger, the game will be more challenging.

下面是java源代码,直接拷贝出来了.

import java.awt.*;
import java.awt.event.*;
import java.net.URLClassLoader;
import java.util.*;

//////////////////////////////////////////////////////////////////////
//CLASS    : Puyo
//ABSTRACT : the board of Puyo game
//NOTE     : 
//CREATE   : handwolf  2005-4-29
//////////////////////////////////////////////////////////////////////
public class Puyo extends Frame{       
   public static boolean m_bIsPlay=false;
   public static int m_iScore = 0;
   public static TextField m_fieldScore,m_fieldLevel;
   public static MyTimer m_timer;
   GameCanvas m_gameScr; //game screen
  
   //added by handwolf 2005-4-30 (start)
   public static Button play_b;
   public static Button pause_b;
   public static Button level_up_b;
   public static Button level_down_b;
   //added by handwolf 2005-4-30 (end)

   public static int m_iLevel=1; //init game level

   public static void main(String[] argus){
    Puyo w_puyo = new Puyo("Puyo  V1.0     Author:Handwolf");
    WindowListener w_winListener = new WinListener();
    w_puyo.addWindowListener(w_winListener);
   }

   //construct of Puyo, init the frame
   Puyo(String title){
    super(title);  
    setSize(400,420);
    setResizable(false); //unresizable
    setLayout(new GridLayout(1,2));
   //left side of frame, contains the spheres
    m_gameScr = new GameCanvas();
    m_gameScr.addKeyListener(m_gameScr);
    add(m_gameScr);    
   

   //right side of frame
    Panel rightScr = new Panel();
    rightScr.setLayout(new GridLayout(2,1,0,30));
    rightScr.setSize(120,420);
    add(rightScr);

 //Game info, in the rightUp side
    MyPanel infoScr = new MyPanel();
    infoScr.setLayout(new GridLayout(8,1,0,1));
    infoScr.setSize(120,300);
    rightScr.add(infoScr);

    //info of how to play this game
    Label labelLeft = new Label("Left : left",Label.LEFT);
    Label labelRight = new Label("Right: right",Label.LEFT);
    Label labelDown = new Label("Down : down",Label.LEFT);
    Label labelTurn = new Label("Turn : space",Label.LEFT);
    infoScr.add(labelLeft);
    infoScr.add(labelRight);
    infoScr.add(labelDown);
    infoScr.add(labelTurn);
    labelLeft.setSize(new Dimension(20,60));
    labelRight.setSize(new Dimension(20,60));
    labelDown.setSize(new Dimension(20,60));
    labelTurn.setSize(new Dimension(20,60));
   
    //score of the player, and level of game
    Label scorep = new Label("Score:",Label.LEFT);
    Label levelp = new Label("Level:",Label.LEFT);
    m_fieldScore = new TextField(8);
    m_fieldLevel = new TextField(8);
    m_fieldScore.setEditable(false);
    m_fieldLevel.setEditable(false);    
    infoScr.add(scorep);
    infoScr.add(m_fieldScore);
    infoScr.add(levelp);
    infoScr.add(m_fieldLevel);
    scorep.setSize(new Dimension(20,60));
    m_fieldScore.setSize(new Dimension(20,60));
    levelp.setSize(new Dimension(20,60));
    m_fieldLevel.setSize(new Dimension(20,60));
    m_fieldScore.setText("0");
    m_fieldLevel.setText("1");
   

   //buttons,in the rightDown side
    MyPanel controlScr = new MyPanel();
    controlScr.setLayout(new GridLayout(5,1,0,5));
    rightScr.add(controlScr);

    //play
    play_b = new Button("Play");
    play_b.setSize(new Dimension(50,200));
    play_b.addActionListener(new Command(Command.button_play,m_gameScr));

       //Pause
    pause_b =new Button("Pause");
    pause_b.setSize(new Dimension(50,200));
    pause_b.addActionListener(new Command(Command.button_pause,m_gameScr));
  
    //Level Up
    level_up_b = new Button("Level Up");
    level_up_b.setSize(new Dimension(50,200));
    level_up_b.addActionListener(new Command(Command.button_levelup,m_gameScr));

    //Level Down
    level_down_b =new Button("Level Down");
    level_down_b.setSize(new Dimension(50,200));
    level_down_b.addActionListener(new Command(Command.button_leveldown,m_gameScr));   

    //Quit
    Button quit_b = new Button("Quit");
    quit_b.setSize(new Dimension(50,200));
    quit_b.addActionListener(new Command(Command.button_quit,m_gameScr));

    controlScr.add(play_b);
    controlScr.add(pause_b);
    controlScr.add(level_up_b);
    controlScr.add(level_down_b);    
    controlScr.add(quit_b);
    setVisible(true);
    m_gameScr.requestFocus();
   
    //init the timer
    m_timer = new MyTimer(m_gameScr);
    m_timer.setDaemon(true);
    m_timer.start();
    m_timer.suspend();
  }
   }

   //MyPanel, set the gap around
class MyPanel extends Panel{
    public Insets getInsets(){
     return new Insets(0,20,0,20);
    }
}
//*************end of class  Puyo******************//

//////////////////////////////////////////////////////////////////////
//CLASS    : GameCanvas
//ABSTRACT : the display screen of Puyo game, display the spheres
//NOTE     : 
//CREATE   : handwolf  2005-4-29
//////////////////////////////////////////////////////////////////////
class GameCanvas extends Canvas implements KeyListener{
    Image m_images[];      //the images of sphere
    int   m_iUnitHeight;   //the height of one unit,(the highest image's height)
    int   m_iUnitWidth;    //the height of one unit,(the widest image's width)
    TwoSphere m_twoSphere; //the active two sphere,which come down from the top of the game board.
    int m_iRowNum;         //row number of unit
    int m_iColumnNum;      //column number of unit
    int m_iMaxAllowRowNum; //the max row that can contain sphere that can not fall down
    int m_iSphereInitRow;  //the init row of new sphere
    int m_iSphereInitCol;  //the init col of new sphere
    int [][] m_iArrScr;    //units of screen                          
   
    //construte,init the data of screen
    GameCanvas(){
     m_images = new Image[4];
     m_iUnitHeight = 0;
     m_iUnitWidth = 0;
     for(int i = 1; i < 5; ++i){
    String strFileName = "sphere" + i + ".png";
    m_images[i-1] = getImage(strFileName);
    if(m_iUnitHeight < m_images[i-1].getHeight(this))
    m_iUnitHeight = m_images[i-1].getHeight(this);
    if(m_iUnitWidth < m_images[i-1].getWidth(this))
    m_iUnitWidth = m_images[i-1].getWidth(this);
     }
     m_iRowNum = 12;
     m_iColumnNum = 6;
     m_iMaxAllowRowNum = m_iRowNum-1;
     m_twoSphere = new TwoSphere(this);
     m_iSphereInitRow = m_iRowNum - 1;
     m_iSphereInitCol = m_iColumnNum/2;
     m_iArrScr = new int [24][12];
    }

  
       //init the units of screen , init the sphere
   void initScr(){
    for(int i=0;i<24;i++)
     for (int j=0; j<12;j++)
     m_iArrScr[i][j]=0;
     m_twoSphere.reset();
     repaint();
   }
       
    //paint the screen
    public void paint(Graphics g){
     for(int i = 0; i < m_iRowNum; i++)
      for(int j = 0; j < m_iColumnNum; j++)
       drawUnit(i,j,m_iArrScr[i][j]);
    }
      //get the image specified by the filename
   Image getImage(String filename)
   {
   URLClassLoader urlLoader = (URLClassLoader)getClass().getClassLoader();
   java.net.URL url = null;
   Image image = null;
   url = urlLoader.findResource(filename);
   image = Toolkit.getDefaultToolkit().getImage(url);
   MediaTracker mediatracker = new MediaTracker(this);
   try
   {
    mediatracker.addImage(image, 0);
    mediatracker.waitForID(0);
   }
   catch(InterruptedException _ex)
   {
    image = null;
   }
   if(mediatracker.isErrorID(0))
    image = null;
   return image;
   } 
  
  /////////////////////////////////////////////////////////////////////
  //MODULE   : GameCanvas.drawUnit
  //ABSTRACT : draw one unit of screen
  //RETURN   : void
  //ARGUMENTS:
  //    I/O           TYPE      NAME       EXPLANATION
  //           I             int     row,col    the row ann col of unit in the screen
  //           I             int     type       the image of unit,1--yellow sphere,2--blue sphere,3--green sphere,4--red sphere
  //CREATE   :  handwolf  2005-4-29
  /////////////////////////////////////////////////////////////////////
 public void drawUnit(int row,int col,int type){
  m_iArrScr[row][col] = type;
  Graphics g = getGraphics();
  g.setColor(Color.black);//back color of screen is black
  g.fill3DRect(col*m_iUnitWidth,getSize().height-(row+1)*m_iUnitHeight,m_iUnitHeight,m_iUnitWidth,true);
  switch(type){
  case 1: //1--yellow sphere
  case 2: //2--blue sphere
  case 3: //3--green sphere
  case 4: //4--red sphere
     g.setColor(Color.black);//back color of screen is black
     g.fill3DRect(col*m_iUnitWidth,getSize().height-(row+1)*m_iUnitHeight,m_iUnitHeight,m_iUnitWidth,true);
     g.drawImage (m_images[type-1], col*m_iUnitWidth,getSize().height-(row+1)*m_iUnitHeight, this);
     break;    
   }           
   g.dispose();
 }

 public TwoSphere getTwoSphere(){
   return m_twoSphere;     
 }   

     //get value of the specified unit in the screen
 public int getScrUnit(int row,int col){
    if (row < 0  || row >= m_iRowNum || col < 0 || col >= m_iColumnNum)
      return(-1);
    else
   return(m_iArrScr[row][col]);
 }   
 
 public int getInitRow(){
   return(m_iSphereInitRow);                         
 }
 public int getInitCol(){
   return(m_iSphereInitCol);                         
 }   
   
 /////////////////////////////////////////////////////////////////////
 //MODULE   : GameCanvas.deleteSameColorLink
 //ABSTRACT : removes spheres from screen when  more than four same_color spheres links(horizontally, vertically or both(as in tetris))
 //RETURN   : void 
 //CREATE   :  handwolf  2005-4-29
 /////////////////////////////////////////////////////////////////////
 void deleteSameColorLink(){  
  class UnitXY{//save the unit that should be removed
    public int col;
    public int row;
    UnitXY(){
    col = 0;
    row = 0;
    }
   UnitXY(int x, int y){
    col = x;
    row = y;
    }
  }   
  java.util.List lst_UnitDel = new ArrayList();//save the unit that should be removed
  
        //search spheres horizontally
     for(int iRow = 0; iRow < m_iRowNum; ++iRow){
   int iLinkNum = 1;//the number of same_color spheres that link in line
   for(int iCol = 0; iCol < m_iColumnNum - 3;){  
     //same sphere    
     if(iCol + iLinkNum < m_iColumnNum && m_iArrScr[iRow][iCol] != 0 && m_iArrScr[iRow][iCol] == m_iArrScr[iRow][iCol + iLinkNum]){
    ++iLinkNum;
     }else if(iLinkNum >= 4){//find one line
     Puyo.m_iScore += (iLinkNum-3)*4; //add the score
     for(int iCol2 = iCol; iCol2 < iCol+iLinkNum; ++iCol2){
       UnitXY w_unit = new UnitXY();
       w_unit.col = iCol2;
       w_unit.row = iRow;
       lst_UnitDel.add(w_unit);//add to list, delete later
     }
     iCol = iCol + iLinkNum;//next col
     iLinkNum = 1;
       }else{      
        iCol = iCol + iLinkNum;//next col
     iLinkNum = 1;
    } 
   }     
  }  
  //search spheres vertically
  for(int iCol = 0; iCol < m_iColumnNum; ++iCol){
    int iLinkNum = 1;//the number of same_color spheres that link in line
       for(int iRow = 0; iRow < m_iRowNum - 3;){
            //same sphere
   if(iRow + iLinkNum < m_iRowNum && m_iArrScr[iRow][iCol] != 0 && m_iArrScr[iRow][iCol] == m_iArrScr[iRow + iLinkNum][iCol]){
    ++iLinkNum;
   }else if(iLinkNum >= 4){//find one line
    Puyo.m_iScore += (iLinkNum-3)*4;       
    for(int iRow2 = iRow; iRow2 < iRow+iLinkNum; ++iRow2){
     UnitXY w_unit = new UnitXY();
     w_unit.col = iCol;
     w_unit.row = iRow2;
     lst_UnitDel.add(w_unit);//add to list, delete later
    }
    iRow = iRow + iLinkNum;//next row
    iLinkNum = 1;
   }else{
    iRow = iRow + iLinkNum;//next row
    iLinkNum = 1;
   }
    }
  } 
   
  boolean bNeedDelAgain = false;//This function may lead to several possible "chain combos" if additional colors match   
  for(int i = 0; i<lst_UnitDel.size(); ++i ){
   UnitXY w_unit=(UnitXY)lst_UnitDel.get(i);
   drawUnit(w_unit.row,w_unit.col,0);
   m_iArrScr[w_unit.row][w_unit.col]=0;
   bNeedDelAgain = true;
  }       
   
  //spheres remaining drop and fill the vacated space
  for(int iCol = 0; iCol < m_iColumnNum; ++iCol){    
   boolean bIsColOver = true;
   while(bIsColOver){
    boolean bFlagModified = false;
    for(int iRow = 0; iRow < m_iRowNum - 1; ++iRow){
      if(m_iArrScr[iRow][iCol] == 0 && m_iArrScr[iRow+1][iCol] != 0){
      m_iArrScr[iRow][iCol] = m_iArrScr[iRow+1][iCol];
      m_iArrScr[iRow+1][iCol] = 0;
      drawUnit(iRow+1,iCol,0);
      drawUnit(iRow,iCol,m_iArrScr[iRow][iCol]);
      bFlagModified = true;
      }
    }//end of for iRow   
    bIsColOver = bFlagModified;  
   }//end of while
  }//end of for iCol          
     
  Puyo.m_fieldScore.setText(""+Puyo.m_iScore);
   
  if(bNeedDelAgain)
      deleteSameColorLink();
     
  }
  
    //check whether the game is over    
  boolean isGameEnd(){
     for (int iCol = 0 ; iCol <m_iColumnNum; ++iCol){
      if(m_iArrScr[m_iMaxAllowRowNum][iCol] != 0)
       return true;
     }
     return false;
  }

  public void keyTyped(KeyEvent e){
  }

  public void keyReleased(KeyEvent e){
  }

  //conduct the message of key press
  public void keyPressed(KeyEvent e){
  if(!Puyo.m_bIsPlay)
      return;
  switch(e.getKeyCode()){
   case KeyEvent.VK_DOWN:m_twoSphere.fallDown();break;
   case KeyEvent.VK_LEFT:m_twoSphere.leftMove();break;
   case KeyEvent.VK_RIGHT:m_twoSphere.rightMove();break;
   case KeyEvent.VK_SPACE:m_twoSphere.deasilTurn();break;
  }
  }
}
//*************end of class  GameCanvas******************//


//////////////////////////////////////////////////////////////////////
//CLASS    : Command
//ABSTRACT : conduct the Buttons' message
//NOTE     : 
//CREATE   : handwolf  2005-4-29
//////////////////////////////////////////////////////////////////////
class Command implements ActionListener{
    static final int button_play = 1;       //distribute id to buttons
    static final int button_levelup = 2;
    static final int button_leveldown = 3;
    static final int button_quit = 4;
    static final int button_pause = 5;
    static boolean pause_resume = true;

    int curButton;                          //current button
    GameCanvas scr;                         //the screen
   
    Command(int button,GameCanvas scr){
     curButton = button;
     this.scr=scr;
    }

    //conduct the Buttons' message
    public void actionPerformed (ActionEvent e){
    switch(curButton){
      case button_play:if(Puyo.m_bIsPlay){
    Puyo.m_bIsPlay = false;
    Graphics g = scr.getGraphics();
    g.clearRect(0,0,200,500); 
      }
      Puyo.m_timer.suspend();               
      scr.initScr();       
      Puyo.m_bIsPlay = true;
      Puyo.m_iScore  = 0;
      Puyo.m_fieldScore.setText("0");
      Puyo.m_timer.resume();
         
      scr.requestFocus();
      break;
      case button_levelup:if(Puyo.m_iLevel < 10){
       Puyo.m_iLevel++;
       Puyo.m_fieldLevel.setText(""+Puyo.m_iLevel);
       Puyo.m_iScore = 0;
       Puyo.m_fieldScore.setText(""+Puyo.m_iScore);
       Puyo.level_down_b.enable(true);
      } else{
       Puyo.level_up_b.enable(false);
      }
      scr.requestFocus();
      break;
      case button_leveldown:if(Puyo.m_iLevel > 1){
       Puyo.m_iLevel--;
       Puyo.m_fieldLevel.setText(""+Puyo.m_iLevel);
       Puyo.m_iScore = 0;
       Puyo.m_fieldScore.setText(""+Puyo.m_iScore);
       Puyo.level_up_b.enable(true);
      }else{
          Puyo.level_down_b.enable(false);
      }
      scr.requestFocus();
      break;
      case button_pause:if(pause_resume){
       Puyo.m_timer.suspend();
       pause_resume = false;
       Puyo.pause_b.setLabel("Continue");
      }else{
       Puyo.m_timer.resume();
       pause_resume = true;
       Puyo.pause_b.setLabel("Pause");
      }
      scr.requestFocus();
      break;
      case button_quit:System.exit(0);
     }
    }
}
//*************end of class  Command******************//

//////////////////////////////////////////////////////////////////////
//CLASS    : TwoSphere
//ABSTRACT : two spheres, which come down from the top of the game board.
//NOTE     : 
//CREATE   : handwolf  2005-4-29
//////////////////////////////////////////////////////////////////////
class TwoSphere{
    Sphere sphere1,sphere2;//contains to sphere
    GameCanvas scr;        //the screen
   
    TwoSphere(GameCanvas scr){
     this.scr = scr;
     sphere1 = new Sphere(scr);
     sphere2 = new Sphere(scr);
     sphere2.col = sphere1.col + 1;//2 is on right of 1    
    }

    //reinit two sphere, and display them
    public void reset(){
  sphere1.reset();
  sphere2.reset();
  sphere2.col = sphere1.col + 1;
  dispSphere();
    }

 
 /////////////////////////////////////////////////////////////////////
 //MODULE   : TwoSphere.deasilTurn
 //ABSTRACT : turn the two spheres deasil, 2 turn around 1 deasil.
 //RETURN   : void 
 //CREATE   :  handwolf  2005-4-29
 /////////////////////////////////////////////////////////////////////
    public void deasilTurn(){
    if(sphere1.sphereState == 2 || sphere2.sphereState == 2)//only one sphere can move
    return ;
    Puyo.m_timer.suspend();
    if(sphere1.col < sphere2.col && sphere2.assertValid(-1,0) && sphere2.assertValid(-1,-1)){//2 is on the right side of 1
   sphere2.Move(-1,-1);//2 move to leftdown side of 2
    }else if(sphere1.row > sphere2.row && sphere1.col > 0 && sphere2.assertValid(0,-1) && sphere2.assertValid(1,-1)){//2 is on the down side of 1
   sphere2.Move(1,-1);//2 move to leftup side of 2
    }else if(sphere1.col > sphere2.col && sphere2.assertValid(1,0) && sphere2.assertValid(1,1)){//2 is on the left side of 1
   sphere2.Move(1,1);//2 move to rightup side of 2
    }else if(sphere1.row < sphere2.row && sphere1.col < scr.m_iColumnNum-1 && sphere2.assertValid(0,1) && sphere2.assertValid(-1,1)){//2 is on the up side of 1
   sphere2.Move(-1,1);//2 move to rightdown side of 2   
    }      
    Puyo.m_timer.resume();
    }

    //move two sphere left by step 1
    public void leftMove(){
  if(sphere1.sphereState == 2 || sphere2.sphereState == 2)//only one sphere can move
   return ;
  if( sphere1.col < sphere2.col && sphere1.assertValid(0,-1)){//1 is on the left side of 2
   sphere1.leftMove();
   sphere2.leftMove();
  }else if( sphere1.col > sphere2.col && sphere2.assertValid(0,-1)){//1 is on the right side of 2
   sphere2.leftMove();
   sphere1.leftMove();
  }else{
   if(sphere1.assertValid(0,-1) && sphere2.assertValid(0,-1)){
    sphere1.leftMove();
    sphere2.leftMove();
   }
  } 
    }

    //move two sphere right by step 1
    public void rightMove(){
  if(sphere1.sphereState == 2 || sphere2.sphereState == 2)//only one sphere can move
   return ;
  if(sphere1.col < sphere2.col && sphere2.assertValid(0,1)){//1 is on the left side of 2
   sphere2.rightMove();
   sphere1.rightMove();
  }else if(sphere1.col > sphere2.col && sphere1.assertValid(0,1)){//1 is on the right side of 2
   sphere1.rightMove();
   sphere2.rightMove();
  }else{
   if(sphere1.assertValid(0,1) && sphere2.assertValid(0,1)){
    sphere1.rightMove();
    sphere2.rightMove();
   }
  }
    }

    //move two sphere down by step 1
    public boolean fallDown(){
   boolean b1, b2;
   if(sphere1.row > sphere2.row){//1 is on up side of 2, then move 2 first
    b2 = sphere2.fallDown();
    b1 = sphere1.fallDown();
   }else{
    b1 = sphere1.fallDown();
   b2 = sphere2.fallDown();
   }
   return (b1 || b2);
    }

    //display two spheres
    public synchronized void dispSphere(){
  sphere1.dispSphere();
  sphere2.dispSphere();
    }
}
//*************end of class  TwoSphere******************//

//////////////////////////////////////////////////////////////////////
//CLASS    : Sphere
//ABSTRACT : display in one unit of screen
//NOTE     : used by class TwoSphere
//CREATE   : handwolf  2005-4-29
//////////////////////////////////////////////////////////////////////
class Sphere {   
   int sphereType;         //the type of sphere ,1--yellow sphere,2--blue sphere,3--green sphere,4--red sphere
   int sphereState;        //sphere's state, 1--enabled, 2--disabled
   int row,col;            //sphere's position in the screen
   GameCanvas scr;         //screen
 
 Sphere(GameCanvas scr){
    this.scr = scr;
   
    //generate a random sphere type
    Random random2=new Random();
    Random random1 = new Random(random2.nextInt());
    sphereType =(Math.abs(random1.nextInt()+1) % 4) + 1;
   
    sphereState = 1;
    row = scr.getInitRow();
    col = scr.getInitCol();
   }
  
   public void reset(){
       //generate a random sphere type
    Random random2=new Random();
    Random random1 = new Random(random2.nextInt());
    sphereType =(Math.abs(random1.nextInt()+1) % 4) + 1;
   
    sphereState = 1;
    row = scr.getInitRow();
    col = scr.getInitCol();
   }

   //move the sphere by step iDiscY in row and iDiscX in col
   public void Move(int iDiscY, int iDiscX){
  dispSphere(0);
  row = row + iDiscY;
  col = col + iDiscX;
  dispSphere(sphereType);
   }
   
   //move the sphere left by step 1 
   public void leftMove(){
   Move(0,-1);   
   }

   //move the sphere right by step 1
   public void rightMove(){
   Move(0,1);    
   }

   //move the sphere down by step 1
   public boolean fallDown(){
    if(sphereState == 2)
     return(false);
    if(assertValid(-1,0)){
     Move(-1,0);
     return(true);
    }else{
     sphereState = 2;
     dispSphere(sphereType);
     return(false);
    }
   }

   //Whether the unit spcified by (row + iStepY, col +iStepX) is empty, true--empty, false--not empty or out of screen
   boolean assertValid(int iStepY,int iStepX){               
    int iDownUnitFlag = scr.getScrUnit(row + iStepY, col +iStepX);
    if(iDownUnitFlag != 0){
  return false;
    }
    return true;
   }
  
   //display the sphere in the screen
   public synchronized void dispSphere(){
   scr.drawUnit(row,col,sphereType);
   }
   //display the sphere in the screen, sphere type is s
   public synchronized void dispSphere(int s){
    scr.drawUnit(row,col,s);
   }
}
//*************end of class  Sphere******************//

//timer class
class MyTimer extends Thread{
   GameCanvas scr; //screen
   public MyTimer(GameCanvas scr){
    this.scr = scr;
   }
  
   public void run(){
    while(true){
     try{
      sleep((10-Puyo.m_iLevel + 1)*100);
     }
     catch(InterruptedException e){}
     if(!scr.getTwoSphere().fallDown()){
      scr.deleteSameColorLink();
      if(scr.isGameEnd()){
       Puyo.m_bIsPlay = false;
       Graphics g = scr.getGraphics();
       g.clearRect(0,0,200,500);      
       g.drawString("Game Over!",100,100);
       suspend();                 
      }else
       scr.getTwoSphere().reset();
     }
    }
   }
}
//*************end of class  MyTimer******************//

class WinListener extends WindowAdapter{
    public void windowClosing (WindowEvent l){
     System.exit(0);
    }
}
//*************end of class  WinListener******************//

//end of file

如果您发现程序有什么问题,能联系我的话,十分感谢!

下面是四个图片资源(球)

下面是程序运行效果!

一个用game make 6做的小游戏

  • 2006年02月23日 09:05
  • 174KB
  • 下载

Game Engine Architecture by Jason Gregory:1.2 什么是一个游戏

可能我们都会对“什么是一个游戏”有一个直观上的感觉。“游戏”这个术语包含桌上游戏如象棋、monopoly,纸牌游戏如扑克和21点,赌博游戏如轮盘赌和街机,对战游戏,电脑游戏等,它们在少年儿童中很普遍,...
  • skylmmm
  • skylmmm
  • 2011年02月26日 10:58
  • 725

【用Cocos Creator给暗恋的女生写一个游戏(8)】——(Run Game) Prefab的动态管理

我们先来考虑一下这个PrefabManager是干什么的,我们的游戏中有重复出现的水管和老公,所以PrefabManager要能够动态管理他们,理所当然要有创建和销毁的方法,创建很简单,我们只需要每隔...

【用Cocos Creator给暗恋的女生写一个游戏(6)】——(Run Game)主角逻辑

我们在Canvas节点的同级添加一个Game节点,并添加两个子节点如图新建一个脚本取名叫做“Game”并添加到Game节点上Game.jsvar Player = require("Player");...

Godot教程中文版-一个简单的2D游戏(Simple 2D Game,Pong!)

乒乓球 Pong 在这个简单的教程中,我们会创建一个基本的乒乓球游戏。在引擎的演示中有很多复杂的例子,但是这里应该介绍一个具备基本功能的2D游戏。 资源 Assets 这个教程包含以下资源:乒乓垫,乒...

又一個跨平台遊戲開發工具?Game Closure 體驗

市場上可用於跨平台遊戲開發的工具已經愈來愈多,Corona,Unity3D 等等,現在又來了一個 Game Closure,號稱用 HTML5 來開發遊戲的它,到底有什麼特別之處呢?其官網就提到,10...

【用Cocos Creator给暗恋的女生写一个游戏(11)】——(Jump Game) 镜头跟随

上节自习大家是不是上的很开心啊。。。。大家是不是发现了两个游戏有辣么多相同的地方,就连很多节点的名字都一样但是有一个东西是第一游戏没有的,那就是中间的那个Camera我把Camera节点添加上颜色Ca...

用 React + es6 完成一个著名的生命游戏(Game of life,Conway)

http://elevenbeans.github.io/2017/04/05/Game-of-life/ 这是有名的康威生命游戏, 描述的是一种细胞自动机。 对一个 M*N 的区域,每一...

【用Cocos Creator给暗恋的女生写一个游戏(5)】——(Run Game)场景搭建

先看图这个场景我们只用了两张小图片素材,分别是A1和B1对应的图片,而A2和B2是复制前面的,可以看出,A和B部分明显长出屏幕的宽,这是为了实现背景无限移动的效果(当图片滚动到一定距离,我们让它再重新...

Game Engine Architecture by Jason Gregory:1.3 什么是一个游戏引擎

"游戏引擎"这个概念是在1990时代中期随着类似当时由idsoft公司做的疯狂流行的Doom这种第一人称射击游戏而出现的。Doom通过对核心软件部分(如3D图形渲染系统、碰撞检测系统、音频系统)、美术...
  • skylmmm
  • skylmmm
  • 2011年02月28日 22:32
  • 635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Puyo Game_一个好玩的游戏!
举报原因:
原因补充:

(最多只允许输入30个字)