简体   繁体   English

使用不带构造函数参数的对象java

[英]Using an object without constructor parameters java

So basically I'm creating a betting program where Player1, Player2, Player3 etc. are objects and each have five initialized fields of -1, which means there is no bet, yet. 因此,基本上,我正在创建一个下注程序,其中Player1,Player2,Player3等是对象,每个对象都有五个已初始化的字段-1,这意味着还没有下注。

I'm asking the users to input their bet number, (these numbers are integers inside of an array) and they can have up to a maximum of five bets, explaining the five initialized fields of -1. 我要用户输入他们的下注数字(这些数字是数组内部的整数),他们最多可以有五个下注,解释-1的五个初始化字段。

The problem here is I can't seem to find a way to have certain players only input 1 or 2 bets, while another inputs 4 and another 5 for example. 这里的问题是,我似乎无法找到一种方法来让某些玩家仅输入1或2个下注,而另一个输入4和5。 My program forces each user to enter 5 integers EVEN if they refuse to bet 5 times. 我的程序强制每个用户输入5个整数,即使他们拒绝下5次赌注。 Any way I can make this work? 有什么办法可以使我工作?

So here's my driver class: (the other parts of it are irrelevant) 所以这是我的驱动程序类:(其他部分无关紧要)

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("");

And here is my other class for players: 这是我为球员准备的其他课程:

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;

The number1, number2 ... represent the five bets. 数字1,数字2 ...代表五个投注。

Also to clarify, the user can't be asked to input a certain String, int, char whatsoever to let the program know he/she's done inputting their bets. 同样要澄清的是,不会要求用户输入某个String,int,char,以便让程序知道他/她已经完成了他们的输入。 It has to look like this 它必须看起来像这样

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

Follow up of your comment Patrick. 跟进您的评论Patrick。 This is how you'd use Integer.parseInt 这就是您使用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");
    }
    ...

Alternatively, could store the output of keyin.nextLine() into a string and apply parseInt or evaluate it for some "keyword" you wanted like so. 或者,可以将keyin.nextLine()的输出存储到字符串中,然后应用parseInt或为您想要的某些“关键字”对其求值。

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

You'll soon realize how repetitive this who process is. 您很快就会意识到此过程是多么重复。 Therefore, as others have told suggested consider using arrays and for-loops for your task. 因此,正如其他人告诉我们的建议,考虑为您的任务使用数组和for循环。 Like so. 像这样

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");
   }
}
...

So that, instead of number1, number2, number3, number4 ... etc you'll have the first bet in player1Bets[0], second bet in player1Bets[1] ... Much easier to type out, and code. 这样,您将在player1Bets[0], second bet in player1Bets[1] ,而不是number1, number2, number3, number4 ...等player1Bets[0], second bet in player1Bets[1]更容易键入和编码。

Hope things are clear. 希望一切都清楚。

There are many ways you can do that: 您可以通过多种方式执行此操作:

  • Use 1,2,3,4,5 parameters constructors instead if just one with 5 parameter. 如果只有一个带有5个参数,则使用1,2,3,4,5参数构造函数。
  • The better way is to make use of BUilder pattern because later you might need to place more than 5 bets so instead of keep on adding constructors this is a better option. 更好的方法是利用BUilder模式,因为稍后您可能需要下5个以上的赌注,因此与其继续添加构造函数,这是一个更好的选择。
  • You can also make use of variable arguments. 您还可以使用变量参数。 See When do you use varargs in Java? 请参阅何时在Java中使用varargs?
  • Like @immibs said you can also have like a member variable list which you can then add to as many as you want 就像@immibs所说的那样,您还可以拥有一个成员变量列表,然后可以将其添加到任意数量的列表中。

You can always loop your input and designate a certain number for the loop to terminate. 您始终可以循环输入并指定一定的数字以终止循环。 For example; 例如; the bets are 1, 2 and 3 and to stop it from there, the user can input 0 then exit the loop or the program can ask the user everytime whether they wanted to place another bet or not. 下注为1、2和3,然后从那里停止,用户可以输入0,然后退出循环,或者程序每次可以询问用户是否要再次下注。 For example, 例如,

Place Bet: 1 下注:1

Do you want to place another bet? 您要再下注吗? Press 1 for yes and 0 for no 按1表示是,按0表示否

If this question is more on the logic part, then this may help you. 如果这个问题更多地在逻辑部分,那么这可能会对您有所帮助。 I do hope I am of help, I am new here and I tried to answer questions to improve my skills and experience. 我确实希望我能提供帮助,我在这里是新来的,我试图回答一些问题以提高我的技能和经验。 :) :)

You may need " Builder Pattern " if you want to pass multiple parameters and the count of parameters is not fixed. 如果您想传递多个参数并且参数的数量不固定,则可能需要“ Builder Pattern ”。 Please see https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/ for more info about "Builder Pattern". 请参阅https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/了解有关“构建器模式”的更多信息。

Here is an example: 这是一个例子:

If you have a User class with multiple parameters, 如果您的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;
  }
}

Use following way to create a new User instance: 使用以下方式创建新的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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM