порядок игрока в карточной игре - PullRequest
1 голос
/ 02 февраля 2011

У меня проблема с порядком игроков. Мне нужно, чтобы первый игрок был победителем раунда. Итак, у меня есть четыре кнопки, есть возможность заблокировать ход неверного игрока, что-то вроде «не твой ход, второй игрок - первый, потому что победитель предыдущего раунда»

как я могу это контролировать? в конце концов метод проверки

у меня есть четыре метки для карт и пять карт в руке для каждого игрока

для каждой кнопки, установите соответствующую карту, которую я делаю

//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

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Сколько классов в вашей программе?Надеемся, что у него есть модель без графического интерфейса, которая управляет графическим интерфейсом, и именно эта модель должна определять управление игровым процессом.Вместо того, чтобы выдавать ошибку, как предложил один из постеров в этой теме, я бы использовал модель игрового контроллера, позволяющую играть только нужному игроку.GUI будет отражать это, отключая все кнопки, которые не следует нажимать, и включая только те, которые должны быть нажаты.То, как это реализовано в коде, зависит от кода вашей текущей программы и общей структуры.

edit: дополнение к ответу

Не уверен, что вы все еще рядом, но вот пример быстрого соединенияо том, что я имел в виду.Класс GamePlayer представляет (очевидно) игрока в игре и имеет поле myTurn, которое имеет значение true, только если это ход этого игрока, и у этого поля есть связанный метод void setMyTurn (boolean) и логический метод isMyTurn ().

Класс GameModel имеет массив GamePlayer, называемый Players, метод getPlayer (int), который позволяет другим классам получать каждого Player в массиве, playerTurnIndex, который представляет индекс в массиве игрока, чей ход он в настоящее время делаетis и метод advancePlay (), который увеличивает этот индекс (изменяет его на длину массива игроков, чтобы он обернулся), а затем проходит по массиву игроков, устанавливая поля myTurn для каждого игрока в зависимости от значения playerTurnIndex.

Класс GameGui имел поле GameModel с именем gameModel и содержит коллекцию JButtons (фактически HashMap), и в методе ActionPerformed каждой кнопки вызывается метод advancePlay () модели и вызывается закрытый метод enablePlayerTurns ()который включает или отключает кнопки игрока в зависимости от значения соответствующего игрока в модели:

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();
            }
        }
    }

}
1 голос
/ 02 февраля 2011

Когда действие выполнено:

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

Довольно просто.

...