2015-02-11 2 views
1

Так что в основном я создаю программу ставок, где Player1, Player2, Player3 и т. Д. Являются объектами, и каждый из них имеет пять инициализированных полей -1, что означает, что ставки еще не установлены.Использование объекта без параметров конструктора java

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

Проблема в том, что я не могу найти способ заставить некоторых игроков вводить только 1 или 2 ставки, в то время как другие входы 4 и еще 5, например. Моя программа заставляет каждого пользователя вводить 5 целых чисел EVEN, если они отказываются делать ставки 5 раз. В любом случае я могу сделать эту работу?

Так вот мой класс драйвера: (другая его часть не имеет значение)

System.out.println("Wheel : 0-32-15-19-4-21-2-25-17-34-6-27-13-36-11-30-8-23-10-5-24-16-33-1-20-14-31-9-22-18-29-7-28-12-35-3-26"); 
     System.out.println("Dealer…Place your bets"); 

     // initializing the six players of the game 

     Player player1 = new Player(-1,-1,-1,-1,-1); 
     System.out.println("Player 1: "); 
      int number1 = keyin.nextInt(); 
      int number2 = keyin.nextInt(); 
      int number3 = keyin.nextInt(); 
      int number4 = keyin.nextInt(); 
      int number5 = keyin.nextInt(); 
       System.out.println(""); 

     Player player2 = new Player(-1, -1, -1, -1, -1); 
     System.out.println("Player 2: "); 
      number1 = keyin.nextInt(); 
      number2 = keyin.nextInt(); 
      number3 = keyin.nextInt(); 
      number4 = keyin.nextInt(); 
      number5 = keyin.nextInt(); 
       System.out.println(""); 

     Player player3 = new Player(-1, -1, -1, -1, -1); 
     System.out.println("Player 3: "); 
      number1 = keyin.nextInt(); 
      number2 = keyin.nextInt(); 
      number3 = keyin.nextInt(); 
      number4 = keyin.nextInt(); 
      number5 = keyin.nextInt(); 
       System.out.println(""); 

     Player player4 = new Player(-1, -1, -1, -1, -1); 
      System.out.println("Player 4: "); 
      number1 = keyin.nextInt(); 
      number2 = keyin.nextInt(); 
      number3 = keyin.nextInt(); 
      number4 = keyin.nextInt(); 
      number5 = keyin.nextInt(); 
       System.out.println(""); 

     Player player5 = new Player(-1, -1, -1, -1, -1); 
      System.out.println("Player 5: "); 
      number1 = keyin.nextInt(); 
      number2 = keyin.nextInt(); 
      number3 = keyin.nextInt(); 
      number4 = keyin.nextInt(); 
      number5 = keyin.nextInt(); 
       System.out.println(""); 

     Player player6 = new Player(-1, -1, -1, -1, -1); 
      System.out.println("Player 6: "); 
      number1 = keyin.nextInt(); 
      number2 = keyin.nextInt(); 
      number3 = keyin.nextInt(); 
      number4 = keyin.nextInt(); 
      number5 = keyin.nextInt(); 
       System.out.println(""); 

А вот мой другой класс для игроков:

