2013-02-10 3 views
0

OK У меня есть игра для скалы, бумаги, ножниц. Все, кроме Q, прекращают работу. Поскольку мой сканер принимает только целые числа, как я могу передать ему строку «Q». Я бы предположил, что я просто добавлю простой if(string.equals("Q") {break;} во время цикла, и я буду в порядке. Дайте мне знать, что вы думаете.Как разобрать строку как целое

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

public class RockPaperScissors 
{ 

    /** 
    * (Insert a brief description that describes the purpose of this method) 
    * 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     int compint; 
     String usermove = ""; 
     String compmove = ""; 
     String winner = ""; 
     int count = 0; 
     int input=0; 


     Scanner in = new Scanner(System.in); 
     Random gen = new Random(); 

     System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
     input=in.nextInt(); 
     while (count < 3) 
     { 
      compint = gen.nextInt(3) + 1; 

      if (input == 1) 
      { 
       usermove = "Rock"; 
      } 
      else if (input == 2) 
      { 
       usermove = "Paper"; 
      } 
      else if (input == 3) 
      { 
       usermove = "Scissors"; 
      } 

      if (compint == 1) 
      { 
       compmove = "Rock"; 
      } 
      else if (compint == 2) 
      { 
       compmove = "Paper"; 
      } 
      else if (compint == 3) 
      { 
       compmove = "Scissors"; 
      } 

      if (compint == input) 
      { 
       winner = "TIE"; 
      } 
      else if (compint == 1 && input == 3) 
      { 
       winner = "COMPUTER"; 
      } 
      else if (compint == 2 && input == 1) 
      { 
       winner = "COMPUTER"; 
      } 
      else if (compint == 3 && input == 2) 
      { 
       winner = "COMPUTER"; 
      } 
      else 
      { 
       winner = "USER"; 
      } 

      System.out.print("Computer: " + compmove + " | "); 
      System.out.print("You: " + usermove + " | "); 
      System.out.println("Winner: " + winner); 
      System.out.println(); 
      count++; 
      System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
      input = in.nextInt(); 


     } 
    } 
} 
+2

Использовать 'input = in.next()' (изменение ввода в 'String'), проверить, если' input.equalsIgnoreCase («Q»), если нет, попробуйте согласовать значение с 'int', используя' Integer.parseInt (вход) '. Это вызовет «NumberFormatException», которое вы должны поймать и напомнить пользователю только ввести допустимые значения. – MadProgrammer

ответ

1

Этот код работает для меня:

package com.sandbox; 

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

public class Sandbox { 

    /** 
    * (Insert a brief description that describes the purpose of this method) 
    * 
    * @param args 
    */ 
    public static void main(String[] args) { 
     int compint; 
     String usermove = ""; 
     String compmove = ""; 
     String winner = ""; 
     int count = 0; 
     String rawInput = null; 
     int input = 0; 


     Scanner in = new Scanner(System.in); 
     Random gen = new Random(); 

     System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
     rawInput = in.next(); 
     if ("Q".equals(rawInput)) { 
      return;  //exit main 
     } 
     input = Integer.parseInt(rawInput); 

     while (count < 3) { 
      compint = gen.nextInt(3) + 1; 

      if (input == 1) { 
       usermove = "Rock"; 
      } else if (input == 2) { 
       usermove = "Paper"; 
      } else if (input == 3) { 
       usermove = "Scissors"; 
      } 

      if (compint == 1) { 
       compmove = "Rock"; 
      } else if (compint == 2) { 
       compmove = "Paper"; 
      } else if (compint == 3) { 
       compmove = "Scissors"; 
      } 

      if (compint == input) { 
       winner = "TIE"; 
      } else if (compint == 1 && input == 3) { 
       winner = "COMPUTER"; 
      } else if (compint == 2 && input == 1) { 
       winner = "COMPUTER"; 
      } else if (compint == 3 && input == 2) { 
       winner = "COMPUTER"; 
      } else { 
       winner = "USER"; 
      } 

      System.out.print("Computer: " + compmove + " | "); 
      System.out.print("You: " + usermove + " | "); 
      System.out.println("Winner: " + winner); 
      System.out.println(); 
      count++; 
      System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
      input = in.nextInt(); 


     } 
    } 
} 

Что я делаю принимает входной сигнал в виде строки. Я сохраняю это в переменной с именем rawInput. Затем я проверяю, равно ли это «Q». Если да, я ухожу. Если это не так, я конвертирую его в Integer и использую остальную часть вашей логики.

У редактора @MadProgrammer был хороший совет относительно того, как сделать этот код более стойким к ошибкам, за которым я последую, но я разместил этот код, потому что он напрямую отвечает на ваш вопрос.

+1

Не забудьте изменить свой последний оператор System.out в цикле while на «rawInput = in.next(); if ("Q" .equals (rawInput)) { return; // exit main } input = Integer.parseInt (rawInput); ' – SkyVar

0

Integer.parseInt(myString)

Просто подключите MyString

class JTest 
{ 
    public static void main(String[] args) 
    { 
     String a = "5"; 
     int b = Integer.parseInt(a); 
     System.out.println(b); 
    } 
} 
1

У вас есть два варианта:

  • Либо использовать численное значение для выхода (0 или -1), или
  • Преобразовать вашу программу, чтобы принять обе строки и числа. То, как вы это делаете, - Integer.parseInt().

    // This assumes that input is of type String instead 
    int option = 0; 
    System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
    input=in.nextLine(); 
    try { 
        option = Integer.parseInt(input); 
    } catch (NumberFormatException nfe) { 
        // wasn't a number, so it was either bogus input or the quit option. 
        if("Q".equalsIgnoreCase(input)) { 
         System.out.println("Quitting."); 
         System.exit(0); 
        } else { 
         System.out.println("Bogus input."); 
        } 
    } 
    while (count < 3 && option != 0) { 
        // logic 
    } 
    
+0

С другой стороны, также следует обеспечить обратную связь с пользователем, когда они не работают правильно, но тогда нам нужен цикл в блоке try/catch, пока пользователь не вводит правильный ввод и не добавит 'trim()' для очистки пространства , Чтение в строке за строкой имеет преимущество, чтобы предотвратить странные вещи, такие как пользователь, вводящий 2 числа подряд. – nhahtdh

+0

@nhahtdh: Да. Ввод пробела - фиктивный вход. Это не «рок», «бумага», «ножницы» или «выход». Что еще это будет? Да, я согласен с тем, что для этого нужен цикл eval - это в основном альтернатива строкам. Было бы гораздо проще использовать числовые значения в качестве опции «выйти», так как это то, что было спроектировано для использования. – Makoto

+0

Также можно рассмотреть пустую строку, поскольку пользователь случайно набирает ее и игнорирует ее. Я не должен был констатировать, что это плохо для этого в моем предыдущем комментарии. Я просто хочу указать альтернативное имя с помощью 'next()'. – nhahtdh

0

при условии пользовательского ввода оленьей кожи, кроме 0-9 и "д" или "Q", то он должен работать:

Scanner sc = new Scanner(System.in); 
    String a = sc.next(); 
    if(a.equalsIgnoreCase("q")){ 
     System.out.println("quit game"); 
    }  
    else{ 
     int input = Integer.parseInt(a); 
    } 
0

Измените программу следующим образом:

public static void main(String... args) { 

     Scanner in = new Scanner(System.in); 
     int compint; 
     String usermove = ""; 
     String compmove = ""; 
     String winner = ""; 
     int count = 0; 
     int input = 0; 
     Random gen = new Random(); 
     Set<Boolean> set = new HashSet<Boolean>(); 
     boolean contains = false; 
     while (count < 3) { 
      System.out.print("Enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
      String nextLine=in.next().trim(); 
      do { 
       for (int index = 0; index < nextLine.length(); index++) { 
        set.add(Character.isLetter(nextLine.charAt(index))); 
       } 
       contains = set.contains(true); 
       if(contains) { 
       if (nextLine.equals("Q")) { 
        System.out.println("program exited"); 
        return; 
       } else { 
        System.out .print("Re-enter Rock(1), Paper(2), Scissors(3) {Q to quit]: "); 
        nextLine=in.next(); 
       } 
       } else { 
        input=Integer.parseInt(nextLine); 
       } 

       set.remove(true); 
      } while (contains); 

      compint = gen.nextInt(3) + 1; 

      if (input == 1) { 
       usermove = "Rock"; 
      } else if (input == 2) { 
       usermove = "Paper"; 
      } else if (input == 3) { 
       usermove = "Scissors"; 
      } 

      if (compint == 1) { 
       compmove = "Rock"; 
      } else if (compint == 2) { 
       compmove = "Paper"; 
      } else if (compint == 3) { 
       compmove = "Scissors"; 
      } 

      if (compint == input) { 
       winner = "TIE"; 
      } else if (compint == 1 && input == 3) { 
       winner = "COMPUTER"; 
      } else if (compint == 2 && input == 1) { 
       winner = "COMPUTER"; 
      } else if (compint == 3 && input == 2) { 
       winner = "COMPUTER"; 
      } else { 
       winner = "USER"; 
      } 

      System.out.print("Computer: " + compmove + " | "); 
      System.out.print("You: " + usermove + " | "); 
      System.out.println("Winner: " + winner); 
      System.out.println(); 
      count++; 
     } 
     System.out.println("program's end"); 
    }