2014-09-29 2 views
0

Я создаю игру Rock, Paper, Scissors, и я хочу, чтобы она отображала индивидуальные победы, потери и связи.Отображение Wins-Loss-Ties

Когда я запускаю его, он всегда говорит, что я проигрываю.

Проблема, я думаю, либо с операциями if-then, которые должны увеличивать правильное значение.

if(ret == 1)//starts the increases of wins and losses 
      { 
       if(ret != 0) 
       { 
        if (ret != 2) 
        { 
        w += 1; 
        } 
       } 
      } 

      if(ret == 0) 
      { 
       if(ret != 1) 
       { 
        if(ret != 2) 
        { 
         l += 1; 
        } 
       } 
      } 

      if(ret == 2) 
      { 
       if(ret != 1) 
       { 
        if(ret != 0) 
        { 
         t += 1; 
        } 
       } 
      } 


Или в этом методе, который определяет, выиграл ли человек или потери.

public static int winnerRet(char user, char compGuess)// method to determine winner 
    { 
     int ret = 3; 
     if(user == 'R') 
     { 
      if(compGuess != 'P') 
      { 
       if(compGuess != 'R') 
       { 
        ret = 1; 
       } 
       ret = 2; 
      } 
      ret = 0; 
     } 
     if(user == 'S') 
     { 
      if(compGuess != 'R') 
      { 
       if(compGuess != 'S') 
       { 
        ret = 1; 
       } 
       ret = 2; 
      } 
      ret = 0; 
     } 
     if(user == 'P') 
     { 
      if(compGuess != 'S') 
      { 
       if(compGuess != 'P') 
       { 
       ret = 1; 
       } 
       ret = 2; 
      } 
      ret = 0; 
     } 
     return ret; 
    }//end winnerRet 

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

public static char compChoice()//starts method to generate computure choice 
    { 
     Random random = new Random(); 
     int compNum; 
     char compGuess = '\0'; 
     compNum = 1 + random.nextInt(3); 
     if (compNum == 1) 
     { 
      compGuess = 'R'; 
     } 
     if(compNum == 2) 
     { 
      compGuess = 'S'; 
     } 
     if(compNum == 3) 
     { 
      compGuess = 'P'; 
     } 
     return compGuess; 
    }//end method compChoice 

Как я могу это исправить?

+0

Есть ли ошибки при запуске программы? – James

+0

Возможно, вы захотите объединить свои операторы if/else с логическими операторами (&& и ||), чтобы сделать это доступным для чтения. – Michael

+1

Множество ваших операторов if избыточно. Если это что-то равно, то это определенно не может равняться двум другим. – Compass

ответ

0

Хотя это не прямой ответ на ваш вопрос «где ошибка», я думаю, что все ваше решение может быть улучшено. Имея это в виду, я использовал перечисление для пьес и простую функцию, которая проверяет все правила игры. Я думаю, что быстрее отлаживать/понимать этот путь. Смотрите, если это поможет вам:

ENUM:

public enum Play{ 
    ROCK,PAPER,SCISSORS; 
} 

и функция, которая возвращает ложь, если player1 теряет или верно, если player1 побед:

public boolean play(Play player1, Play player2) throws UnsuportedPlayException{ 
    // rock wins scissors 
    if(player1 == Play.ROCK && player2 == Play.SCISSORS) 
     return true; 
    if(player2 == Play.ROCK && player1 == Play.SCISSORS) 
     return false; 

    //rock loses to paper 
    if(player2 == Play.ROCK && player1 == Play.PAPER) 
     return true; 
    if(player1 == Play.ROCK && player2 == Play.PAPER) 
     return false; 

    //paper loses to scissors 
    if(player1 == Play.PAPER && player2 == Play.SCISSORS) 
     return false; 
    if(player2 == Play.PAPER && player1 == Play.SCISSORS) 
     return true; 
    throw new UnsuportedPlayException("That play is not yet available."); 
} 

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

Класс Exception:

public class UnsuportedPlayException extends Exception { 

    private static final long serialVersionUID = 1L; 

    public UnsuportedPlayException() { 
     super(); 
    } 

    public UnsuportedPlayException(String message, Throwable cause) { 
     super(message, cause); 
    } 

    public UnsuportedPlayException(String message) { 
     super(message); 
    } 

    public UnsuportedPlayException(Throwable cause) { 
     super(cause); 
    } 
} 
+0

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

