在我的代码中找不到错误

时间:2014-02-28 20:35:39

标签: java

我正在尝试完成我的任务,但我似乎无法在我的代码中找到错误。这不是编译器错误,我已经看了几个小时。

此代码适用于名为Mastermind的游戏。这些是指导原则(我知道,但是所有必要的分配信息都有点长):

  
      
  1. 计算机选择一个随机的4位数字,没有数字可以重复。 (例如:0462,2930,6103是有效数字)

  2.   
  3. 用户的目标是尝试猜测计算机选择的号码

  4.   
  5. 一旦用户猜测,计算机将通过提供以下信息告诉用户该猜测的类别:   完美匹配的位数(在正确的位置)    不在位的位数

  6.         

    扫描用户的输入时,请使用String来存储它。您的   程序必须除主方法外还有4种方法:

         
        
    • 一个名为isValidNumber的方法,用于检查给定的String是否对应于有效的4位数字。

    •   
    • 一个名为perfectMatches的方法,它返回表示有效4位数字的两个字符串之间的完美匹配数。

    •   
    • 一个名为offPlaceMatches的方法,它返回表示有效4位数的两个字符串之间的“off place”匹配数   号。

    •   
    • 一个名为generateRandomValidNumber的方法,它返回一个表示随机有效4位数字的字符串。

    •   
         

    提示:通过生成随机单个数据生成随机4位数字   数字4次并连接它们。然后使用你的isValidNumber   方法,检查您创建的String是否有效。如果不是,   重复第一部分并选择4个新的随机数字。

这是我的代码:

import java.util.Scanner;

public class Question1 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        //print welcome, what 4 digit number do you guess...
        System.out.println("Welcome to Mastermind.");
        System.out.println("I have a 4 digit number in mind. Can you guess it?");
        System.out.println("");
        System.out.println("What is your guess?");
        //string guess is number that is scanned
        String guess = input.nextLine();
        String validNumber = generateValidNumber();
        System.out.print("Perfect matches: " + perfectMatches(guess, validNumber));
        System.out.println("off place: " + offPlaceMatches(guess, validNumber));

        while(!(perfectMatches(guess, validNumber) == 4)) {
            System.out.println("");
            System.out.println("What is your guess?");
            guess = input.nextLine();
            validNumber = generateValidNumber();
            System.out.print("Perfect matches: " + perfectMatches(guess, validNumber));
            System.out.println("off place: " + offPlaceMatches(guess, validNumber));
        }

        System.out.println("Yes! You guessed my number correctly. Well done.");

    }

    static boolean isValidNumber(String number) {
        if(number.length() != 4) {
            return false; }
        char[] numberArray = new char[4];

        for (int i = 0; i < 4; i++) {
            numberArray[i] = number.charAt(i);
            if(!((number.charAt(i) <= '9') && (number.charAt(i) >= '0'))) {
                return false;
            }
        }

        for (int i = 0; i < 4; i++) {
            char c = numberArray[i];
            int count = 0;
            for(int j = 0; j < 4; j++)
                if(numberArray[j] == c)
                    count++;
            if(count > 1) {
                return false;
            }
        }
        return true;
    }

    static int perfectMatches(String one, String two) {
        int counter = 0;
        for(int i = 0; i < one.length(); i++) {
            if(one.charAt(i) == two.charAt(i)) {
                counter++;
            }
        }
        return counter;
    }

    static int offPlaceMatches(String one, String two) {
        int counter = 0;
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                if(i == 0)
                    continue;
                if(one.charAt(j) == two.charAt(i)) {
                    counter++;
                }
                if(j == i -1) {
                    i++;
                }
            }

        }
        return counter;
    }

    static String generateValidNumber() {
        boolean validNumber = false;
        String newNumber = "";
        while(!validNumber) {
            for(int i = 0; i < 4; i++) {
                char c = (char) (int) (Math.random() * (9));
                newNumber = newNumber + c;
            }
            if(isValidNumber(newNumber))
                validNumber = true;
        }
        return newNumber;
    }
}

4 个答案:

答案 0 :(得分:1)

generateValidNumber方法存在问题。

当您尝试查找新的随机数时,您没有重新初始化newNumber

将其更改为以下函数应该会导致程序成功执行。另外,将随机数乘以10得到[0.0,10.0]范围内的数字(包括0和排除10)

static String generateValidNumber() {
    boolean validNumber = false;
    String newNumber = null;
    while(!validNumber) {
        // add this line
        newNumber = "";
        for(int i = 0; i < 4; i++) {
            char c = (char) ('0' + (Math.random() * 10));
            newNumber = newNumber + c;
        }
        if(isValidNumber(newNumber))
            validNumber = true;
    }
    return newNumber;
}

