2016-01-06 65 views
0

所以我有JXButton[][] array(gridLayout),每個JXButton都有一個圖標,一個片段,哪個玩家屬於哪個,並且有一個mouseListenerTurn Based Game Java(Stratego)

我目前正在嘗試使戰略遊戲(兩個球員,我處理兩者)。 我設置了圖標,棋子和一塊棋子應該如何移動。

現在我想讓它輪流發揮。

例如,當玩家1轉動時,我需要所有玩家2的棋子將圖標更改爲隱藏(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 Player2件隱藏其Players1轉彎時。

restoreHidden應該在玩家2轉身時改回圖標。

如果這兩種方法看起來不錯,那麼我的問題在於如何實現輪流。我必須說(當我點擊一個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代碼,儘管它有點混亂。

+2

那麼你的問題到底是什麼?請閱讀「[我怎麼問一個好問題?](http://stackoverflow.com/help/how-to-ask)」 – Andreas

+0

你知道的事實「*它有點混亂*」是一個信號,如果可能的話,最好稍事休息一下,重新回到問題中,儘量做到最好 - 在做出改變之前,只需「完成工作,無論多麼糟糕」它完成了任務「 – DoubleDouble

回答

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,它應該依賴於沒有t的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 */ 

介意,我沒有直接回答你的問題,但我解釋了一些工具,這將使其能夠很容易地連同所有的問題解決了,你可以在實施中找到。

+0

我很抱歉,我沒有添加這個。我實際上根據你所說的做了一切。代碼的第一部分實際上是在我的Board類中。其中我的View是在我的MVC模型中。 letsPlay()我試圖在Controller類中實現它。 我承認我在三者之間澄清了一些問題。 – GKoo

+0

我應該改變我的問題,如果它可能處理根據查看(董事會)的變化變化? – GKoo