Domanda

Ho un problema con l'ordine dei giocatori. Ho bisogno che il primo giocatore sia il vincitore del round. Quindi ho, quattro pulsanti, c'è qualche possibilità di bloccare la mossa del giocatore errato, qualcosa come "non è il tuo turno, il giocatore due è il primo perché è il vincitore del round precedente"

Come posso controllarlo? Alla fine un metodo da verificare

Ho quattro etichette per le carte e cinque carte in mano per ogni giocatore

Per ogni pulsante, impostare la scheda corrispondente che faccio

//PLAYER1
    //card1 
    ActionListener one = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (gr.getCounter1() < 5) {
                gr.setCounter1(gr.getCounter1() + 1);
                test1.setIcon(play1a);
                pn1.setText(Integer.toString(play2a));
                pn5.setText(play3a);
                pn50.setText(play4a);
            } else {
                pn5.setText("No more cards");
            }
        }
    };

    arraybtn[1].addActionListener(one);
    arraybtn[1].setPreferredSize(new Dimension(120, 20));

    play1a = gr.GameRules1().getImage(); //image of card
    play2a = gr.GameRules2(); // value
    play3a = gr.GameRules3(); // king of hearts for exemple
    play4a = gr.GameRules4(); // hearts

    arraybtn[1].setText(gr.GameRules3()); // button name
È stato utile?

Soluzione

Quante lezioni ha il tuo programma? Spero che abbia un modello non GUI che guida la GUI e dovrebbe essere lo stesso modello che impone il controllo del gioco. Piuttosto che lanciare un errore come suggerito da un poster in questo thread, userei il modello di controller di gioco consentire solo al giocatore corretto di giocare. La GUI rifletterebbe questo disabilitando tutti i pulsanti che non dovrebbero essere spinti e consentendo solo quelli che dovrebbero essere spinti. Il modo in cui questo è implementato nel codice dipende dal codice del programma attuale e dalla struttura generale.

Modifica: aggiunta alla risposta

Non sono sicuro che tu sia ancora in giro, ma ecco un esempio rapidamente schiaffeggiato di ciò che intendevo. La classe di gameplayer rappresenta (ovviamente) un giocatore del gioco e ha un campo, myTurn che è vero solo se è il turno di quel giocatore, e questo campo ha un metodo setmyturn (booleano) associato e un metodo booleano ismyturn ().

La classe Gamemodel ha una serie di gameplayer chiamato giocatori, un metodo getplayer (int) che consente ad altre classi di ottenere ogni giocatore nell'array, un playerturnindex che rappresenta l'indice nell'array del giocatore il cui turno è attualmente e un avanzamento di Advance ( ) metodo che incrementa questo indice (modificato dalla lunghezza dell'array dei giocatori in modo che si avvolga) e quindi attraversa l'array dei giocatori che impostano i campi MyTurn per ciascun giocatore a seconda del valore di PlayerTurnIndex.

La classe GameGui aveva un campo Gamemodel chiamato GameModel e detiene una raccolta di jButton (in realtà un hashmap) e nel metodo ActionPectformd di ciascun pulsante, viene chiamato il metodo Advanceplay () del modello e un metodo privato chiamato abilitPlayerturns () viene chiamato che abilita o Disabili Il giocatore JButtons a seconda del valore del giocatore corrispondente nel modello:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

public class GamePlayMain {
    private static void createAndShowUI() {
        String[] players = {"John", "Bill", "Frank", "Henry"};
        GameModel model = new GameModel(players);
        GameGui gui = new GameGui(model);

        JFrame frame = new JFrame("GamePlayMain");
        frame.getContentPane().add(gui);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

class GamePlayer {
    private String name;
    private boolean myTurn = false;

    public GamePlayer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean isMyTurn() {
        return myTurn;
    }

    public void setMyTurn(boolean myTurn) {
        this.myTurn = myTurn;
    }

    @Override
    public String toString() {
        return name;
    }
}

class GameModel {
    private String[] playerNames;
    private GamePlayer[] players;
    private int playerTurnIndex = 0;

    public GameModel(String[] playerNames) {
        this.playerNames = playerNames;
        players = new GamePlayer[playerNames.length];
        for (int i = 0; i < playerNames.length; i++) {
            players[i] = new GamePlayer(playerNames[i]);
        }
        players[0].setMyTurn(true);
    }

    public int getPlayerTurnIndex() {
        return playerTurnIndex;
    }

    public GamePlayer getCurrentPlayer() {
        return players[playerTurnIndex];
    }

    public String[] getPlayerNames() {
        return playerNames;
    }

    public void advancePlay() {
        playerTurnIndex++;
        playerTurnIndex %= players.length;
        for (GamePlayer player : players) {
            if (player != getCurrentPlayer()) {
                player.setMyTurn(false);
            } else {
                player.setMyTurn(true);
            }
        }
    }

    public int getPlayerCount() {
        return players.length;
    }

    public GamePlayer getPlayer(int i) {
        return players[i];
    }

}

@SuppressWarnings("serial")
class GameGui extends JPanel {
    private GameModel gameModel;
    private JTextArea textArea = new JTextArea(14, 30);
    private Map<GamePlayer, JButton> playerButtonMap = new HashMap<GamePlayer, JButton>();

    public GameGui(GameModel gameModel) {
        this.gameModel = gameModel;

        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
        for (int i = 0; i < gameModel.getPlayerCount(); i++) {
            GamePlayer player = gameModel.getPlayer(i);
            JButton playerButton = new JButton(player.getName());
            playerButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    playerButtonActionPerformed(e);
                }
            });
            buttonPanel.add(playerButton);
            playerButtonMap.put(player, playerButton);
        }

        textArea.setEditable(false);
        textArea.setFocusable(false);

        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setLayout(new BorderLayout(5, 5));
        add(buttonPanel, BorderLayout.NORTH);
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        add(scrollPane, BorderLayout.CENTER);

        enablePlayerTurns();
    }

    private void playerButtonActionPerformed(ActionEvent e) {
        GamePlayer currentPlayer = gameModel.getCurrentPlayer();

        // TODO: have player "play"
        textArea.append("Player " + currentPlayer + " has just played\n");
        gameModel.advancePlay();
        enablePlayerTurns();

        currentPlayer = gameModel.getCurrentPlayer();
        textArea.append("It is now player " + currentPlayer + "'s turn\n");
    }

    private void enablePlayerTurns() {
        for (int i = 0; i < gameModel.getPlayerCount(); i++) {
            GamePlayer player = gameModel.getPlayer(i);
            JButton playerButton = playerButtonMap.get(player);
            playerButton.setEnabled(player.isMyTurn());
            if (player.isMyTurn()) {
                playerButton.requestFocusInWindow();
            }
        }
    }

}

Altri suggerimenti

Quando viene eseguita l'azione:

if (whatever.getTurn() != thisPlayer) 
  error
else
  run normally

Abbastanza diretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top