+0

Это класс исключений. Вы должны создать класс с кодом, который я добавил после «класса исключения». Вы должны немного прочитать об исключениях на Java, если вы не знакомы с ними. Вот старт: http://docs.oracle.com/javase/tutorial/essential/exceptions/ –

+0

Извините, я не видел последний бит. Виноват. – Mas

0

Ваша ошибка в методе winnerRet. Этот код:

if(user == 'R') 
     { 
      if(compGuess != 'P') 
      { 
       if(compGuess != 'R') 
       { 
        ret = 1; 
       } 
       ret = 2; 
      } 
      ret = 0; 
     } 

ВСЕГДА установлен в отставке 0. Если логика делает погружение в одну из внутренней, если заявления переменная RET еще получает значение 0 в конце. Надеюсь, это поможет.

0

В коде ret=0 это последнее утверждение, если условия, так что всегда будет присваивать значение в отставке до 0

Вместо

if(user == 'R'){ 
      if(compGuess != 'P') 
      { 
       if(compGuess != 'R') 
       { 
        ret = 1; 
       } 
       ret = 2; 
      } 
      ret = 0; 
} 

Использование ниже кода

if (user == 'R') { 
      ret = 0; 
      if (compGuess != 'P') { 
       ret = 2; 
       if (compGuess != 'R') { 
        ret = 1; 
       } 
     } 
} 

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

0
import java.util.Random; 

public class RockPaperScissor { 

    static String ret; 

    public static void main(String args[]) { 

     String computer = compChoice(); 
     winnerRet(args[0], computer); 

    } 

    public static void winnerRet(String user, String compGuess) { 

     if (user.equals("R")) { 
      if (!compGuess.equals("P")) { 
       if (!compGuess.equals("R")) { 
        ret = "Win"; 
       } else { 
        ret = "Draw"; 
       } 
      } else { 
       ret = "Lose"; 
      } 
     } else if (user.equals("S")) { 
      if (!compGuess.equals("R")) { 
       if (!compGuess.equals("S")) { 
        ret = "Win"; 
       } else { 
        ret = "Draw"; 
       } 
      } else { 
       ret = "Lose"; 
      } 
     } else if (user.equals("P")) { 
      if (!compGuess.equals("S")) { 
       if (!compGuess.equals("P")) { 
        ret = "Win"; 
       } else { 
        ret = "Draw"; 
       } 
      } else { 
       ret = "Lose"; 
      } 
     } 

     System.out.println(compGuess); 
     System.out.println(ret); 

    } 

    public static String compChoice() { 

     String compGuess; 

     Random random = new Random(); 
     int compNum = random.nextInt(3) + 1; 

     if (compNum == 1) { 
      compGuess = "R"; 
     } else if (compNum == 2) { 
      compGuess = "S"; 
     } else { 
      compGuess = "P"; 
     } 

     return compGuess; 

    } 

} 

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

0

Создайте переместить перечисление и дайте ему сделать работу за вас. Это гораздо читательнее всех операторов if. Также причина, по которой вам требуется initMoves, заключается в том, что вы не можете ссылаться на перечисления перед их инициализацией (однако они ссылаются друг на друга).

import java.util.Random; 

public class RockPaperScissors { 

    public static void main(String[] args) { 
    Move.initMoves(); 
    Move computerMove = Move.randomMove(); 
    Move.ROCK.printWin(computerMove); 
    Move.PAPER.printWin(computerMove); 
    Move.SCISSORS.printWin(computerMove); 
    } 

    private static enum Move { 

    ROCK, 
    PAPER, 
    SCISSORS; 

    private Move beats; 

    private Move() {} 

    private static void initMoves() { 
     ROCK.beats = SCISSORS; 
     PAPER.beats = ROCK; 
     SCISSORS.beats = PAPER; 
    } 

    public void printWin(Move computer) { 
     if (this == computer) { 
     System.out.println("It was a tie."); 
     } else if (this.beats == computer) { 
     System.out.println("Player wins."); 
     } else { 
     System.out.println("Computer wins."); 
     } 
    } 

    public static Move randomMove() { 
     int move = new Random().nextInt(3); 
     switch(move) { 
     case 0: 
     return ROCK; 
     case 1: 
     return PAPER; 
     default: 
     return SCISSORS; 
     } 
    } 
    } 
} 
Смежные вопросы