📄 sudokugame.java
字号:
// 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 + -