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
соответственно облегчит модульное тестирование.