扫雷的设计模式

Design patterns for minesweeper

我正在尝试使用设计模式创建扫雷游戏,但我在为扫雷游戏中的图块实现创建模式时遇到了问题。

在扫雷游戏中,有两种类型的方块,数字方块和地雷方块。数字牌包含一个数字或空白,具体取决于旁边地雷牌的数量。虽然地雷图块包含要加载到图块上的地雷图像。

我的方法是尝试对图块使用工厂方法,这是 java 中的示例。

摘要class

public abstract class Tile {
    boolean flag = false;
    boolean opened = false;

    abstract void open();

    void flag(){
        // business logic
    }

    boolean checkFlagged(){
        return flag;
    }

    boolean checkOpened(){
        return opened;
    }
}

NumberTile class

public class NumberTile extends Tile {
    int number;

    @Override
    void open(){
        // business logic
    }
    
    void setNumber(int number){
        this.number = number;
    }

    int getNumber(){
        return number;
    }
}

The MinesTile class

public class MinesTile extends Tile {
    ImageIcon mineImg;

    @Override
    void open(){
        // business logic
        explode();
    }
    
    void explode(){
        // tell main board to end game
    }
    
}

客户代码

Tile numberTile = new NumberTile(); // get and setNumber method will not be accesible
Tile minesTile  = new MinesTile();  // explode method will not be accesible

如何使用相同的抽象 Tile 数据类型而不使子 class 方法不可访问?

如果我将 NumberTileMinesTile 中的所有方法抽象为抽象 class,那么它们还必须重写不会被使用并导致拒绝的方法遗赠。

如何解决这个设计模式问题?

你无法真正解决这个问题,我不确定你尝试实现的确切设计模式,因为有很多变体。但实现这一目标的唯一方法是铸造。

Tile someTile = new NumberTile();

if(someTile instanceof NumberTile){
    NumberTile numberTile = (NumberTile) someTile;
    numberTile.getNumber();
}