我的Android進階之旅------>Android瘋狂連連看遊戲的實現之狀態數據模型(三)

對於遊戲玩家而言,遊戲界面上看到的“元素”千變萬化;但是對於遊戲開發者而言,遊戲界面上的元素在底層都是一些數據,不同數據所繪製的圖片有所差異而已。因此建立遊戲的狀態數據模型是實現遊戲邏輯的重要步驟。

1、定義數據模型

連連看的界面是一個NxM的“網格”,每個網格上顯示一張圖片。而這個網格只需要一個二維數組來定義即可,而每個網格上所顯示的圖片,對於底層數據模型來說,不同的圖片對於着不同的數值即可。

對於上圖所示的數據模型,只要讓數值爲0的網格上不繪製圖片,其他數值的網格則繪製相應的圖片,就可以顯示出連連看的遊戲界面了。
本程序採用Piece[][]來保存遊戲的狀態模型,因爲Piece對象封裝的信息不僅包含了該方塊的左上角的X、Y座標。而且還包含了該Piece所顯示的圖片、圖片ID,這個圖片ID就是該Piece的數據。

2、初始化遊戲狀態數據

爲了初始化遊戲狀態,程序需要創建一個 Piece[][]數組,爲此程序定義一個AbstractBoard抽象類,該抽象類代碼如下:cn\oyp\link\board\AbstractBoard.java

[java] view plaincopy
  1. package cn.oyp.link.board;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.oyp.link.utils.GameConf;  
  6. import cn.oyp.link.utils.ImageUtil;  
  7. import cn.oyp.link.view.Piece;  
  8. import cn.oyp.link.view.PieceImage;  
  9.   
  10. /** 
  11.  * 遊戲區域的抽象類 <br/> 
  12.  * <br/> 
  13.  * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/> 
  14.  */  
  15.   
  16. public abstract class AbstractBoard {  
  17.     // 定義一個抽象方法, 讓子類去實現  
  18.     /** 
  19.      * 創建一個List集合,該集合裏面存放初始化遊戲時所需的Piece對象 
  20.      */  
  21.     protected abstract List<Piece> createPieces(GameConf config,  
  22.             Piece[][] pieces);  
  23.     /** 
  24.      * 返回Piece數組 
  25.      * @param config 
  26.      * @return 
  27.      */  
  28.     public Piece[][] create(GameConf config) {  
  29.         // 創建Piece[][]數組  
  30.         Piece[][] pieces = new Piece[config.getXSize()][config.getYSize()];  
  31.         // 返回非空的Piece集合, 該集合由子類去創建  
  32.         List<Piece> notNullPieces = createPieces(config, pieces);  
  33.         // 根據非空Piece對象的集合的大小來取圖片  
  34.         List<PieceImage> playImages = ImageUtil.getPlayImages(  
  35.                 config.getContext(), notNullPieces.size());  
  36.         // 所有圖片的寬、高都是相同的  
  37.         int imageWidth = playImages.get(0).getImage().getWidth();  
  38.         int imageHeight = playImages.get(0).getImage().getHeight();  
  39.         // 遍歷非空的Piece集合  
  40.         for (int i = 0; i < notNullPieces.size(); i++) {  
  41.             // 依次獲取每個Piece對象  
  42.             Piece piece = notNullPieces.get(i);  
  43.             piece.setPieceImage(playImages.get(i));  
  44.             // 計算每個方塊左上角的X、Y座標  
  45.             piece.setBeginX(piece.getIndexX() * imageWidth  
  46.                     + config.getBeginImageX());  
  47.             piece.setBeginY(piece.getIndexY() * imageHeight  
  48.                     + config.getBeginImageY());  
  49.             // 將該方塊對象放入方塊數組的相應位置處  
  50.             pieces[piece.getIndexX()][piece.getIndexY()] = piece;  
  51.         }  
  52.         return pieces;  
  53.     }  
  54. }  

下面介紹該AbstraceBoard的3個具體實現子類。
1、矩陣排列的方塊:會填滿二維數組的每個數組元素,只是把四周留空即可,
該子類初始化的遊戲界面如下所示:


該子類的代碼如下:cn\oyp\link\board\impl\FullBoard.java

