Отображение выигрышей-проигрышей

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

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

Я думаю, что проблема заключается либо в операторах 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

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


person Mas    schedule 29.09.2014    source источник
comment
Выдаются ли какие-либо ошибки при запуске программы?   -  person James    schedule 29.09.2014
comment
Вы можете попробовать объединить операторы if/else с логическими операторами (&& и ||), чтобы сделать это читаемым.   -  person Michael    schedule 29.09.2014
comment
Многие ваши операторы if избыточны. Если оно чему-то равно, то точно не может равняться двум другим.   -  person Compass    schedule 29.09.2014
comment
Ваш код ужасно непрозрачен, и вам, вероятно, следует использовать перечисления в нескольких местах.   -  person chrylis -cautiouslyoptimistic-    schedule 29.09.2014
comment
Начнем с if(ret == 1) { if(ret != 0) { if (ret != 2){ w += 1; } } } , какая у вас там логика? 1 это уже не 0 и не 2....   -  person Elliott Frisch    schedule 29.09.2014
comment
Какая польза от int ret = 3; в строке 3? Почему бы не поставить else { int ret = 3; }?   -  person jyoonPro    schedule 29.09.2014


Ответы (5)


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

ENUM:

public enum Play{
    ROCK,PAPER,SCISSORS;
}

И функция, которая возвращает false, если player1 проигрывает или true, если 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.");
}

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

Класс исключения:

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);
    }
}
person Ric Jafe    schedule 29.09.2014
comment
Эй, еще один быстрый вопрос, когда я попытался реализовать ваше предложение, он дает мне ошибку, не может найти символ - класс UnsuportedPlayException. Вы знаете, почему это могло произойти? - person Mas; 30.09.2014
comment
Это класс исключений. Вы должны создать класс с кодом, который я добавил после класса Exception. Вам следует немного прочитать об исключениях в Java, если вы с ними не знакомы. Вот начало: docs.oracle.com/javase/tutorial/essential/exceptions - person Ric Jafe; 30.09.2014
comment
Извините, я не видел, что последний кусок. Виноват. - person Mas; 30.09.2014
comment
Нет проблем, добавил позже. Если это решит вашу проблему, не забудьте проголосовать/принять как ответ :) - person Ric Jafe; 30.09.2014

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

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

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

person B Schroed    schedule 29.09.2014

В вашем коде ret=0 является последним оператором условия if, поэтому он всегда будет присваивать ret значение 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;
                }
        }
}

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

person Gautam Savaliya    schedule 29.09.2014

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;

    }

}

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

person jyoonPro    schedule 29.09.2014

Создайте перечисление Move и позвольте ему сделать всю работу за вас. Это гораздо более читабельно, чем все операторы 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;
      }
    }
  }
}
person nmore    schedule 29.09.2014