基于回合的游戏Java(Stratego)

时间:2016-01-06 18:07:35

标签: java swing

所以我有JXButton[][] array(gridLayout),每个JXButton都有一个图标,一个玩家所属的棋子,并且有mouseListener

我目前正在尝试制作战略游戏(两个玩家 - 我同时处理两个)。 我设置了图标,碎片以及一块物品应该如何移动。

现在我希望轮流播放。

例如,当Player1转身时,我需要所有Players2'件将图标更改为Hidden(hidden.png),反之亦然。 我尝试过这样的事情。

tmp1, tmp2是图标数组

pieceimgsB,R按住隐藏图标

allbuttons是我的JXButton[][] array

    public void makeHidden(int iD){

            if(iD==1){
                for (int i=0;i<8;i++){
                    for(int y=0;y<10;y++){
                        if(allbuttons[i][y].getPlayerID()==iD){
                            tmp1[i][y]=allbuttons[i][y].getIcon();
                            allbuttons[i][y].setIcon(new ImageIcon(pieceimgsB[12]));
                        }
                    }

                }
            }
            else if(iD==2){
                for (int i=0;i<8;i++){
                    for(int y=0;y<10;y++){
                        if(allbuttons[i][y].getPlayerID()==iD){
                            tmp2[i][y]=allbuttons[i][y].getIcon();
                            allbuttons[i][y].setIcon(new ImageIcon(pieceimgsR[12]));
                        }
                    }

                }
            }
        }
 public void restoreHidden(int iD){
        if(iD==1){
            for (int i=0;i<8;i++){
                for(int y=0;y<10;y++){
                    if(allbuttons[i][y].getPlayerID()==iD){

                        allbuttons[i][y].setIcon(tmp1[i][y]);
                    }
                }

            }
        }
        else if(iD==2){
            for (int i=0;i<8;i++){
                for(int y=0;y<10;y++){
                    if(allbuttons[i][y].getPlayerID()==iD){

                        allbuttons[i][y].setIcon(tmp2[i][y]);
                    }
                }

            }
        }
    }

我的想法makeHidden玩家1转身时隐藏了玩家2件。

restoreHidden应该在Players2转动时更改图标。

如果这两种方法看起来不错,我的问题在于如何实现转弯。

我必须说(当我点击一个JXButton,然后点击另一个,那个 片断在板上移动它应该)。我尝试在我的mouseListener中有一个标志,当一个实际移动转弯时,我不能让它轮流工作。 我写了这个:

public void letsPlay(){
        switch (turn){
            case 1: 

                getsb().makeHidden(2);
                //getsb().restoreHidden(1);
                if(getsb().getPlayerMoved()==true){
                    setTurn(2);
                }
                break;
            case 2:

                getsb().makeHidden(1);
                //getsb().restoreHidden(2);
                if(getsb().getPlayerMoved()==true){

                    setTurn(1);
                    //;
                }
                break;
        }

    }

我需要知道这两种方法是否可以根据他们应该做的事情,以及如何让它轮流工作的一些见解。

我应该拥有getPlayerMoved()(在切换案例之外的一段时间内返回mouseListener中的标志)吗?

也许我累了,我没有看到它,但任何见解都会有所帮助。 如果有人需要它,我也可以提供我的mouseListener代码,尽管它有点乱。

1 个答案:

答案 0 :(得分:3)

这似乎是一个XY问题,重点不在于专门管理这样的行为(以及其他固有行为),而是如何设计模块化且易于维护的内容。

我建议您尝试通过思考如何设计游戏和UI结构来解决您的问题。让我们举一个简单的例子:

首先,你有一个游戏片有一个类型和一个播放器,所以你为什么不使用特定的对象类型呢?例如:

class PieceType {
  String name;
  String iconName;
}

class Player {
  String name;
}

class Piece {
  PieceType type;
  Player owner;

class BoardCell {
  Piece piece;
}

然后你肯定需要一个能够管理游戏板的Board课程,例如:

class Board {
  private BoardCell [][] pieces = new Piece[10][10];

  public BoardCell cellAtPiece(int x, int y) { return pieces[x][y]; }
  /* other functions */
}

最后你应该有一个Game类来管理整个事情,例如:

class Game {
  Board board;
  Player[] players = new Player[2];
  Player currentPlayer;

  Player getCurrentPlayer() { return currentPlayer; }
  /* other methods, eg turn advance, check for correct position, eat piece etc */
}

现在你已达到了游戏结构的一个点,你可以考虑一下UI,它应该依赖于Game实例,而不需要额外的输入(和Game甚至不应该知道UI)。您可以扩展JXButton并提供自定义行为,例如:

class BoardButton extends JXButton {
  final private Game game;
  final private BoardCell cell;

  public BoardButton(Game game, int x, int y) { 
    this.game = game;
    this.cell = game.cellAtPiece(x,y);
  }

  public void refreshIcon() {
    if (cell.piece == null) { setIcon(null); }
    else if (cell.piece.owner != game.getCurrentPlayer()) { setIcon(hidden); }
    else setIcon(cell.piece.type.icon);
  }

  /* other utilities, like checking if a piece can be moved from here for current player and such */

介意,我没有直接回答你的问题,但我解释了一些工具,可以很容易地解决你在实施过程中遇到的所有问题。