⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sudokugame.java

📁 数独的一种实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// Decompiled by DJ v3.9.9.91 Copyright 2005 Atanas Neshkov  Date: 2/13/2008 10:19:42 PM
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   SudokuGame.java

import java.awt.Point;
import java.io.*;
import java.util.Scanner;

public class SudokuGame
{

    public SudokuGame(int i)
    {
        if(i <= 0 || getIntegerSquareRoot(i) < 0)
        {
            System.err.println((new StringBuilder()).append("Error!  Parameter to SudokuGame constructor (").append(i).append(") is not a perfect square.").toString());
            System.exit(0);
        }
        board = null;
        matrix = new Matrix(i, i);
        stdin = new Scanner(System.in);
        byte byte0 = 2;
        byte0 = 8;
        menu = new Menu(byte0, stdin);
        menu.addItem('H', "Hint");
        menu.addItem('U', "Undo");
        menu.addItem('L', "Load");
        menu.addItem('P', "Play");
        menu.addItem('S', "Save");
        menu.addItem('O', "sOlve");
        menu.addItem('C', "Change Interface");
        menu.addItem('Q', "Quit");
    }

    public SudokuGame()
    {
        this(9);
    }

    public String getVersion()
    {
        return "2.0.1";
    }

    public void setBoard(SudokuBoard sudokuboard)
    {
        board = sudokuboard;
    }

    public SudokuBoard getBoard()
    {
        return board;
    }

    public int getSize()
    {
        return matrix.getNumRows();
    }

    public static int getIntegerSquareRoot(int i)
    {
        int j;
        for(j = 0; j * j < i; j++);
        if(j * j != i)
            return -1;
        else
            return j;
    }

    public int getSectionSize()
    {
        int i = getSize();
        int j = getIntegerSquareRoot(i);
        if(i == -1)
        {
            System.err.println("Programmer error.  Somewhow matrix size  is not a perfect square!");
            System.exit(0);
        }
        return j;
    }

    public Matrix getMatrix()
    {
        return matrix;
    }

    protected void setMatrix(Matrix matrix1)
    {
        matrix = matrix1;
    }

    private boolean validateLocation(int i, int j)
    {
        return i >= 0 && i < getSize() && j >= 0 && j < getSize();
    }

    private String getFileName(String s)
    {
        System.out.print((new StringBuilder()).append("Enter the name of the file to ").append(s).append(": ").toString());
        return stdin.nextLine();
    }

    private boolean loadGameFromMenu()
    {
        if(loadGameFromFile(getFileName("load")))
        {
            System.out.println("Game loaded successfully");
            board.refresh();
            return true;
        } else
        {
            System.out.println("Unable to load game.");
            return false;
        }
    }

    protected boolean loadGameFromFile(String s)
    {
        boolean flag = false;
        if(flag)
            return false;
        File file = new File(s);
        if(!file.exists())
        {
            System.err.println((new StringBuilder()).append("File \"").append(s).append("\" does not exist.").toString());
            return false;
        }
        if(!file.canRead())
        {
            System.err.println((new StringBuilder()).append("Cannot read \"").append(s).append("\".").toString());
            return false;
        }
        Scanner scanner;
        try
        {
            scanner = new Scanner(file);
        }
        catch(Exception exception)
        {
            scanner = null;
            System.err.println("Programmer Error! Failed to detect undreadable file");
            System.exit(0);
        }
        return loadGame_simple(scanner);
    }

    protected boolean loadGame_simple(Scanner scanner)
    {
        boolean flag = false;
        if(flag)
            return false;
        String s = null;
        do
        {
            if(!scanner.hasNext())
            {
                System.err.println("File format error.  No size line.");
                return false;
            }
            s = scanner.nextLine().trim();
        } while(s.length() < 1 || s.charAt(0) == '#');
        if(s.toUpperCase().indexOf("SIZE:") != 0)
        {
            System.err.println((new StringBuilder()).append("Badly formated size line: \"").append(s).append("\".").toString());
            return false;
        }
        String s2 = s.substring("SIZE:".length()).trim();
        int i;
        try
        {
            i = Integer.parseInt(s2);
        }
        catch(NumberFormatException numberformatexception)
        {
            System.err.println((new StringBuilder()).append("Badly formated size line.   Size was not an integer \"").append(s).append("\".").toString());
            return false;
        }
        if(i <= 0)
        {
            System.err.println((new StringBuilder()).append("Invalid game size: ").append(i).toString());
            return false;
        }
        if(getIntegerSquareRoot(i) < 0)
        {
            System.err.println((new StringBuilder()).append("Badly formated size line.   Size was not an perfect squqre \"").append(s).append("\".").toString());
            return false;
        }
        Matrix matrix1 = new Matrix(i, i);
        int j = 0;
        do
        {
            if(j >= i)
                break;
            if(!scanner.hasNext())
            {
                System.err.println("File Format error.");
                System.err.println((new StringBuilder()).append("File contains only ").append(j).append(" lines of data.  ").append(i).append(" expected.").toString());
                return false;
            }
            String s1 = scanner.nextLine().trim();
            if(s1.length() >= 1 && s1.charAt(0) != '#')
            {
                Scanner scanner1 = new Scanner(s1);
                for(int k = 0; k < i; k++)
                {
                    if(!scanner1.hasNextInt())
                    {
                        System.err.println((new StringBuilder()).append("File Format error \"").append(s1).append("\".").toString());
                        System.err.println((new StringBuilder()).append("Does not contain ").append(i).append(" whitespace-separated integers.").toString());
                        return false;
                    }
                    int l = scanner1.nextInt();
                    if(l < 0 || l > i)
                    {
                        System.err.println((new StringBuilder()).append("File Format error \"").append(s1).append("\".").toString());
                        System.err.println((new StringBuilder()).append("Value ").append(l).append(" is out of range.").toString());
                        return false;
                    }
                    matrix1.set(j, k, l);
                }

                j++;
            }
        } while(true);
        Matrix matrix2 = matrix;
        matrix = matrix1;
        if(!validateBoard())
        {
            System.err.println("The file you just loaded was correctly formatted, but the game described is  invalid. ");
            matrix = matrix2;
            return false;
        } else
        {
            return true;
        }
    }