但代码中存在一些逻辑错误。例如,每当用户猜出无效数字时,您就会生成一个新数字。

更新: 我对您的代码进行了一些更改。这应该可以帮助你开始。

import java.util.Scanner;

public class MastremindString {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // print welcome, what 4 digit number do you guess...
        System.out.println("Welcome to Mastermind.");
        System.out
                .println("I have a 4 digit number in mind. Can you guess it?");
        System.out.println("");
        System.out.println("What is your guess?");
        // string guess is number that is scanned
        String guess = input.nextLine();
        String validNumber = generateValidNumber();
        System.out.print("Perfect matches: "
                + perfectMatches(guess, validNumber));
        System.out.println("off place: " + offPlaceMatches(guess, validNumber));

        while (!(perfectMatches(guess, validNumber) == 4)) {
            System.out.println("");
            System.out.println("What is your guess?");
            guess = input.nextLine();
            System.out.print("Perfect matches: "
                    + perfectMatches(guess, validNumber));
            System.out.println("off place: "
                    + offPlaceMatches(guess, validNumber));
        }

        System.out.println("Yes! You guessed my number correctly. Well done.");

    }

    static boolean isValidNumber(String number) {
        if (number.length() != 4) {
            return false;
        }
        char[] numberArray = new char[4];

        for (int i = 0; i < 4; i++) {
            numberArray[i] = number.charAt(i);
            if (!((number.charAt(i) <= '9') && (number.charAt(i) >= '0'))) {
                return false;
            }
        }

        for (int i = 0; i < 4; i++) {
            char c = numberArray[i];
            int count = 0;
            for (int j = 0; j < 4; j++)
                if (numberArray[j] == c)
                    count++;
            if (count > 1) {
                return false;
            }
        }
        return true;
    }

    static int perfectMatches(String one, String two) {
        int counter = 0;
        for (int i = 0; i < one.length(); i++) {
            if (one.charAt(i) == two.charAt(i)) {
                counter++;
            }
        }
        return counter;
    }

    static int offPlaceMatches(String one, String two) {
        int counter = 0;
        for (int i = 0; i < one.length(); i++) {
            for (int j = 0; j < two.length(); j++) {
                if (one.charAt(j) == two.charAt(i) && i != j) {
                    counter++;
                }
            }
        }
        return counter;
    }

    static String generateValidNumber() {
        boolean validNumber = false;
        String newNumber = "";
        while (!validNumber) {
            newNumber = "";
            for (int i = 0; i < 4; i++) {
                char c = (char) ('0' + (Math.random() * 10));
                newNumber = newNumber + c;
            }
            if (isValidNumber(newNumber))
                validNumber = true;
        }
        return newNumber;
    }
}

答案 1 :(得分:0)

您似乎在每个周期生成一个新号码。解决此问题的最佳方法是在每个循环中不在validNumber内分配main(...)变量。

因为你达到了“你的猜测是什么?”你输入一个数字,但没有任何反应(这可能意味着你没有超过第一次guess=input.nextLine();调用后的两行),首先检查的函数是generateValidNumber();函数。其次,检查您的perfectMatches(...);功能。您可以添加System.out.println("blah");次调用以查看代码的范围(作为一种非常粗略的调试工具)。

答案 2 :(得分:0)

我假设您正在使用Eclipse并在入门编程课程中。编程课程中经常忽略的一个重要主题是如何使用调试器来帮助您解决问题。如果您的专业中的任何同学,实验室助理或同学可以花15-30分钟坐下来向您展示如何使用调试器,它将帮助您完成整个编程生涯。

如果没有,您可以通过很多教程来熟悉Eclipse的调试器。

要开始,请双击代码左侧,通常是行号的左侧。这将添加一个断点,它会在程序到达时暂停。在除main之外的每个方法中添加一个断点,并确保实际调用您认为应该调用的所有方法。

当您的程序处于断点时,您还可以在“变量”视图中查看变量的值。如果其中一个人有意想不到的价值,你可能已经找到了罪魁祸首。

当您在给定的断点处完成时,您需要点击一个恢复按钮来恢复程序执行。默认情况下,它应位于顶部栏中的“暂停”和“停止”按钮旁边,并且很容易与“运行”按钮混淆。

答案 3 :(得分:0)

首先:你永远不会调用isValidNumber来检查用户的输入是否有效。您应该调用此方法,如果该号码无效,程序应终止或提示用户输入新号码