所以我有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
代码,尽管它有点乱。
答案 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 */
介意,我没有直接回答你的问题,但我解释了一些工具,可以很容易地解决你在实施过程中遇到的所有问题。