Программа ведет себя в заданных условиях непоследовательно для одного и того же ввода - PullRequest
0 голосов
/ 28 октября 2018

Это функция игры, которую я сделал.Это копия популярной настольной игры Mastermind .

. Я заменил 8 цветов цифрами 1-8.Повторение не допускается, и сгенерированный компьютером код также строго соблюдает эти правила.

Я поставил условия для выдачи ошибки, когда введенный пользователем код содержит цифры 0 или 9 или не является 4-значным кодом.

Однако программа не всегда выдает ошибку, допущенную пользователем.

Например:

1) Пользователь вводит 0439.

Программа выдает ошибку.

2) Пользователь вводит 412906.

С программой все в порядке.

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

Может кто-нибудь пожалуйстапомогите разобраться в проблеме?

Примечание. В конце удалите код функции quit(), так как он связан с другим классом в моей программе.Просто удалите этот последний блок if.

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

public void master()throws IOException,InterruptedException
{        
    int i,j,c=0,a,k=0;
    String str,ch;
    String code[]=new String[4];

    System.out.println("\t\t\tWelcome to Mastermind\n");
    System.out.println("\nThe computer will generate a 4 digit number consisting of digits from 1 to 8 without repetition and you will have to crack the code in 10 attempts.\n0,9,letters and special characters are not allowed and if entered,the computer will ask you to try again.\nKey description-\n □ means that a digit in the number entered by the user is present in the code but is at the wrong position.\n ■ means that a digit in the number entered by the user is present in the code and is at the correct position.\nIn both the cases,the user will not be told to which digit the key given by the computer is referring to.\nDuplicates are not allowed and are not present in the code generated by the computer.\nIf you try to enter a number with repeating digits,it will not be accepted and you will be told to try again.");
    BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter \"play\" to start");
    String play=in.readLine();
    if(play.equalsIgnoreCase("play"))
    {            
        code[0]=Integer.toString((int)(Math.random()*7)+1);// generates first no. of code
        do           
        {
            code[1]=Integer.toString((int)(Math.random()*7)+1);// generates second no. of code
        }while(code[1].equals(code[0]));

        do           
        {
            code[2]=Integer.toString((int)(Math.random()*7)+1);// generates third no. of code
        }while(code[2].equals(code[1]) || code[2].equals(code[0]));

        do           
        {
            code[3]=Integer.toString((int)(Math.random()*7)+1);// generates fourth no. of code
        }while(code[3].equals(code[2]) || code[3].equals(code[1]) || code[3].equals(code[0]));

        System.out.println("The game begins");
        for(a=1;a<=10;a++)
        {
            System.out.println("Attempt "+a);
            str=in.readLine();   

            if(str.length()!=4)  
            {
                System.out.println("Try again with only digits from 1 to 8 and only a 4-digit number without repetitions");
                str=in.readLine();
            }

            else
            {
                for(i=0;i<4;i++)
                {
                    c=(int)(str.charAt(i));
                    if(c>56||c<49) // checks if input is appropriate by comparing ASCII value of the input
                    {
                        System.out.println("Try again with only digits from 1 to 8 and only a 4-digit number");
                        str=in.readLine(); 
                    }
                    else
                    {
                        for(i=0;i<4;i++)
                        {
                            for(j=0;j<4;j++)
                            {
                                if(i!=j)
                                {
                                    if(str.charAt(i)==str.charAt(j))
                                    {
                                        System.out.println("Try again with only digits from 1 to 8 and only a 4-digit number");
                                        str=in.readLine();
                                        break;
                                    }
                                }
                            } 
                        }
                    }
                }  
            }

            if((code[0]+code[1]+code[2]+code[3]).equals(str))
            {
                k=1;
                break;
            }
            for(i=0;i<4;i++)
            {
                ch=Character.toString(str.charAt(i));
                for(j=0;j<4;j++)
                {                        
                    if(code[j].equals(ch))
                    {
                        if(i==j) 
                        {
                            System.out.print("■");
                        }
                        else
                            System.out.print("□");
                    }                        
                }
            }
            System.out.println();
        } 
        if(k!=1)
            System.out.println("The code is "+code[0]+code[1]+code[2]+code[3]);
        else
            System.out.println("You did it!!!");
    }
    System.out.println("Thank You");
    if(!play.equalsIgnoreCase("play"))
        quit(); 
}

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Несоответствие в вашем коде из-за этого:

if(str.length()!=4)  
            {
                System.out.println("Try again with only digits from 1 to 8 and only a 4-digit number without repetitions");
                str=in.readLine();
            }

Подумайте об этом минуту.Пользователь делает свою первую попытку с номером 412906, который недействителен.И после этого вы просто принимаете новый ввод без какой-либо проверки.

Что должно произойти здесь, это то, что процесс начинается снова с инкрементом, равным единице (+1)

0 голосов
/ 28 октября 2018
if(str.length()!=4)  
{
    System.out.println("Try again with only digits from 1 to 8 and only a 4-digit number without repetitions");
    str=in.readLine();
}

Здесь вы проверяете длину только один раз, а затем берете другой ввод без повторной проверки длины, а также пропускаете всю часть проверки цифр, потому что вы помещаете ее в предложение else, которое не выполняется, если первый длина входа не была 4.

Это будет делать:

while(true){
    str = in.readLine();
    if(str.length() != 4){
        // wrong length detected -  print error message
        continue;
    }
    boolean wrongChars = false;
    for(char c : str.toCharArray())
        if(c>56||c<49){
            wrongChars = true;
            break;
        }
    if(wrongChars){
        // wrong characters detected - print error message
        continue;
    }
    boolean duplicateChars = false;
    for(int i=0; i<4; i++)
        for(int j = i + 1; j < 4; j++)
            if(str.charAt(i)==str.charAt(j))
                duplicateChars = true;
    if(duplicateChars){
        // duplicate digits detected - print error message
        continue;
    }
    break; // all input checks passed - break the loop
}
...