2015-04-16 3 views
0

Я начинаю с java и пытаюсь сделать игру Yahtzee, и мне нужно взять случайный бросок кубика в виде массива из метода void. Может ли кто-нибудь объяснить мне, почему это не работает?Как я могу отобразить массив из метода void?

import java.util.Arrays; 

public class YatzeeGame { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int[] diceRolls = new int[5]; 
    diceRolls = throwDice(diceRolls); 
    System.out.println(display(diceRolls)); 
} 

public static void throwDice(int [] dice) {  
    int [] roll = {(int)(Math.random()*6+1), 
      (int)(Math.random()*6+1),(int)(Math.random()*6+1), 
      (int)(Math.random()*6+1),(int)(Math.random()*6+1), 
      (int)(Math.random()*6+1)}; 
    dice = roll; 
} 

public static String display(int [] dice) { 
    String str = Arrays.toString(dice); 
    str = str.replace("[", ""); 
    str = str.replace("]", ""); 
    str = str.replace("," , " "); 
    return str; 
} 
+3

Пустота означает «ничего не возвращает» по определение. Вы уверены, что должны получить свои кубики из метода пустоты? – Thomas

+0

Ну, мои инструкции гласят: «Метод throwDice (int [] dice) принимает целочисленный массив и устанавливает значение этого массива в 5 случайных значений матрицы. Он ничего не возвращает». Как я могу использовать это, чтобы установить diceRolls в случайные значения? – shiff

+0

Когда вы передаете массив, вы передаете ссылку на него. Любые изменения внутри массива в этом методе существуют после его удаления. – Compass

ответ

2

Они хотят, чтобы вы заменить массив, который не произойдет, если вы просто назначить Это. Обратите внимание, что возвращение массива по-прежнему считается лучшим способом. Extra хитрая: в существующем коде вы сделаете один массив размером 5, а другой размер 6. Так как вы вызываете его zahtzee мы будем использовать 5.

public static void throwDice(int [] dice) {  
    for (int x = 0; x < 5; x++) 
     dice[x] = (int)(Math.random()*6+1); 
} 
1

Объяснение того, почему он не работает:

То, что вы пытаетесь сделать: Изменить кости (параметр вы прошли в) равным катиться. По сути, (если я не ошибаюсь здесь), вы пытаетесь изменить diceRolls с помощью throwDice.

Что вы на самом деле делаете: вы прошли в diceRolls и сказали «здесь, назовем это кости». Затем, в конце вашей функции, вы, по существу, сказали, что «кости больше не означают diceRolls. Теперь кости - это бросок». Это означает, что diceRolls все еще не изменился.

Вам необходимо изменить фактические значения dice вместо того, чтобы менять, что такое кости. например:

public static void throwDice(int[] dice) { 
    // change the actual values of dice, instead of changing dice 
    dice[0] = (int) (Math.random() * 6 + 1); 
    dice[1] = (int) (Math.random() * 6 + 1); 
    dice[2] = (int) (Math.random() * 6 + 1); 
    dice[3] = (int) (Math.random() * 6 + 1); 
    dice[4] = (int) (Math.random() * 6 + 1); 
} 
1

Там довольно мало вещей неправильно в вашем коде.

В методе throwDicedice является локальной переменной, поэтому ее изменение на roll, что является другой локальной переменной, не влияет ни на что вне этого метода.

Также ваш тип возврата - void, поэтому вы не можете установить какую-либо переменную с помощью метода.

Вы могли бы иметь метод, который возвращает int[]:

public static int[] throwDice() { 
    int[] roll = new int[6]; 
    for (int i = 0; i < 6; i++) { 
     roll[i] = (int) (Math.random() * 6) + 1; 
    } 
    return roll; 
} 

Затем используйте это нравится:

int[] diceRolls = throwDice(); 
Смежные вопросы