String[] Сравнение переменных массива

Я пишу код, который смутно имитирует игру в покер, которая на этом этапе должна выводить «Руку игрока», «Руку оппонента» и «Флоп».

Каждая карта должна появляться только один раз (это означает, что одинаковые карты не должны выдаваться).

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

Как-то это не работает так, как должно. А именно, мои операторы if(stringArr[x]==stringArr[y]) не сравнивают значения String, как я хочу.

Что мне не хватает?

<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

      // meine = mine, gegner = opponent (German = English)

import java.util.Random;

public class PokerGame 
{
    public static void main(String[] args)
    {
        int cards = 2; // Texas Hold em is played with 2 cards
        int flopCards = 3;  // Texas Hold em has 2 cards on the flop

        String meine = dealer(cards);
        String gegner = dealer(cards);
        String flop = dealer(flopCards);

        String[] meineArr = meine.split(" ");
        String[] gegnerArr = gegner.split(" ");
        String[] flopArr = flop.split(" ");

        
        if( 
            meineArr[0]!=meineArr[1] &&
             meineArr[0]!=gegnerArr[0] && 
             meineArr[0]!=gegnerArr[1] && 
             meineArr[1]!=gegnerArr[1] && 
             meineArr[1]!=gegnerArr[0] &&
                flopArr[0]!=flopArr[1] && 
                 meineArr[0]!=flopArr[0] && 
                 meineArr[0]!=flopArr[1] && 
                 meineArr[1]!=flopArr[1] && 
                 meineArr[1]!=flopArr[0] &&
                    gegnerArr[0]!=gegnerArr[1] &&
                     gegnerArr[0]!=flopArr[0] &&
                     gegnerArr[0]!=flopArr[1] &&
                     gegnerArr[1]!=flopArr[1] &&
                     gegnerArr[1]!=flopArr[0] &&
                     gegnerArr[0]!=flopArr[2] &&
                     gegnerArr[1]!=flopArr[2] &&
                            flopArr[0]!=flopArr[1] &&
                            flopArr[0]!=flopArr[2] &&
                            flopArr[1]!=flopArr[2] &&
                            flopArr[2]!=flopArr[1] &&
                            flopArr[2]!=flopArr[0]
                        )
        {
                  System.out.println("Your Hand:        "
                                    + meine + "\n\n"+ "Opponent's Hand: " 
                                    +gegner+ "\n\n"+ "FLOP:                 "+flop);
        }else {
            while(meineArr[0]==meineArr[1] ||
                   meineArr[0]==gegnerArr[0] || 
                   meineArr[0]==gegnerArr[1] || 
                   meineArr[1]==gegnerArr[1] || 
                   meineArr[1]==gegnerArr[0] ||
                        flopArr[0]==flopArr[1] || 
                         meineArr[0]==flopArr[0] || 
                         meineArr[0]==flopArr[1] || 
                         meineArr[1]==flopArr[1] || 
                         meineArr[1]==flopArr[0] ||
                            gegnerArr[0]==gegnerArr[0] || 
                             gegnerArr[0]==flopArr[0] || 
                             gegnerArr[0]==flopArr[1] || 
                             gegnerArr[1]==flopArr[1] || 
                             gegnerArr[1]==flopArr[0] ||
                             gegnerArr[0]==flopArr[2] ||
                             gegnerArr[1]==flopArr[2] ||
                                    flopArr[0]==flopArr[1] ||
                                    flopArr[0]==flopArr[2] ||
                                    flopArr[1]==flopArr[2] ||
                                    flopArr[2]==flopArr[1] ||
                                    flopArr[2]==flopArr[0]){

                        gegner = dealer(cards);
                        gegnerArr = gegner.split(" ");

                        System.out.println("Your Hand:      "
                                    + meine + "\n\n"+ "Opponent's Hand: " 
                                    +gegner+ "\n\n"+ "FLOP:                 "+flop);
                        
            }

        }
        System.out.println("\n\n\n"+legend());
    }

    static String legend(){
        String legend = "A = Ace        h = hearts \n"
                       +"K = King       c = clubs\n"
                       +"Q = Queen      d = diomonds\n"
                       +"J = Jack       s = spades\n"
                       +"T = 10";
        return legend;
    }

