当前位置: 首页 > 知识库问答 >
问题:

对于相同的输入,程序在给定条件下的行为不一致

柴正祥
2023-03-14

这是我做的一个游戏的功能。它是流行棋盘游戏MasterMind的复制品。

我用数字1-8替换了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个答案

葛季萌
2023-03-14
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();
}

在这里,您只检查一次长度,然后在不再次检查长度的情况下接受另一个输入,并且还跳过了检查数字的整个部分,因为您将其放入了一个ster子句中,如果第一个输入的长度不是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
}
墨宜人
2023-03-14

代码中的不一致是因为:

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)中增加for

 类似资料:
  • 本文向大家介绍python在不同条件下的输入与输出,包括了python在不同条件下的输入与输出的使用技巧和注意事项,需要的朋友参考一下 1. 用户输入内容与打印 输入:input() 输出:print() 例1,输入字符串,并原样输出 例2,输入字符串,并判断是否是回文,打印结果 2. 文件创建、读写 打开文件:f = open('文件名', '打开模式') 读取:f.read()、f.readl

  • 对于下面的代码,我得到了不同的输出 输出为: 现在美国/洛杉矶是GMT-8/UTC-8或PST。但当我将参数从GMT-8改为America/Los_Angeles时, 输出为: 不能使用类似PST的缩写,因为它已被弃用。同时,CST可以指中央标准时间和中国标准时间。 我的输入是-8、-9-14等,我希望在GMT/UTC之前知道我是否可以在给定日期获得DST激活。 请在这方面指导我。

  • 问题内容: 我尝试过一些关于绑定和未绑定方法的代码。当我们调用它们时,我认为它们都会返回对象。但是,当我用于获取一些信息时,它返回的内容我并不理解。 IDE:Eclipse 插件:pydev 输出是… 为什么#1和#2返回相同的ID?他们不是不同的对象吗?如果我们分配和两个变量,#3,#4回报不同的ID。 我认为#3和#4表明它们不是同一对象,而是#1和#2 … 绑定方法的ID和未绑定方法的ID有

  • 问题内容: 我正在使用具有Spring安全性的BCryptPasswordEncoder。我的期望是,对于相同的输入,我将始终获得相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用以下代码段对其进行测试: 输出:$ 2a $ 10 $ cYLM.qoXpeAzcZhJ3oXRLu9Slkb61LHyWW5qJ4QKvHEMhaxZ5qCPi 输出2:$ 2a $ 10 $ KEvYX9y

  • 我正在使用带有Spring Security的BCryptPasswordEncoder。我的期望是,对于相同的输入,我总是得到相同的输出。但是对于相同的输入,我得到不同的输出。您可以使用下面的代码片段对其进行测试: 输出:$2A$10$CYLM.QOXPEAZCZHJ3OXRLU9SLKB61LHYWW5QJ4QKVHEMHAXZ5QCPI 输出2:$2A$10$kevyx9yjj0f1x3wl

  • 我有一个叫做运动员的类,它是人类的子类。在人类类中,我实现了可比接口,并使用比较方法来比较不同运动员的年龄。在运动员类中,我有一个名为年的额外字段,对应于运动员开始比赛的年份。在我程序中的主要方法中,我有一个数组列表,我添加了运动员和人类。我想这样,如果一个运动员是同龄的,可以根据运动员开始比赛的年份进行排序。我使用instanceof检查我的类人类,如果实例是对象的类型是运动员,但之后我不知道如