2014-09-06 3 views
0

Я пытаюсь нарисовать кубики рядом друг с другом, но я не был успешным. Я думаю, что есть лучший способ сделать это, чем с IF. Поэтому, если кто-нибудь знает, как это возможно, я буду благодарен за ваш ответ.Как напечатать 3 кости подряд?

public static void main(String[] args) { 

    int dice1 = 0; 
    int dice2 = 0; 
    int dice3 = 0; 


    dice1 = (int) (Math.random() * 6 + 1); 
    dice2 = (int) (Math.random() * 6 + 1); 
    dice3 = (int) (Math.random() * 6 + 1); 

    if (dice1 == 1) { 
     System.out.println("* * * * *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* * * * *"); 
    } 

    if (dice1 == 2) { 
     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice1 == 3) { 

     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 

    if (dice1 == 4) { 
     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("*  *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 

    if (dice1 == 5) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice1 == 6) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 


    if (dice2 == 1) { 

     System.out.println("* * * * *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* * * * *"); 
    } 

    if (dice2 == 2) { 

     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice2 == 3) { 

     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice2 == 4) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("*  *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice2 == 5) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice2 == 6) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 


    if (dice3 == 1) { 

     System.out.println("* * * * *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* * * * *"); 
    } 

    if (dice3 == 2) { 

     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("*  *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice3 == 3) { 

     System.out.println("* * * * *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice3 == 4) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("*  *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice3 == 5) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
    if (dice3 == 6) { 

     System.out.println("* * * * *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* # # *"); 
     System.out.println("* * * * *"); 
    } 
} 
+0

Btw, вы можете улучшить свой код, используя 'if else', например:' if (dice1 == 1) {...} else if (dice1 == 2) {...} else if (dice1 == 3) {...} 'и т. Д. – pzaenger

+3

Один кубик, несколько кубиков. –

ответ

3

Есть миллион способов, которыми вы могли бы пойти, но я лично поставил бы каждую из кубиков в многомерном массиве. Во-первых, положить каждый умирает в массиве

String[] die1 = new String[]{ 
    "* * * * *", 
    "*  *", 
    "* # *", 
    "*  *", 
    "* * * * *" 
} 

Для каждой строки, вы можете распечатать каждый умереть бок о бок, как этот

System.out.println(die1[0] + " " + die2[0]); // and so on for each of the 5 lines. 

Но вместо die1, die2 и т.д. Я бы поставил каждый из эти массивы в массив больших кубиков, поэтому вы можете легко ссылаться на каждую штамп по индексу (die [0] [0], die [1] [0] и т. д.).

String[][] dice = new String[][]{ 
{ "* * * * *", // Die 1 -> this line is dice[0][0] 
    "*  *", 
    "* # *", 
    "*  *", 
    "* * * * *" 
}, 
{ "* * * * *", // Die 2 
    "* # *", 
    "*  *", 
    "* # *", 
    "* * * * *" 
} 
} 

Теперь печать вашей линии бок о бок так же легко, как:

int roll1 = 2; // Two made 
int roll2 = 5; // up numbers 
/* Note that the index will be one off from the reflected number. 
You may want to subtract 1 from your random number or put a blank die at index 0 
*/ 

for(int x=0; x<dice[roll1].length; x++){ 
    System.out.println(dice[roll1][x] + " " + dice[roll2][x]); 
} 

Таким образом, вы только «рисовать» каждый умирает один раз вместо того, чтобы кости * numberOfRolls; вам не нужна тонна if-elses; и он позволяет печатать кости так, как вы хотите, путем объединения строк.

+0

@DavidWallace: Хорошее редактирование, спасибо – Gary

+0

Мне нравится это решение, потому что он генерирует элегантный код. Это неэффективно? Возможно, для очень большого количества кубиков, но вы можете решить это, обернув его в класс вместо этого. –

+0

Неэффективность, на которую я имел в виду, заключалась в написании целых наборов костей для каждого случайного значения и if-elsing каждого числа. Наверное, это так не читалось. Как классы могут помочь этому экземпляру? – Gary

1

Вы можете создать переменную String для каждой строки кости. вы можете добавить к строковым переменным в зависимости от того, что такое бросок кости и распечатать переменные в конце, , чтобы показать кости рядом друг с другом.

, например:

String ln1=""; 
String ln2=""; 
String ln3=""; 
String ln4=""; 
String ln5=""; 


if (dice1 == 2) { 

    ln1+="* * * * *"; 
    ln2+="* # *"; 
    ln3+="*  *"; 
    ln4+="* # *"; 
    ln5+="* * * * *"; 
} 
else if (dice1 == 3) { 

    ln1+="* * * * *"; 
    ln2+="* # *"; 
    ln3+="* # *"; 
    ln4+="* # *"; 
    ln5+="* * * * *"; 
} 

... 

System.out.println(ln1); 
System.out.println(ln2); 
System.out.println(ln3); 
System.out.println(ln4); 
System.out.println(ln5); 

Надеется, что это помогает.

0

Я сделал это в рамках теста, не удивляйтесь.

Вы хотите что-то вроде этого, не так ли?

* * * * * * * * * * * * * * * 
* # # * * # * * # * 
*  * *  * * # * 
* # # * * # * * # * 
* * * * * * * * * * * * * * * 

Ниже будет работать, он начинается с метода «rollTheDice()» - весело:

private final static String BORDER = "* * * * *"; 
    private final static String LEFT = "* "; 
    private final static String RIGHT = " *"; 
    private final static String NEWLINE = "\n"; 
    private final static String NEXT_DIE = " "; 

    @Test 
    public void doit() { 
     this.rollTheDice(); 
    } 

    private void rollTheDice() { 
     int[] dice = { (int) (Math.random() * 6 + 1), (int) (Math.random() * 6 + 1), (int) (Math.random() * 6 + 1) }; 

     StringBuilder sb = new StringBuilder(); 
     sb.append(BORDER).append(NEXT_DIE).append(BORDER).append(NEXT_DIE).append(BORDER).append(NEWLINE); 
     sb.append(this.createAllRows(dice, Position.TOP)).append(NEWLINE); 
     sb.append(this.createAllRows(dice, Position.MIDDLE)).append(NEWLINE); 
     sb.append(this.createAllRows(dice, Position.BOTTOM)).append(NEWLINE); 
     sb.append(BORDER).append(NEXT_DIE).append(BORDER).append(NEXT_DIE).append(BORDER).append(NEWLINE); 

     System.out.println(sb.toString()); 
    } 

    private enum Position { 
     TOP, MIDDLE, BOTTOM 
    }; 

    private String createAllRows(int[] dice, Position pos) { 
     String rows = ""; 
     for (int die : dice) { 
      rows += this.createSingleRow(die, pos) + NEXT_DIE; 
     } 
     return rows; 
    } 

    private String createSingleRow(int die, Position pos) { 
     String row = LEFT; 
     switch (pos) { 
      case TOP: { 
       row += handleTop(die); 
       break; 
      } 
      case MIDDLE: { 
       row += handleMiddle(die); 
       break; 
      } 
      case BOTTOM: 
      default: { 
       row += handleBottom(die); 
      } 
     } 

     return row + RIGHT; 
    } 

    private String handleTop(int die) { 
     switch (die) { 
      case 1: 
       return " "; 
      case 2: 
       return " #"; 
      case 3: 
       return " #"; 
      case 4: 
       return "# #"; 
      case 5: 
       return "# #"; 
      case 6: 
      default: 
       return "# #"; 
     } 
    } 

    private String handleMiddle(int die) { 
     switch (die) { 
      case 1: 
       return " # "; 
      case 2: 
       return " "; 
      case 3: 
       return " # "; 
      case 4: 
       return " "; 
      case 5: 
       return " # "; 
      case 6: 
      default: 
       return "# #"; 
     } 
    } 

    private String handleBottom(int die) { 
     switch (die) { 
      case 1: 
       return " "; 
      case 2: 
       return "# "; 
      case 3: 
       return "# "; 
      case 4: 
       return "# #"; 
      case 5: 
       return "# #"; 
      case 6: 
      default: 
       return "# #"; 
     } 
    } 
0

Я не могу за жизнь мне понять, почему вы хотели бы сделать набор кубиков в консоли, вместо того, чтобы просто записать его с номером: System.out.println("Dice1: " + dice1);

Но я буду кусать. Создайте новый файл класса с именем Die и скопируйте следующий код в новый файл.

public class Die{ 
    public int value; 
    Random r = new Random(); 

    public Die(){ 
     roll(); 
    } 

    public void roll(){ 
     value = r.nextInt(6) + 1; 
    } 

    public String retrieveOneLineOfDrawing(int linenumber){ 
     switch(value){ 
      case 1: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "*  *"; 
        case 3: return "* # *"; 
        case 4: return "*  *"; 
        case 5: return "* * * * *"; 
        default: return "* * * * *"; 
       } 
      case 2: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "* # *"; 
        case 3: return "*  *"; 
        case 4: return "* # *"; 
        case 5: return "* * * * *"; 
        default: return "* * * * *"; 
       } 
      case 3: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "* # *"; 
        case 3: return "* # *"; 
        case 4: return "* # *"; 
        case 5: return "* * * * *"; 
        default: return "* * * * *"; 
       } 
      case 4: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "* # # *"; 
        case 3: return "*  *"; 
        case 4: return "* # # *"; 
        case 5: return "* * * * *"; 

        default: return "* * * * *"; 
       } 
      case 5: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "* # # *"; 
        case 3: return "* # *"; 
        case 4: return "* # # *"; 
        case 5: return "* * * * *"; 

        default: return "* * * * *"; 
       } 
      case 6: 
       switch(linenumber){ 
        case 1: return "* * * * *"; 
        case 2: return "* # # *"; 
        case 3: return "* # # *"; 
        case 4: return "* # # *"; 
        case 5: return "* * * * *"; 

        default: return "* * * * *"; 
       } 

      default: return "* * * * *"; 
     } 
    } 
} 