    static String dealer(int len)
    {
        String value = "23456789TQJKA";
        String face = "hcds";
        
        Random rand = new Random();
        
        char[] handvalue = new char[len];
        char[] handface = new char[len];

        int index = 0;

        String generatedHand = "";

        for (int i = 0; i < len; i++) 
        {
            handvalue[i] = value.charAt(rand.nextInt(value.length()));
            generatedHand += handvalue[i];
            for (int j = 0; j < 1;j++ ){     
                handface[i] = face.charAt(rand.nextInt(face.length()));
                generatedHand += handface[i];
            }
            generatedHand += " ";
        }
   
        return generatedHand;
    }

    
}

Я безуспешно пытался поиграть с условными операторами. Я подозреваю, что проблема заключается где-то в сравнении между сохраненными значениями String (картами) в содержащих их StringArrays.

2 ответа

Ваша попытка найти карту в колоде немного неуклюжа.

          String[] meineArr = meine.split(" ");
    String[] gegnerArr = gegner.split(" ");
    String[] flopArr = flop.split(" ");

    
    if( 
        meineArr[0]!=meineArr[1] &&
         meineArr[0]!=gegnerArr[0] && 
         meineArr[0]!=gegnerArr[1] && 
         meineArr[1]!=gegnerArr[1] && 
         meineArr[1]!=gegnerArr[0] &&
  • Имейте в виду, что сравнение строк не будет работать должным образом, используя==/!=. Вам придется бежать.equals().

  • Вместо того, чтобы делать так много одиночных сравнений в строках кода, используйте циклы:

    Строковая карта = meineArr[0]; for (String other: gegnerArr) { if (card.equals(other)) { // мы снова нашли ту же карту? } }

  • Но поскольку вы храните колоду в виде строки, и ваши карты перечислены там, поиск карты может быть таким же простым, как

    Строковая карта = meineArr[0];if (gegner.contains(card)) { // мы снова нашли ту же карту?}

Как предложил ваш комментатор, получите представление о колоде карт , затем перетасуйте их каким-либо способом по вашему выбору (который слабо моделирует реальный мир); следующее должно позволить вам получить перетасованную колоду карт:

      import java.util.Random;

static String[] VALUES = "Ace 2 3 4 5 6 7 8 9 10 Jack Queen King".split(" ");

static String[] SUITS = "Hearts Clubs Diamonds Spades".split(" ");

static int[] newDeck() {
  int[] cards = new int[52];
  for (int i = 0; i < cards.length; i++) {
    cards[i] = i+1;
  }
  return cards;
}

static void shuffle(long seed, int[] cards) {
  System.err.printf("Shuffling deck with seed: %d", seed);
  Random rand = new Random(seed);
  for (int i = 0; i < cards.length; i++) {
    int j = rand.nextInt(cards.length);
    int k = rand.nextInt(cards.length);
    int card = cards[k];
    cards[k] = cards[j];
    cards[j] = card;
  }
}

static String repr(int card) {
  return String.format("%s of %s", VALUES[(card - 1) % VALUES.length], SUITS[(card - 1) % SUITS.length]);
}

Попытка это вjshell:

      long seed = new Random().nextLong();
int[] cards = newDeck();
shuffle(seed, cards);
shuffle(seed, cards);
cards;

cards = newDeck();
shuffle(seed, cards);
shuffle(seed, cards);
cards;

seed = new Random().nextLong();
cards = newDeck();
shuffle(seed, cards);
shuffle(seed, cards);
cards;

seed = -2556576281960593300L;
cards = newDeck();
shuffle(seed, cards);
shuffle(seed, cards);
cards;

Итак, у вас есть колодаcardsтеперь раздайте их, последовательно просматривая массив карточек, скажем, с индексомi:

      repr(cards[i]) // ==> "Ace of Diamonds" if cards[i] == 27

Ключевым моментом здесь является использованиеjava.util.Randomперетасовать; с использованиемseedсоответственно облегчит модульное тестирование.

Другие вопросы по тегам