2013-10-08 4 views
0

Я пытаюсь сделать простую программу для костей, которая принимает пользовательский ввод для количества сторон и количества костей, которые они хотят катить, и выводит рулон для каждой кости. Я включил цикл while, который позволяет пользователю перезапустить одинаковое количество костей с одинаковым количеством сторон без необходимости повторного ввода информации, которую они ранее вводили. Проблема, с которой я сталкиваюсь, - это не повторение риса, когда я вызываю метод «q» в выражении «if» цикла while. Совет ?:Второй вызов метода не будет excute (java)

import java.util.Random; 
    import java.util.Scanner; 

    public class Choice_Dice { 
static int t = 0, sides, c=0, d =0; 
public static void main(String [] Mack){ 
    Scanner scan = new Scanner(System.in); 
    String y ="y"; 
    System.out.println("You may roll a dice with any number of sides"); 
    System.out.println("Enter the number of sides you would like to the dice to have: "); 
    sides = scan.nextInt(); 
    System.out.println("Enter the number of dice you want to roll: "); 
    t = scan.nextInt(); 
    q(); 
    while(y.equals("y")) 
    { 
     System.out.println("Would you like to roll again(y or n): "); 
     y = scan.next(); 
     if(y.equals("y")){ 
      q(); 
     } 
     else 
      System.out.println("Thanks"); 
    } 
} 
public static void q() 
{ 
    int[] x = new int[t]; 
    c = 0; 
    while(c != t) 
    { 
     x[c] = roll(sides); 
     c++; 
    } 
    while(d != t) 
    { 
     System.out.println("You rolled " + x[d]); 
     d++; 
    } 
} 
public static int roll(int s) 
{ 
    Random generator = new Random(); 
    int dice = 0; 
    dice = generator.nextInt(4) + 1; 
    return dice; 
} 

}

+0

Вы должны сбросить 'd'. Кроме того, вы никогда не используете «стороны». Используйте его вместо жесткого кодирования '4'. –

+0

Если это настоящие имена ваших методов/переменных, пожалуйста, серьезно передумайте переименовать их в более самоопределяющийся способ. – ssantos

+0

Извините за переменные, плохо переименуйте их очень быстро. Также спасибо за определение этого жесткого кода. –

ответ

0

Это сводится к использованию вами d. Вы запомнили сброс значения c, но не d.

public static void q() 
{ 
    // Init variables 
    int[] x = new int[t]; 
    c = 0; 
    d = 0; 

    while(c != t) 
    { 
     x[c] = roll(sides); 
     c++; 
    } 
    while(d != t) 
    { 
     System.out.println("You rolled " + x[d]); 
     d++; 
    } 
} 

Там нет никаких оснований, что c и d должны быть статическим переменным класс. Вместо этого, вы должны просто объявить их прямо в вызове метода, как вы делаете с x:

public static void q() 
{ 
    // Init variables 
    int[] x = new int[t]; 
    int c = 0; 
    int d = 0; 

    while(c != t) 
    { 
     x[c] = roll(sides); 
     c++; 
    } 
    while(d != t) 
    { 
     System.out.println("You rolled " + x[d]); 
     d++; 
    } 
} 
+0

Прекрасно работает! –

0

Проблема с

while(d != t) 
{ 
    System.out.println("You rolled " + x[d]); 
    d++; 
} 

Вы увеличиваете d, скажем, 4, все время печати рулоны. Когда этот метод заканчивается, ваш цикл while вступает в игру, и вы вводите "y". Когда метод снова вызван, d имеет значение 4, почему t также имеет значение 4 так d == t. Вам необходимо сбросить его или использовать правильный цикл for для повторения.

Гадкий способ был бы сделать

public static void q() 
{ 
    int[] x = new int[t]; 
    c = 0; 
    while(c != t) 
    { 
     x[c] = roll(sides); 
     c++; 
    } 
    while(d != t) 
    { 
     System.out.println("You rolled " + x[d]); 
     d++; 
    } 
    d = 0; 
} 

Хорошеньким способом был бы

public static void q() 
{ 
    int[] x = new int[t]; 

    for (int i = 0; i < x.length ; i++) { 
     x[i] = roll(sides); 
     System.out.println("You rolled " + x[i]); 

    } 
} 

Итак, теперь вы избавитесь от x и cstatic переменных. Вы также можете избавиться от t с помощью простого рефакторинга.


Вы не используете sides.

+0

Исправлена ​​проблема с сайтами, спасибо за обнаружение этого –

+0

@BarryBambiFaust Добро пожаловать. Вы должны попытаться использовать переменные 'static' как можно меньше. –

0

Вы пытаетесь эту логику для случая, в то время как петля

while(true) 
{ 
    System.out.println("You may roll a dice with any number of sides"); 
    System.out.println("Enter the number of sides you would like to the dice to have: "); 
    sides = scan.nextInt(); 
    System.out.println("Enter the number of dice you want to roll: "); 
    t = scan.nextInt(); 
    q(); 

    System.out.println("Would you like to roll again(y or n): "); 
    y = scan.next(); 
    if(y.equals("n")){ 

     System.out.println("Thanks"); 
     break; 
    } 


} 

Также проверьте логику метода д(): Вам необходимо сбросить значения там

+0

Спасибо! Я ранее не знал о команде break, я должен буду использовать это в будущем. –

+0

Добро пожаловать –

Смежные вопросы