2015-12-12 2 views
0

Это мой первый раз с помощью этого сайта, чтобы не идти тяжело на менякарты перетасовать в GridLayout, когда я нажимаю на кнопку в сетке

Я пытаюсь сделать свою собственную карточную игру и в игре , карты помещаются в 6 x 9 gridlayout. Все остальное, что я могу обработать, но есть одна особенность в игре, в которой у меня возникают проблемы, и если я смогу заставить ее работать, я закончу. Это для моего окончательного проекта, и это должно быть примерно через 5 дней.

Я пытаюсь перетащить карты, когда пользователь нажимает на карту White Joker. Когда этот Белый Джокер щелкнут, карты с открытыми карточками и другие покерные карты, с которыми сталкиваются, тоже перетасовываются. Мне не нужны никакие дубликаты карт в сетке

Чтобы быть более явным, я покажу свою проблему визуально, потому что то, что я пытаюсь сделать, сложно объяснить словами, а также сложно сделать код для него.

Когда пользователь нажимает на одну или несколько лицевых карт, это '; что-то вроде этого: When cards are clicked Image

Когда щелкнул белый джокер, он был перетасован, и я не хочу, чтобы он перетасовался. Я хочу, чтобы все остальное было перетасовано, пока Белый Джокер остается в этом месте. When White Joker is clicked Image

Вот мой код метода тасования. Ниже я хочу, чтобы этот метод перетасовал JButtons, но не White Joker. Белый Joker один должен остаться

public JButton[] whiteJokerShuffle(JButton[] button) 
{ 
    //shuffles using fisher yates shuffle BUT ONLY White Joker does not  
    //shuffle 
    //FIX THISSSSSSSSSSSSSSSSSSSSSSS 
    Random rand = new Random(); 
    int randomCard; 
    JButton randomValue; 

    for (int i = 0; i<button.length; i++) 
    { 
     randomCard = rand.nextInt(button.length); 
     //can't find a way to check for White Joker and make it stay 

     randomValue = button[randomCard]; 

     button[randomCard] = button[i]; 
     button[i] = randomValue; 

    } 
    return button; 
} 

И снова я не хочу видеть повторяющиеся карты покер, когда я перетасовать карты и нажмите на кнопку. я продолжаю делать, что происходит каждый раз, когда я пытаюсь, и я не знаю, как это исправить, так вот мой другой код, который создает рамку и материал:

import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.GridLayout; 

/** 
* 
* @author elngo 
*/ 
public class GameFrame extends JFrame { 

private final int FRAME_WIDTH = 900; 
private final int FRAME_HEIGHT = 730; 
private int _attempts = 0; 

private GridLayout _buttonMatrix; 
private ImageIcon _image; 
private ImageIcon _faceDownImage; 
private JButton[] _button; 
private ActionListener _listener; 
private JPanel _gridPanel; 


private JOptionPane _introduction; //this pops up BEFORE the gamem starts 
private JOptionPane _endGameResult; //this ONLY pops up when the game ENDS 

//using the Cards class 
private Cards _cards; 
private String[] _pokerDeck; 

private JButton _whiteJoker; 

final int GRID_ROWS = 6; 
final int GRID_COLUMNS = 9; 

//Constructor 
/** 
* 
*/ 
public GameFrame() 
{ 
    frameComponents(); 
    setSize(FRAME_WIDTH, FRAME_HEIGHT); 
} 

/** 
* 
*/ 
private void frameComponents() 
{ 
    _cards = new Cards(); //invokes Cards class 
    String[] faceDown = _cards.getFaceDown(); 
    _pokerDeck = _cards.getPokerDeck(); 


    //makes a matrix of JButtons 
    _button = new JButton[_pokerDeck.length]; 
    _gridPanel = new JPanel(_buttonMatrix = new GridLayout(GRID_ROWS, GRID_COLUMNS)); 


    _listener = new ClickListener(); 

    //places FACE DOWN cards in the 6x9 grid first 
    for (int i = 0; i<faceDown.length; i++) 
    { 
     _faceDownImage = new ImageIcon(faceDown[i]); 

     _gridPanel.add(_button[i] = new JButton(_faceDownImage)); //adds to grid 

     _button[i].addActionListener(_listener); 
    } 
    add(_gridPanel); 
    //shuffle poker cards 

    //comment this randomizer out UNTIL I find a way to make WhiteJoker work 
    //_cards.shuffleDeck(_pokerDeck); 
} 

public class ClickListener implements ActionListener{ 


@Override 
/** 
* 
*/ 
public void actionPerformed(ActionEvent event) 
{ 

    for (int i=0; i<_button.length; i++) 
    { 
     if (event.getSource() == _button[i]) 
     { 
      _image = new ImageIcon(_pokerDeck[i]); 

      _button[i].setIcon(_image); 

      _attempts++; 
      System.out.println("Attempts: " + _attempts); //delete later 


      //***THE WHITE JOKER SHUFFLE PROBLEM STARTS HERE*** 
      if (_pokerDeck[i] == "WJ.png") //if White Joker clicked 
      { 
      //FIX THISSSSSSSSSSSSSSSsssSSSSSSSSSssssSs 
      System.out.println("White Joker found"); //delete later 

      //save off Joker Spot so iterate through _buttonMatrix 
      String whiteJoker = _pokerDeck[i]; 

      for (int j = 0; j<_button.length; j++) 
      { 
       if (_button[j] != null) 
       { 
        //***THE SHUFFLE METHOD I SHOWED IS USED BELOW*** 
        _cards.whiteJokerShuffle(_button); 
       } 

      } 
      _gridPanel.removeAll(); 
      for (JButton button : _button) 
      { 
       _gridPanel.add(button); 
      } 
      _gridPanel.revalidate(); 
      _gridPanel.repaint(); 
      } 
     //***PROBLEM STOPS HERE*** 

мне действительно нужна помощь по этому вопросу. Только эта сложная проблема, и как только она будет решена, я буду убирать свой код, и я закончу.

+0

Несколько общих советов: (1) Не используйте символы подчеркивания ('_') в именах переменных Java, если они не являются константами. (2) Не переустанавливайте размер рамки. Мой экран не имеет высоты 730 пикселей. Пусть менеджер компоновки рассчитает размер. – user1803551

+0

"* не может найти способ проверить White Joker и заставить его оставаться *« У вас есть доступ к кнопкам, представляющим карты, почему вы не можете читать с кнопок какие карты они показывают? – user1803551

ответ

0

Вы можете реализовать измененную версию Fisher–Yates shuffle (или modern version, предназначенные для использования компьютера, который был введен Ричардом Durstenfeld в 1964 году и популяризировал Дональда Кнута):

  1. Когда Белый Joker должен быть перетасован, вы оставите его на том же месте.
  2. Когда одна из других карт должна быть перетасована, вы убедитесь, что она не обменивается с Белым Джокер.

В методе actionPerformed вы перебираете все кнопки, а затем обнаруживаете, что нажата кнопка «Белый джокер». Переменная цикла i содержит индекс белого джокера, который вы не хотите изменять. Это значение может быть передано модифицированному методу тасования.

Чтобы сохранить пример ниже Короче говоря, я прошел массив строк (вместо кнопки) и определяется индекс Белого Джокера внутри метода в случайном порядке:

import java.util.*; 

public class GameFrame { 
    private static final String WHITE_JOKER_CODE = "*W"; 

    public static void main(String[] arguments) { 
     String[] originalCards = {"5H", "5C", "6S", WHITE_JOKER_CODE, "7S", "KD"}; 
     System.out.println("Original cards: " + Arrays.toString(originalCards)); 

     String[] shuffledCards = new GameFrame().whiteJokerShuffle(originalCards); 

     System.out.println("Shuffled cards: " + Arrays.toString(shuffledCards)); 
    } 

    // Uses the modern version of the Fisher–Yates shuffle, designed for computer use, 
    // as introduced by Richard Durstenfeld in 1964 and popularized by Donald E. Knuth. 
    // https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm 
    public String[] whiteJokerShuffle(String[] cards) 
    { 
     int whiteJokerIndex = Arrays.asList(cards).indexOf(WHITE_JOKER_CODE); 
     Random randomNumbers = new Random(); 

     for (int cardIndex = cards.length - 1; cardIndex > 0; cardIndex--) 
     { 
      if (cardIndex != whiteJokerIndex) { 
       // The upper bound is normally one higher than cardIndex, but it is 
       // lowered by one when the white joker is in the range (to "hide" it). 
       boolean hideJoker = cardIndex > whiteJokerIndex; 
       int upperBound = cardIndex + (hideJoker ? 0 : 1); 
       int swapIndex = randomNumbers.nextInt(upperBound); 

       if (swapIndex == whiteJokerIndex) { 
        swapIndex++; 
       } 

       // Swap the cards on indices swapIndex and cardIndex. 
       String swapCard = cards[swapIndex]; 
       cards[swapIndex] = cards[cardIndex]; 
       cards[cardIndex] = swapCard; 
      } 
     } 

     return cards; 
    } 
}