数独代码程序 - 检查行、列和框

Sudoku Code Program - Checking Rows,Columns, and Boxes

我需要帮助检查数独程序的行、列和框。我是一名高中生,需要帮助才能完成这个项目。如果有人可以提供帮助,那就太棒了!我目前正在检查复选框,其中我有一条评论说“从这里开始”。谢谢!

import java.util.*;
public class Run
{
    Scanner scanner = new Scanner(System.in);
    
    public static void main(String[] args)
    {
        char [][] board = new char [9][9];
    
    
        Scanner scanner = new Scanner(System.in);
    
        System.out.println("Welcome to Sudoku!\n");
        fill(board);
        printBoard(board);
        inputLengthandDigits(board);
        System.out.println();
        printBoard(board);
        
    }
    
    public static void fill(char[][] arr){   
        for(int row = 0; row < arr.length; row++){
            for(int col= 0; col< arr[row].length; col++){
                arr[row][col] = '-';
            }
        }
    }

    public static void printBoard(char [][] array)
    {
        for(char[] row: array)
        {
            for(char play: row)
            {
                System.out.print(play+ " ");
            }
            System.out.println();
        }
    }
    
     public static void inputLengthandDigits(char[][] array){
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < 9; i++) 
        {
            System.out.println("\nEnter the numbers in row " + (i+1) + ":");
            String input = in.nextLine();
            String numbers = "123456789-";
            boolean numberscheck = false;
            boolean endCheck = true;
            boolean onlyOnce = true;
            
            //Input Validation Starts Here!
            //Checks if Input is only digits 0-9
            do{

                if(endCheck==false){
                    System.out.println("\nPlease input numbers only (1-9)!");
                    input = in.nextLine();
                }
                
                if(onlyOnce==false){
                    System.out.println("\nPlease input numbers only once!");
                    input = in.nextLine();
                }
                
                //Checks Length of User Input
                while(input.length() < 9 || input.length() > 9){
                    System.out.println("\nPlease input 9 numbers!");
                    input = in.nextLine();
                }
                
                //Start Here 
                for(int a = 0; a<input.length()-1; a++){
                    for(int b= a + 1; b<input.length(); b++){
                        if(input.charAt(a)==input.charAt(b)){
                            onlyOnce = false;
                        }
                    }
                }
                
                
                for(int x = 0; x < input.length(); x++){
                    char thing = input.charAt(x);
                    numberscheck = false;
                    
                    for(int y = 0; y < numbers.length(); y++){
                        char numbersn = numbers.charAt(y);
                        if(thing == numbersn){
                            numberscheck = true;
                            endCheck = true;
                            break;
                        }
                    }
                    if(numberscheck == false){
                        endCheck = false;
                        break;
                    }
                }
            }while(endCheck==false || onlyOnce==false);
            
            
        

            for(int j=0; j<9; j++){
                array[i][j] = input.charAt(j);
            }
        }
     }
}