[java] view plaincopy
  1. package cn.oyp.link.board.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import cn.oyp.link.board.AbstractBoard;  
  7. import cn.oyp.link.utils.GameConf;  
  8. import cn.oyp.link.view.Piece;  
  9.   
  10. /** 
  11.  * 創建矩陣分佈的遊戲區域,矩陣排列的方塊會填滿二維數組的每個數組元素,只是把四周留空而已 <br/> 
  12.  * <br/> 
  13.  * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/> 
  14.  */  
  15. public class FullBoard extends AbstractBoard {  
  16.     @Override  
  17.     protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {  
  18.         // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象  
  19.         List<Piece> notNullPieces = new ArrayList<Piece>();  
  20.         for (int i = 1; i < pieces.length - 1; i++) {  
  21.             for (int j = 1; j < pieces[i].length - 1; j++) {  
  22.                 // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,  
  23.                 // 所需要的PieceImage由其父類負責設置。  
  24.                 Piece piece = new Piece(i, j);  
  25.                 // 添加到Piece集合中  
  26.                 notNullPieces.add(piece);  
  27.             }  
  28.         }  
  29.         return notNullPieces;  
  30.     }  
  31. }  


2、豎向排列的方塊:以垂直的空列分隔開,該子類初始化的遊戲界面如下所示:


該子類的代碼如下:cn\oyp\link\board\impl\VerticalBoard.java
[java] view plaincopy
  1. package cn.oyp.link.board.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import cn.oyp.link.board.AbstractBoard;  
  7. import cn.oyp.link.utils.GameConf;  
  8. import cn.oyp.link.view.Piece;  
  9.   
  10. /** 
  11.  * 創建豎的遊戲區域,豎向排列的方塊以垂直的空列分隔開<br/> 
  12.  * <br/> 
  13.  * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/> 
  14.  */  
  15. public class VerticalBoard extends AbstractBoard {  
  16.     @Override  
  17.     protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {  
  18.         // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象  
  19.         List<Piece> notNullPieces = new ArrayList<Piece>();  
  20.         for (int i = 0; i < pieces.length; i++) {  
  21.             for (int j = 0; j < pieces[i].length; j++) {  
  22.                 // 加入判斷, 符合一定條件纔去構造Piece對象, 並加到集合中  
  23.                 if (i % 2 == 0) {  
  24.                     // 如果x能被2整除, 即單數列不會創建方塊  
  25.                     // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,  
  26.                     // 所需要的PieceImage由其父類負責設置。  
  27.                     Piece piece = new Piece(i, j);  
  28.                     // 添加到Piece集合中  
  29.                     notNullPieces.add(piece);  
  30.                 }  
  31.             }  
  32.         }  
  33.         return notNullPieces;  
  34.     }  
  35. }  

3、橫向排列的方塊:以水平的空列分隔開,該子類初始化的遊戲界面如下所示:


該子類的代碼如下:cn\oyp\link\board\impl\HorizontalBoard.java

[java] view plaincopy
  1. package cn.oyp.link.board.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import cn.oyp.link.board.AbstractBoard;  
  7. import cn.oyp.link.utils.GameConf;  
  8. import cn.oyp.link.view.Piece;  
  9.   
  10. /** 
  11.  * 創建橫的遊戲區域 <br/> 
  12.  * <br/> 
  13.  * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/> 
  14.  */  
  15. public class HorizontalBoard extends AbstractBoard {  
  16.     @Override  
  17.     protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {  
  18.         // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象  
  19.         List<Piece> notNullPieces = new ArrayList<Piece>();  
  20.         for (int i = 0; i < pieces.length; i++) {  
  21.             for (int j = 0; j < pieces[i].length; j++) {  
  22.                 // 加入判斷, 符合一定條件纔去構造Piece對象, 並加到集合中  
  23.                 if (j % 2 == 0) {  
  24.                     // 如果x能被2整除, 即單數行不會創建方塊  
  25.                     // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,  
  26.                     // 所需要的PieceImage由其父類負責設置。  
  27.                     Piece piece = new Piece(i, j);  
  28.                     // 添加到Piece集合中  
  29.                     notNullPieces.add(piece);  
  30.                 }  
  31.             }  
  32.         }  
  33.         return notNullPieces;  
  34.     }  
  35. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章