Создайте класс для карточной игры "WAR", когда у меня будет готов класс водителя - PullRequest
0 голосов
/ 27 ноября 2018

Направления для задания являются: Запрограммировать игру войны.На войне, если ценность вашей карты больше, чем у карты вашего оппонента, вы зарабатываете одно очко.Если карта вашего оппонента больше вашей карты, ваш оппонент получает очко.Если вы связываете это война!Это означает, что следующая рука стоит 2 очка.Если это еще одна ничья, то следующая рука стоит 4 очка, и вы продолжаете добавлять 2, пока ничья не будет разорвана.Затем оценка возвращается к нормальной.

1) Вы должны использовать свой класс карт, чтобы получить 2 игральных карты.

2) Спросите пользователя, сколько раундов они хотели бы сыграть.

3) Есть цикл, чтобы поймать, если они вводят отрицательное количество раундов.

4) Завершить программу, если они хотят сыграть 0 раундов.

5) Распечатать пользователямашина и карта компьютера для каждого раунда.

6) Распечатайте правильный счет после каждого раунда.

7) Тузы НИЗКИЕ (стоит 1 балл).

8) После завершения всех раундов распечатайте сообщение, которое сообщит пользователю, выиграл он, проиграл или сыграл вничью.

У меня готов класс драйвера (см. Ниже).Мне нужна помощь в создании класса, который будет делать вещи, указанные выше.После каждого раунда он должен попросить пользователя нажать Enter, чтобы перейти к следующему раунду.Вот мой код класса водителя, он предоставляет номер карты и масть.

public class Cards
{

    private int A;
    private int B;
    private String c;
    private String b;

    public Cards()
    {    
         getSuit();
         getCardName();
         suit();
         name();
    }

    public int getSuit()
    {
        A = (int) (Math.random()*4+1); //rolls a number between 1 and 4
        return A;
    }

    public int getCardName()
    {
        B = (int) (Math.random()*13+1); //rolls a number between 1 and 13
        return B;
    }

    public String suit()
    {
        if (A == 1)  b = "Hearts";
        else if (A == 2) b = "Diamonds";
        else if (A == 3) b = "Clubs";
        else  b = "Spades";

        return b;
    }

    public String name()
    {
        if (B == 1)  c = "Ace";
        else if (B == 2) c = "2";
        else if (B == 3) c = "3";
        else if (B == 4) c = "4";
        else if (B == 5) c = "5";
        else if (B == 6) c = "6";
        else if (B == 7) c = "7";
        else if (B == 8) c = "8";
        else if (B == 9) c = "9";
        else if (B == 10) c = "10";
        else if (B == 11) c = "Jack";
        else if (B == 12) c = "Queen";
        else  c = "King";

        return c;
    }

    public String toString()
    {
        return c + " of " + b;
    }
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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

  • Имена переменных A / B / c / b не дают никакого представления о том, что они представляют.Мне остается угадать, что это такое, поскольку комментариев тоже нет.
  • getSuit () и getCardName () вызывают побочных эффектов. Вызов getCardName () вызывает номер картыизменить.Это не очень хорошо, поскольку большинство разработчиков ожидают, что метод getter не изменит объект.Например, следующий код будет довольно запутанным:

    card.name();   // "Ace"
    card.name();   // "Ace" 
    card.getCardName();  // 10. Should be 1???
    card.name();   // "10". Huh?
    
    • Вероятно, было бы лучше просто установить масть и номер карты в конструкторе.По крайней мере, установите методы private.

    • Методы suit () и name () возвращают строку.Нет необходимости сохранять значение в полях класса b и c, кроме случаев, когда вы используете их в методе toString (), который можно просто переписать так:

      return name() + " of " + suit();
      

      Это уменьшит ваше дублированиеdata.

    • Вы можете подумать о том, чтобы генерировать (и хранить!) свои карты в цикле, а не в случайном порядке, поскольку в настоящее время оба игрока могут взять одну и ту же карту.Хотя это может не соответствовать требованиям, я не ожидал бы, что оба игрока будут брать одну и ту же карту в войне.

    • getCardName () назван плохо.getCardValue () может быть лучше, но, как указано выше, оно не должно изменять текущее значение.
0 голосов
/ 27 ноября 2018

У меня написан класс, он должен выглядеть примерно так:

import java.util.Scanner;

public class WarGame extends Cards {
    public static void main(String args[]) {
        boolean playing = true;
        int myScore = 0;
        int oppsScore = 0;
        int round = 0;
        int increment = 1;
        while (playing) {
            Scanner scan = new Scanner(System.in);
            int input = scan.nextInt();
            if (input == 0 || input < 0)
            {
                System.out.println("INVALID ROUND NUMBER ENTERED!");
                playing = false;
            }
            while (round <= input)
            {
                Cards myCard = new Cards();
                Cards oppsCard = new Cards();
                System.out.println("You have the " + myCard.toString());
                System.out.println("The computer has the " + oppsCard.toString());
                if (myCard.getSuit() > oppsCard.getSuit())
                {
                    myScore += 1;
                }
                else if (oppsCard.getSuit() > myCard.getSuit())
                {
                    oppsScore += 1;
                }
                else
                {
                    increment *= 2;
                    System.out.println("WAR!!!!");
                }
                System.out.println("Your score: " + myScore);
                System.out.println("Computer's score: " + oppsScore);
            }
        }
        if (myScore > oppsScore) {
            System.out.println("You win!");
        } else if (myScore < oppsScore) {
            System.out.println("You lose!");
        } else {
            System.out.println("It's a tie!");
        }
    }
}
...