我的初始回复太长,无法发表评论。我不确定我是否有解决您的问题的方法,主要是因为您还没有真正指出哪一点是问题,但这些指示应该有助于改善问题:

  1. 请重新格式化您的代码。看着其实挺痛苦的。变量、关键字、括号和操作数周围应始终使用空格。左花括号应与方法签名、for() 循环或其他先出现的内容位于同一行。您在不分隔逻辑部分的方法中有随机空白行,因此只会造成混淆。编译器不会关心这些,但是如果你能让你的代码看起来更整洁,人们会本能地认为你关心并且更有可能相信你有能力编写像样的代码。

  2. 您已经声明了 3 次新的扫描器变量。这是多余和浪费的混乱。要么有一个 class 范围的扫描仪,要么(最好)只在实际使用它的方法中创建一个扫描仪,然后记得在不再需要扫描仪时调用 scanner.close() 。

  3. inputLengthandDigits 是个奇怪的名字。 'Lengthand' 是一个单词,还是应该是 'inputLengtHandDigits' 或 'inputLengthAndDigits'?在驼峰式的情况下,除了第一个单词外,每个单词都大写,以使整个单词更容易阅读。不管它应该是什么,我不明白这个方法的名字是做什么的。它没有输入任何内容,而是从其他人那里获取输入。也许 getData 或 populateGrid 可能更能说明问题。

  4. 9 出现了很多次,没有解释。我知道它是从哪里来的,因为我花了太多时间玩数独,但它是一个神奇的数字,要不惜一切代价避免这些。我曾经在工作场所遇到过一个神奇的数字,我花了半天时间尝试完成如果同事们记录下这个数字是什么以及它来自哪里的话本可以做十分钟的工作。在这里,只要有一个private static final int maxNumber = 9;声明。

  5. 一件好事:您的 main() 方法几乎没有繁琐的细节。您已经有效地使用方法调用来讲述故事并描述别处发生的事情。这是一件非常非常好的事情:)

  6. 您的一些逻辑测试可以稍微整理一下,例如!onlyOnceonlyOnce == false相同,input.length() < maxNumber || input.length() > maxNumber可简化为input.length() != maxNumber。这是完全相同的逻辑,但输入速度更快且更易于阅读:)

  7. 看起来您在 //Start here 注释下的代码正在检查您没有任何重复的数字。如果你确实得到了重复的数字,程序仍然会尝试 运行 下一段代码,然后再要求用户进行替代输入。这是你想要发生的事情,还是浪费时间?

  8. 当我看到一个叫'thing'的变量时,我真的笑了。请找到一个实际描述此变量用途的名称。

  9. 我现在有 运行 代码,当我试图为第 4 行键入重复数字时它正确地指出了一个错误。但是,它现在卡在那里并一直问我即使我输入了一组有效的数字,也要重试。这需要修复。仔细查看哪些标志触发了重试请求。 运行 你的代码处于调试模式(你正在使用像 IntelliJ 或 Eclipse 这样的 IDE,不是吗?)并故意输入一个错误的行以查看你自己的行为以及逻辑出错的地方.

  10. 获取行输入、验证它然后填充数组的整个方法非常庞大且令人困惑。您需要将其重构为许多更小的方法。这是一个建议:

private static char[][] populateGrid(char[][] array) {
  Scanner scanner = new Scanner(System.in);

  for (int i = 0; i <maxNumber; i++) {
    String rowData = getRowInput(scanner);
    populateRow(array, rowNumber, rowData);
  }

  scanner.close;
  return array;
}

private static String getRowInput(Scanner scanner) {
    System.out.println("\nEnter the numbers in row " + (i + 1) + ":");
    String input = scanner.nextLine();
    while (!isValidInput(input) {
      System.out.println("Please enter only the digits 1-9 in any order, with no duplicates or omissions");
      input = scanner.nextLine();
    }
    return input;
}

private static boolean isValidInput(String input) {
  if (!rightLengthOfInput(input)) {
    return false;
  }
  if (!allUniqueDigits(input)) {
    return false;
  }
  if (!usesCorrectCharacters(input)) {
    return false;
  }
  return true;
}

我会留给你做不同的输入验证方法。这主要是移动现有代码的情况,但方法名称将帮助人们理解每个部分在做什么。这种结构还允许您干净地添加更多验证检查,如果将来需要这样的话。

毕竟要考虑的事情:

  • 您是要检查自己是否有可行的数独解决方案,还是相信用户会输入正确的数据,以便列中也包含九位数字中的每一位?您将如何处理无效的网格,例如每行都相同吗?
  • 这项作业要你完成多少?您是否需要系统地删除数字以获得可解决的难题而不是完整的网格?作业是否会在控制台中可以看到的谜题处停止,或者您是否需要可打印的格式,或者用户是否能够通过该程序进行游戏?如果是后一个选项,这是在控制台还是使用图形界面?

我很感激这里有很多值得思考和努力的地方。稳扎稳打,一步一个脚印,如有需要,不断提问。