《俄羅斯方塊》單機版製作心得

發佈日期

   前面說的是建立了Piece0, Piece1,Piece2,Piece3,Piece4,Piece5,Piece6.其中變化的方塊,由於遊戲開始和下一個方塊出現時是隨機得到不同的大方塊的,在定義Piece時用changes屬性(Protectec  List<List<Square>> changes = new ArrayList<<List<Square>>())來儲存變化的方塊,所以要想隨機的到一個方塊,在Piece提供了一個geDefault()方法,並提供了一個隨機產生數字的想要得到的變化的隨機數屬性random(protected Random random = new Random();  )。

protected Random random = new Random();


public List<Square> getDefault() {
           //從changes中隨機得到其中一種變化
             int defaultChange = random.nextInt(changes.size());
    
              this.currentIndex = defaultChange;    
              return changes.get(defaultChange);
       }


在Piece1,Piece2,Piece3,Piece4,Piece5,Piece6類裡新增下面的語句super.setSquares(getDefault());


注意了前面只說了大方塊和小方塊的類。特別是小方塊裡的Image image屬性且 前面建立了各個Piece的子類。每個子類都提供一個含有image構造器。只需從檔案裡讀取圖片就可以建立一個可以下降的大方塊了。下面說說建立與顯示大方塊。新建一個PieceCreator介面專門用於建立大方塊。(注:在這裡我想不出書的作者為什麼建立這個介面)並未介面提供了一個PieceCreatorImpl實現類


public interface PieceCreator {
     /**
    * 在x和y座標中建立一個Square物件
    */
     Piece createPiece(int x,int y);
 
  /**
   *返回一個Square物件
   */
 
    Piece getPiece();
}


為了建立一個真正帶有圖片的物快,很明顯需要考慮的因素是:必須得到圖片,為此在PieceCreatorImpl類提供了getImge(int key)方法。(關於引數key的加入待會看了後面會明白)。從檔案裡得到圖片要有檔案的讀取操作。為了不用每次都去檔案裡讀取一個Image物件,在PieceCreatorImpl裡提供了一個Map類儲存讀取過的image物件

Private Map<Integer,Image> images = new HashMap<Integer,Image>();


但是對於Map裡的圖片又是從哪裡來的呢?當然是讀取檔案的來的。所以有設計了一個ImageUtil類來讀取圖片


public class ImageUtil {

public static BufferedImage getImage(String imagePath) {//注意是靜態方法
   try {
      //使用ImageIO讀取圖片
      return ImageIO.read(new File(imagePath));
     } catch (IOException e) {
      //讀取圖片發生異常,丟擲GameException
      throw new GameException("read image error");
     }
 }

}


//於是map中的圖片就是下面程式碼得來的。從map中得到圖片物件,如果map中沒有對應的圖片物件,則建立
 
 private Image getImage(int key) {
   if(this.images.get(key)==null) {
    Image s = ImageUtil.getImage("images/square" + key+".jpg");
      this.images.put(key,s);//
  }
  
  return this.images.get(key);  
 }

(個人認為把圖片放入map應該單獨定義一個方法)


得到了圖片下面改建立把圖片加入到Square裡進而建立一個大方塊了,注意由於檔案裡保留了七種不同顏色的圖片(/

/總共有七種顏色的方塊
 private final static int COLOR_SIZE = 7;),

所以獲得圖片時也是提供一個在PieceCreatorImplement類裡提供了random屬性

(private Random random = new Random();)

來隨機讀取一張圖片,

public Piece createPiece(int x, int y) {
  //隨機得到一張方塊圖片
  Image image = getImage(random.nextInt(COLOR_SIZE));

Piece piece = initPiece(image);
   return piece;
 }


/**
  * 初始化各個大方快,隨機建立各個大方框
  */
 
 public Piece initPiece(Image image) {
  Piece piece = null;
  int pieceType = random.nextInt(SQUARE_SIZE); 
  if(pieceType == 0) {
   piece = new Piece0(image);
  }else if(pieceType == 1) {
   piece = new Piece1(image);
  }else if(pieceType == 2) {
   piece = new Piece0(image);
  }else if(pieceType == 2) {
   piece = new Piece3(image);
  }else if(pieceType == 3) {
   piece = new Piece4(image);
  }else if(pieceType == 5) {
   piece = new Piece5(image);
  }else if(pieceType == 6) {
   piece = new Piece6(image);
  }
  
  return piece;
  
 }



需要注意的是,遊戲中大方塊出現的位置和移動的位置的實現是透過改變方塊位置的縱橫座標來實現的,又由於實際上大方塊是由小方塊組成的,只要同時改變組成大方塊的所有小方塊的x和y 座標就可以了,為此Piece提供了一以下方法

//讓Piece物件中所有的Square物件的x座標都加上引數x
   public void setSquareXLocation(int x) {
    for(int i = 0;i<this.changes.size();i++) {
    //得到一個變化
     List<Square> change = this.changes.get(i);
     for(int j = 0;j<change.size();j++) {      
      Square s = change.get(j);
      s.setBeginX(s.getBeginX()+x);
     }
    }
   }
   
   //讓Piece物件中所有的Square物件的y座標都加上引數y
   public void setSquareYLocation(int y) {
    for(int i = 0;i<this.changes.size();i++) {
     //從變化容器裡得到各個成有不同形狀的大方塊的容器
     List<Square> change = this.changes.get(i);
     for(int j = 0;j<change.size();j++) {
    //得到容器裡的小方塊
      Square s = change.get(j);
      s.setBeginY(s.getBeginY()+y);

相關攻略文章

最新攻略