    private boolean saveGame()
    {
        return saveGame(getFileName("save"));
    }

    protected boolean saveGame(PrintWriter printwriter)
    {
        boolean flag = false;
        if(flag)
            return false;
        printwriter.printf("size: %d\n", new Object[] {
            Integer.valueOf(getSectionSize())
        });
        for(int i = 0; i < getSize(); i++)
        {
            printwriter.printf("%4d", new Object[] {
                Integer.valueOf(matrix.get(i, 0))
            });
            for(int j = 1; j < getSize(); j++)
                printwriter.printf(", %4d", new Object[] {
                    Integer.valueOf(matrix.get(i, j))
                });

            printwriter.println();
        }

        printwriter.println();
        printwriter.close();
        return true;
    }

    private boolean saveGame(String s)
    {
        File file;
        boolean flag = false;
        if(flag)
            return false;
        file = new File(s);
        if(file.exists() || file.createNewFile())
            break MISSING_BLOCK_LABEL_94;
        System.err.println((new StringBuilder()).append("Cannot create \"").append(s).append("\".").toString());
        return false;
        IOException ioexception;
        ioexception;
        System.out.println((new StringBuilder()).append("Caught exception ").append(ioexception).toString());
        if(!file.canWrite())
        {
            System.err.println((new StringBuilder()).append("Cannot write \"").append(s).append("\".").toString());
            return false;
        }
        PrintWriter printwriter;
        try
        {
            printwriter = new PrintWriter(file);
        }
        catch(Exception exception)
        {
            System.err.println("Programmer Error! Failed to detect undreadable file");
            System.exit(0);
            printwriter = null;
        }
        return saveGame(printwriter);
    }

    private boolean validateRow(int i)
    {
        int ai[] = new int[getSize() + 1];
        for(int j = 0; j < getSize(); j++)
        {
            int k = matrix.get(i, j);
            if(k < 0)
                return false;
            if(k <= 0)
                continue;
            ai[k]++;
            if(ai[k] > 1)
                return false;
        }

        return true;
    }

    private boolean validateColumn(int i)
    {
        int ai[] = new int[getSize() + 1];
        for(int j = 0; j < getSize(); j++)
        {
            int k = matrix.get(j, i);
            if(k < 0)
                return false;
            if(k <= 0)
                continue;
            ai[k]++;
            if(ai[k] > 1)
                return false;
        }
        
        return true;
    }

    private boolean validateSection(int i, int j)
    {
        int ai[] = new int[getSize() + 1];
        int k = getSectionSize();
        int l = i * k;
        int i1 = l + k;
        int j1 = j * k;
        int k1 = j1 + k;
        for(int l1 = l; l1 < i1; l1++)
        {
            for(int i2 = j1; i2 < k1; i2++)
            {
                int j2 = matrix.get(i2, l1);
                if(j2 < 0)
                    return false;
                if(j2 <= 0)
                    continue;
                ai[j2]++;
                if(ai[j2] > 1)
                    return false;
            }

        }

        return true;
    }

    protected boolean validateBoard()
    {
        boolean flag = false;
        if(flag)
            return true;
        for(int i = 0; i < getSize(); i++)
            if(!validateRow(i) || !validateColumn(i))
                return false;

        int j = getSectionSize();
        for(int k = 0; k < j; k++)
        {
            for(int l = 0; l < j; l++)
                if(!validateSection(k, l))
                    return false;

        }

        return true;
    }

    protected void move()
    {
        boolean flag = false;
        if(flag)
        {
            System.out.println("Enter value followed by position (no commas): ");
            int i = stdin.nextInt();
            char c = stdin.next().charAt(0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -