對於遊戲玩家而言,遊戲界面上看到的“元素”千變萬化;但是對於遊戲開發者而言,遊戲界面上的元素在底層都是一些數據,不同數據所繪製的圖片有所差異而已。因此建立遊戲的狀態數據模型是實現遊戲邏輯的重要步驟。
1、定義數據模型
2、初始化遊戲狀態數據
- package cn.oyp.link.board;
- import java.util.List;
- import cn.oyp.link.utils.GameConf;
- import cn.oyp.link.utils.ImageUtil;
- import cn.oyp.link.view.Piece;
- import cn.oyp.link.view.PieceImage;
- /**
- * 遊戲區域的抽象類 <br/>
- * <br/>
- * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/>
- */
- public abstract class AbstractBoard {
- // 定義一個抽象方法, 讓子類去實現
- /**
- * 創建一個List集合,該集合裏面存放初始化遊戲時所需的Piece對象
- */
- protected abstract List<Piece> createPieces(GameConf config,
- Piece[][] pieces);
- /**
- * 返回Piece數組
- * @param config
- * @return
- */
- public Piece[][] create(GameConf config) {
- // 創建Piece[][]數組
- Piece[][] pieces = new Piece[config.getXSize()][config.getYSize()];
- // 返回非空的Piece集合, 該集合由子類去創建
- List<Piece> notNullPieces = createPieces(config, pieces);
- // 根據非空Piece對象的集合的大小來取圖片
- List<PieceImage> playImages = ImageUtil.getPlayImages(
- config.getContext(), notNullPieces.size());
- // 所有圖片的寬、高都是相同的
- int imageWidth = playImages.get(0).getImage().getWidth();
- int imageHeight = playImages.get(0).getImage().getHeight();
- // 遍歷非空的Piece集合
- for (int i = 0; i < notNullPieces.size(); i++) {
- // 依次獲取每個Piece對象
- Piece piece = notNullPieces.get(i);
- piece.setPieceImage(playImages.get(i));
- // 計算每個方塊左上角的X、Y座標
- piece.setBeginX(piece.getIndexX() * imageWidth
- + config.getBeginImageX());
- piece.setBeginY(piece.getIndexY() * imageHeight
- + config.getBeginImageY());
- // 將該方塊對象放入方塊數組的相應位置處
- pieces[piece.getIndexX()][piece.getIndexY()] = piece;
- }
- return pieces;
- }
- }
下面介紹該AbstraceBoard的3個具體實現子類。
- package cn.oyp.link.board.impl;
- import java.util.ArrayList;
- import java.util.List;
- import cn.oyp.link.board.AbstractBoard;
- import cn.oyp.link.utils.GameConf;
- import cn.oyp.link.view.Piece;
- /**
- * 創建矩陣分佈的遊戲區域,矩陣排列的方塊會填滿二維數組的每個數組元素,只是把四周留空而已 <br/>
- * <br/>
- * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/>
- */
- public class FullBoard extends AbstractBoard {
- @Override
- protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {
- // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象
- List<Piece> notNullPieces = new ArrayList<Piece>();
- for (int i = 1; i < pieces.length - 1; i++) {
- for (int j = 1; j < pieces[i].length - 1; j++) {
- // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,
- // 所需要的PieceImage由其父類負責設置。
- Piece piece = new Piece(i, j);
- // 添加到Piece集合中
- notNullPieces.add(piece);
- }
- }
- return notNullPieces;
- }
- }
- package cn.oyp.link.board.impl;
- import java.util.ArrayList;
- import java.util.List;
- import cn.oyp.link.board.AbstractBoard;
- import cn.oyp.link.utils.GameConf;
- import cn.oyp.link.view.Piece;
- /**
- * 創建豎的遊戲區域,豎向排列的方塊以垂直的空列分隔開<br/>
- * <br/>
- * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/>
- */
- public class VerticalBoard extends AbstractBoard {
- @Override
- protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {
- // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象
- List<Piece> notNullPieces = new ArrayList<Piece>();
- for (int i = 0; i < pieces.length; i++) {
- for (int j = 0; j < pieces[i].length; j++) {
- // 加入判斷, 符合一定條件纔去構造Piece對象, 並加到集合中
- if (i % 2 == 0) {
- // 如果x能被2整除, 即單數列不會創建方塊
- // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,
- // 所需要的PieceImage由其父類負責設置。
- Piece piece = new Piece(i, j);
- // 添加到Piece集合中
- notNullPieces.add(piece);
- }
- }
- }
- return notNullPieces;
- }
- }
3、橫向排列的方塊:以水平的空列分隔開,該子類初始化的遊戲界面如下所示:
- package cn.oyp.link.board.impl;
- import java.util.ArrayList;
- import java.util.List;
- import cn.oyp.link.board.AbstractBoard;
- import cn.oyp.link.utils.GameConf;
- import cn.oyp.link.view.Piece;
- /**
- * 創建橫的遊戲區域 <br/>
- * <br/>
- * 關於本代碼介紹可以參考一下博客: <a href="http://blog.csdn.net/ouyang_peng">歐陽鵬的CSDN博客</a> <br/>
- */
- public class HorizontalBoard extends AbstractBoard {
- @Override
- protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {
- // 創建一個Piece集合, 該集合裏面存放初始化遊戲時所需的Piece對象
- List<Piece> notNullPieces = new ArrayList<Piece>();
- for (int i = 0; i < pieces.length; i++) {
- for (int j = 0; j < pieces[i].length; j++) {
- // 加入判斷, 符合一定條件纔去構造Piece對象, 並加到集合中
- if (j % 2 == 0) {
- // 如果x能被2整除, 即單數行不會創建方塊
- // 先構造一個Piece對象, 只設置它在Piece[][]數組中的索引值,
- // 所需要的PieceImage由其父類負責設置。
- Piece piece = new Piece(i, j);
- // 添加到Piece集合中
- notNullPieces.add(piece);
- }
- }
- }
- return notNullPieces;
- }
- }