Как получить сумму двух случайных значений из массива строк в Java?
Я работаю над парной карточной игрой, которая генерирует два случайных значения из массива строк. Я хочу знать, как получить сумму двух случайных значений из массива строк, чтобы определить победителя. вот коды
import java.util.*;
public class Cards {
private String suit;
private String face;
private String[] cardSuits;
private String[] cardFaces;
private Random ran;
public Cards() {
ran = new Random();
cardSuits = new String[] { "of Spade", "of Hearts", "of Diamonds",
"of Clubs" };
cardFaces = new String[] { "Ace", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "Jack", "Queen", "King" };
}
public String setPlayerCardSuit() {
suit = cardSuits[ran.nextInt(4)];
return suit;
}
public String setPlayerCardFace() {
face = cardFaces[ran.nextInt(13)];
return face;
}
public String setPlayerCardSuit2() {
suit = cardSuits[ran.nextInt(4)];
return suit;
}
public String setPlayerCardFace2() {
face = cardFaces[ran.nextInt(13)];
return face;
}
public String setCompCardSuit() {
suit = cardSuits[ran.nextInt(4)];
return suit;
}
public String setCompCardFace() {
face = cardFaces[ran.nextInt(13)];
return face;
}
public String setCompCardSuit2() {
suit = cardSuits[ran.nextInt(4)];
return suit;
}
public String setCompCardFace2() {
face = cardFaces[ran.nextInt(13)];
return face;
}
public void getResults() {
System.out.println("Here are your cards: " + setPlayerCardFace() + " "
+ setPlayerCardSuit() + " and " + setPlayerCardFace2() + " "
+ setPlayerCardSuit2());
}
public void getCompCard() {
System.out.println("Here's the computer's cards: " + setCompCardFace()
+ " " + setCompCardSuit() + " and " + setCompCardFace2() + " "
+ setCompCardSuit2());
}
}
и вот код для проверки класса карт:
import javax.swing.JOptionPane;
public class TestCards {
public static void main(String[] args) {
Cards playerCards = new Cards();
Cards computerCards = new Cards();
int confirm, x = 1;
while (x == 1) {
JOptionPane.showMessageDialog(null,
"Random Card game \nPlease press OK to Start Game",
"Card Pair Game", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(
null,
"Here are your Cards: " + playerCards.setPlayerCardFace()
+ " " + playerCards.setPlayerCardSuit() + " and "
+ playerCards.setPlayerCardFace2() + " "
+ playerCards.setPlayerCardSuit2()
+ "\nThe Computer's Cards are: "
+ computerCards.setCompCardFace() + " "
+ computerCards.setCompCardSuit() + " and "
+ computerCards.setCompCardFace2() + " "
+ computerCards.setCompCardSuit2());
confirm = JOptionPane.showConfirmDialog(null, "Game Ends. Again?",
"Game Over", JOptionPane.YES_NO_OPTION);
if (confirm != JOptionPane.YES_OPTION) {
x = 2;
}
}
}
}
сейчас не хватает кода для определения победителя.
PS: я новичок в программировании на Java.. поэтому, пожалуйста, потерпите меня, если вы видите необычное использование кодов:)
Я попробовал предложение Дилана, но я не могу заставить его работать... вместо этого использовал его идею и добавил этот код в класс Cards.
public int playerValues(){
int temp = 0;
if(face != cardFaces[0] && face != cardFaces[10] && face != cardFaces[11] && face != cardFaces[12]){
temp = Integer.parseInt(face);
}else if(face == cardFaces[0]){
temp = 1;
}else if(face == cardFaces[10]){
temp = 11;
}else if(face == cardFaces[11]){
temp = 12;
}else if(face == cardFaces[12]){
temp = 13;
}
return temp;
}
public int computerValues(){
int temp = 0;
if(face != cardFaces[0] && face != cardFaces[10] && face != cardFaces[11] && face != cardFaces[12]){
temp = Integer.parseInt(face);
}else if(face == cardFaces[0]){
temp = 1;
}else if(face == cardFaces[10]){
temp = 11;
}else if(face == cardFaces[11]){
temp = 12;
}else if(face == cardFaces[12]){
temp = 13;
}
return temp;
}
6 ответов
У вас проблема в том, что не все карты уникальны. Два игрока могут иметь одинаковые карты. Все они могут быть даже одной картой.
Вместо этого вы должны сгенерировать список всех возможных карт. Я предлагаю использовать Card
учебный класс. использование Collections.shuffle
перетасовать их. Таким образом, у всех игроков будут разные карты.
Вам нужны правила для сравнения набора карт. Сначала определите их на английском, а затем переведите в код.
Вы не должны использовать массив строк для хранения граней карты, а массив CardFace, имеющий имя (для отображения) и значение (для вычисления суммы граней). И поскольку существует только 13 значений, это должно быть перечисление:
public enum CardFace {
ACE("Ace, 1),
TWO("2", 2),
...
KINK("King", 13);
private String face;
private int value;
private CardFace(String face, int value) {
this.face = face;
this.value = value;
}
public String getFace() {
return this.face;
}
public int getValue() {
return this.value;
}
}
Мне удалось определить победителя, изменив TestCard
класс вместо отображения двух случайных значений из массива строк. Я изменил его так, что он показывает только одно значение из массива. С этим мне удалось определить, кто победитель.
С использованием String.parseInt()
Метод вернет число в строке. Но у вас будут проблемы с тузом, добром, королевой, джеком, так как они не являются числом. Я бы порекомендовал создать заявление как:
if(!cardFaces[x].equals("Ace")&&!cardFaces[x].equals("Queen")&&!cardFaces[x].equals("King")&&!cardFaces[x].equals("Jack"))
{
int temp = cardFaces[x].parseInt();
}
else if(cardFaces[x].equals("Ace")
{
int temp = 1;
}
else if(cardFaces[x].equals("King") || cardFaces[x].equals("Queen") || cardFaces[x].equals("Jack"))
{
int temp = 10;
Я действительно рекомендую, чтобы ваша Карта была классом или, по крайней мере, перечислением. Тогда их подведение будет иметь смысл.
Также, пожалуйста, объясните эти два
public String setCompCardFace()
public String setCompCardFace2() //identical
Практически все, что вам нужно, чтобы у каждого игрока был экземпляр карт, как вы начали
public class Cards extends ArrayList<Card>
но где-то по пути вы заблудились и смешали этих двоих в один класс, который на самом деле ничего не делает.
так что в вашей карте вы положили эти
public class Card
{
private String suit;
private String face;
public Card(String face, String color)
{
suit = color; this.face = face;
}
@Override
public int compareTo(Card otherCard); //implement this yourself
}
Кажется, никто не говорил о получении комбинаций, поэтому я расскажу об этом здесь. Если есть что-то, что вы не понимаете, не стесняйтесь комментировать здесь.
Стрит-флеш - вам нужна петля.
Во-первых, вы должны отсортировать массив карт игрока по возрастанию (1, 2, 3, 4, 5 и т. Д.). Теперь проверьте с первой записи, самой низкой.
Обратите внимание, что массив карт хранит только значения руки в целых числах.
// Variables to store the current and previous cards.
int previous = 0;
int current = 0;
cards = Arrays.sort(cards); // Sort cards into ascending order
boolean straightFlush = false;
for (i = 0; i < cards.length; i++) {
current = cards[i];
if (!current == cards[0]) { // If current is not the first card, execute the rest. You don't want random errors popping up, do you? :)
// Check if it is the last card - a straight flush would then be present
if (current == cards[cards.length - 1]) {
straightFlush = true;
break;
}
// Checks if current - 1 != previous or the current card is not consecutive to the previous card
if (current - 1 != previous) {
break;
}
}
...
Как сравнить руки тогда? Найдите наибольшее значение среди карт, если это стрит-флеш.
Я скоро опубликую больше об этом.