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

问题描述

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

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. 您已经三次声明了一个新的扫描仪变量。这是多余和浪费的混乱。要么有一个单一的、类范围的扫描器,要么(最好)只在一个实际使用它的方法中创建一个扫描器,然后记住在不再需要扫描器时调用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. 当我看到一个名为“事物”的变量时,我真的笑了。请找到一个实际描述此变量用途的名称。

  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;
}

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

毕竟要考虑的事情:

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

我很欣赏这里有很多需要思考和努力的地方。稳步前进,一步一个脚印,如果需要,也可以继续提问。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...