gpt4 book ai didi

java - Java回合制游戏(Stratego)

转载 作者:行者123 更新时间:2023-12-01 21:54:13 24 4
gpt4 key购买 nike

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

我目前正在尝试制作策略游戏(两名玩家 - 我负责两者)。我设置了图标、棋子以及棋子如何正确移动。

现在我想让它轮流播放。

例如,当玩家 1 回合时,我需要所有玩家 2 的棋子将图标更改为隐藏(hidden.png),反之亦然。我已经尝试过类似的事情。

tmp1, tmp2 是图标数组

pieceimgsB,R 按住隐藏图标

allbuttons 是我的 JXButton[][] 数组

    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时,玩家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() (它会在 switch case 之外的一段时间内返回 mouseListener 中的标志)?

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

最佳答案

这似乎是一个 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 实例,而不需要额外的输入(并且 游戏甚至不应该知道用户界面)。您可以扩展 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 */

请注意,我没有直接回答您的问题,但我解释了一些可以轻松解决问题的工具以及您在实现过程中可能发现的所有问题。

关于java - Java回合制游戏(Stratego),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34639786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com