STOP! Теперь удалите все из своего «public static void main (String [] args) {» и используйте это вместо этого.

public static void main(String[] args) { 
    Die[] dice = new Die[3]; 
    dice[0] = new Die(); 
    dice[1] = new Die(); 
    dice[2] = new Die(); 
    int numberOfLinesInDrawings = 5; 
    String s = ""; 

    for(int i = 1; i < numberOfLinesInDrawings+1; i++){ 
     for(int j = 0; j < dice.length; j++){ 
      s += dice[j].retrieveOneLineOfDrawing(i); 
      if(j < dice.length - 1) s += "\t\t"; 
     } 
     if(i < numberOfLinesInDrawings) s += "\n"; 
    } 
    System.out.println(s); 
} 

Это дает вам возможность увеличить количество линий на ваших рисунках, чтобы вы могли увеличить их размер. Тем не менее, все они должны иметь равное количество строк. В этом коде нет реальной обработки ошибок. Если номер numberOfLinesInDrawings не соответствует всем 6 рисункам, вы можете получить исключение.

Если вы можете использовать StringBuilder, то сделать это вместо:

public static void main(String[] args) { 
    Die[] dice = new Die[3]; 
    dice[0] = new Die(); 
    dice[1] = new Die(); 
    dice[2] = new Die(); 
    int numberOfLinesInDrawings = 5; 
    StringBuilder sb = new StringBuilder(); 

    for(int i = 1; i < numberOfLinesInDrawings+1; i++){ 
     for(int j = 0; j < dice.length; j++){ 
      sb.append(dice[j].retrieveOneLineOfDrawing(i)); 
      if(j < dice.length - 1) sb.append("\t\t"); 
     } 
     if(i < numberOfLinesInDrawings) sb.append("\n"); 
    } 

    System.out.println(sb); 
} 

StringBuilder является гораздо более эффективным, чем обычный Струнный-конкатенации (+ =).

EDIT: Извините, что решение не работает для начала. У меня не было возможности проверить, когда я это написал, и, к сожалению, было несколько ошибок. Теперь они исправлены.

+0

Просто отредактирован для ужасной ошибки. –

+0

Вы проверили этот средний фрагмент? Это чуть ниже слова «СТОП»? –

+0

Хм, этот средний сниппет вообще не работает, ха-ха. Просто посмотрел на него, увидев ваш комментарий и сразу увидел его. Я просто удалю его. Нет времени, чтобы исправить это. –

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