public class Player { 

int number1; 
int number2; 
int number3; 
int number4; 
int number5; 
// constructor for each player at the table 
public Player(int number1, int number2, int number3, int number4, int number5) { 

    this.number1 = number1; 
    this.number2 = number2; 
    this.number3 = number3; 
    this.number4 = number4; 
    this.number5 = number5; 

number1, number2 ... представляет пять ставок.

Также, чтобы уточнить, пользователю не может быть предложено ввести определенный символ String, int, char, чтобы программа знала, что он/она выполнил ввод своих ставок. Он должен выглядеть следующим образом

Player 1: 12 13 15 
Player 2: 0 5 4 
+2

Вы уже узнали о списках? (или массивы) – immibis

+0

@immibis Да У меня есть – X1XX

+0

Предполагая, что keyin является «java.util.Scanner Object», программа всегда запрашивает пять чисел, потому что вы заставляете программу запрашивать пять чисел. Вместо 'nextInt()' делать 'nextLine()' и анализировать строку в integer с помощью 'Integer.parseInt()', если вход в 'nextLine()' является только '\ n' (return key), предположим, что он не делайте ставки и переходите к следующему игроку. Или установите, что вы являетесь собственным соглашением, например, если пользователь вводит «больше не» или что-то в этом роде. Затем сопоставьте свой ввод с ним на каждом входе. – anu

ответ

2

Последующий вверх ваш комментарий Патрик. Это, как вы будете использовать Integer.parseInt

...  
Player player2 = new Player(-1, -1, -1, -1, -1); 
System.out.println("Player 2: "); 
try { 
       number1 = Integer.parseInt(keyin.nextLine()); 
       number2 = Integer.parseInt(keyin.nextLine()); 
       number3 = Integer.parseInt(keyin.nextLine()); 
       number4 = Integer.parseInt(keyin.nextLine()); 
       number5 = Integer.parseInt(keyin.nextLine()); 
       System.out.println(""); 
    } 
    //Code will go to this block when user entered something other than integers 
    catch(NumberFormatException e) { 
     System.out.println("Done accepting bets from player2"); 
    } 
    ... 

В качестве альтернативы, может хранить выход keyin.nextLine() в строку и применить ParseInt или оценить его для некоторых «ключевых слов» вы хотите, как это.

String keyedinString = keyin.nextLine(); 
if(keyinString.equalsIgnoreCase("done betting") { 
    throw new Exception(); 
} 

Вы скоро поймете, насколько повторяется этот процесс. Поэтому, как говорили другие, рекомендуется использовать массивы и for-loops для вашей задачи. Вот так.

int[] player1Bets = new int[5]; 
for(int i=0;i<5;i++) { 
    try { 
     player1Bets[i] = Integer.parseInt(keyin.nextLine()); 
    } 
    catch(NumberFormatException e) { 
     System.out.println("Player1 took" + i + "bets. he is done betting"); 
    } 
} 
... 

Так что, вместо того, чтобы number1, number2, number3, number4 ... и т.д. вы будете иметь первую ставку в player1Bets[0], second bet in player1Bets[1] ... Намного проще впечатать, и код.

Надеюсь, что все ясно.

+0

Спасибо! Btw Я реализовал ваш код выше, с массивом и try-catch, но по какой-то причине тот же SOP продолжает появляться, хотя мой улов для каждого игрока отличается? – X1XX

+0

SOP? Пожалуйста, объясни ? – anu

+0

System.out.println @anu – X1XX

0

Есть много способов, вы можете сделать это:

  • Используйте 1,2,3,4,5 параметры Конструкторы вместо этого, если только один с 5 параметром.
  • Лучше всего использовать шаблон BUilder, потому что позже вам может понадобиться разместить более 5 ставок, поэтому вместо добавления конструкторов это лучший вариант.
  • Вы также можете использовать переменные аргументы. См When do you use varargs in Java?
  • Как @immibs сказал, что вы также можете иметь как список переменных-членов, которые вы можете добавить в столько, сколько вы хотите
+0

На самом деле пять ставок - максимально допустимое число! Но спасибо за ответ – X1XX

+0

Да, но я только что привел пример, который позже представит игрокам возможность сделать 6 или более ставок. – Kode

0

Вы можете всегда цикл ввода и назначить определенное количество для цикла в прекратить. Например; ставки 1, 2 и 3 и остановить его оттуда, пользователь может ввести 0, затем выйти из цикла или программа может каждый раз спрашивать пользователя, хотят ли они разместить другую ставку или нет. Например,

Место Bet: 1

Вы хотите разместить еще одну ставку? Нажмите 1 для да и 0 для нет

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

0

Возможно, вам понадобится «Builder Pattern», если вы хотите передать несколько параметров и количество параметров не определено. Пожалуйста, см. https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/ для получения дополнительной информации о «Pattern Builder».

Вот пример:

Если у вас есть User класс с несколькими параметрами,

public class User { 
    private final String firstName; // required 
    private final String lastName; // required 
    private final int age; // optional 
    private final String phone; // optional 
    private final String address; // optional 

    public static class UserBuilder { 
    private final String firstName; 
    private final String lastName; 
    private int age; 
    private String phone; 
    private String address; 
    public UserBuilder(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
    public UserBuilder withAge(int age) { 
     this.age = age; 
     return this; 
    } 
    public UserBuilder withPhone(String phone) { 
     this.phone = phone; 
     return this; 
    } 
    public UserBuilder withAddress(String address) { 
     this.address = address; 
     return this; 
    } 
    public User build() { 
     // if(age < 0) { ... } return new User(this); 
     // not thread-safe, a second thread may modify the value of age 
     User user = new User(this); 
     if (user.getAge() < 0) { 
     throw new IllegalStateException("Age out of range!"); // thread-safe 
     } 
     return user; 
    } 
    } 

    private User(UserBuilder builder) { 
    this.firstName = builder.firstName; 
    this.lastName = builder.lastName; 
    this.age = builder.age; 
    this.phone = builder.phone; 
    this.address = builder.address; 
    } 

    public String getFirstName() { 
    return firstName; 
    } 
    public String getLastName() { 
    return lastName; 
    } 
    public int getAge() { 
    return age; 
    } 
    public String getPhone() { 
    return phone; 
    } 
    public String getAddress() { 
    return address; 
    } 
} 

Используйте следующий способ создания нового User экземпляра:

User user1 = new User.UserBuilder("Jhon", "Doe") 
        .withAge(30) 
        .withPhone("1234567") 
        .withAddress("Fake address 1234") 
        // maybe more parameters 
        .build(); 
User user2 = new User.UserBuilder("Tom", "Jerry") 
        .withAge(28) 
        // maybe more parameters 
        .build(); 
Смежные вопросы