mirror of
https://github.com/jeremysrand/a2sudoku.git
synced 2025-04-19 02:37:32 +00:00
Load puzzles from files at runtime. Save options when they change and not at quit time.
This commit is contained in:
parent
7ebfde42fe
commit
0bce2a1da6
@ -24,6 +24,11 @@
|
||||
9DEE9C3A1B56CFC0003E353E /* ui.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ui.c; sourceTree = "<group>"; };
|
||||
9DEE9C3B1B56CFC0003E353E /* ui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = "<group>"; };
|
||||
9DEE9C3C1B570AED003E353E /* a2e.hi.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = a2e.hi.s; sourceTree = "<group>"; };
|
||||
9DEE9C3D1B582C3A003E353E /* generateSudoku.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; path = generateSudoku.pl; sourceTree = "<group>"; };
|
||||
9DEE9C3E1B5837B0003E353E /* easy.puzzles */ = {isa = PBXFileReference; lastKnownFileType = file; path = easy.puzzles; sourceTree = "<group>"; };
|
||||
9DEE9C3F1B5837B0003E353E /* hard.puzzles */ = {isa = PBXFileReference; lastKnownFileType = file; path = hard.puzzles; sourceTree = "<group>"; };
|
||||
9DEE9C401B5837B0003E353E /* medium.puzzles */ = {isa = PBXFileReference; lastKnownFileType = file; path = medium.puzzles; sourceTree = "<group>"; };
|
||||
9DEE9C411B583FE4003E353E /* puzzles.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = puzzles.txt; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@ -45,6 +50,7 @@
|
||||
9DEE9C3A1B56CFC0003E353E /* ui.c */,
|
||||
9DEE9C3B1B56CFC0003E353E /* ui.h */,
|
||||
9DEE9C3C1B570AED003E353E /* a2e.hi.s */,
|
||||
9DEE9C421B583FEF003E353E /* Puzzles */,
|
||||
9DEE9C271B569637003E353E /* Makefile */,
|
||||
9DEE9C281B569637003E353E /* make */,
|
||||
);
|
||||
@ -66,6 +72,18 @@
|
||||
name = make;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9DEE9C421B583FEF003E353E /* Puzzles */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9DEE9C411B583FE4003E353E /* puzzles.txt */,
|
||||
9DEE9C3E1B5837B0003E353E /* easy.puzzles */,
|
||||
9DEE9C3F1B5837B0003E353E /* hard.puzzles */,
|
||||
9DEE9C401B5837B0003E353E /* medium.puzzles */,
|
||||
9DEE9C3D1B582C3A003E353E /* generateSudoku.pl */,
|
||||
);
|
||||
name = Puzzles;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXLegacyTarget section */
|
||||
|
2
a2sudoku/easy.puzzles
Normal file
2
a2sudoku/easy.puzzles
Normal file
File diff suppressed because one or more lines are too long
@ -51,12 +51,12 @@ sub getKnown
|
||||
for ($j = 0; $j < 3; $j++) {
|
||||
$line = <>;
|
||||
chomp $line;
|
||||
$line =~ s/_/P/g;
|
||||
$line =~ s/[1-9]/S/g;
|
||||
push(@result, split(/ +/, $line));
|
||||
}
|
||||
$line = <>;
|
||||
}
|
||||
|
||||
die "Unexpected known count, " . $#result . " at $." if ($#result != 80);
|
||||
|
||||
return @result;
|
||||
}
|
||||
@ -77,6 +77,8 @@ sub getSolution
|
||||
}
|
||||
$line = <>;
|
||||
}
|
||||
|
||||
die "Unexpected solution count, " . $#result . " at $." if ($#result != 80);
|
||||
|
||||
return @result;
|
||||
}
|
||||
@ -85,34 +87,24 @@ sub getSolution
|
||||
sub generatePuzzle
|
||||
{
|
||||
my $i;
|
||||
my $result =
|
||||
" {\n" .
|
||||
" {\n" .
|
||||
" ";
|
||||
my $result;
|
||||
|
||||
for ($i = 0; $i <= $#known; $i++) {
|
||||
$result .= $known[$i] . "VAL(" . $solution[$i] . "),";
|
||||
|
||||
if ($i == $#known) {
|
||||
$result .= "\n }\n },\n";
|
||||
} elsif (($i % 27) == 26) {
|
||||
$result .= "\n\n ";
|
||||
} elsif (($i % 9) == 8) {
|
||||
$result .= "\n ";
|
||||
} elsif (($i % 3) == 2) {
|
||||
$result .= " ";
|
||||
if ($known[$i] ne "_") {
|
||||
$solution[$i] += 16;
|
||||
}
|
||||
}
|
||||
|
||||
$result = pack("C81", @solution);
|
||||
|
||||
if (length($result) != 81) {
|
||||
die "Unexpected pack length, " . length($result);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
# Turns out I run out of memory pretty quickly. I should look at
|
||||
# putting the puzzles on disk and loading them rather than building
|
||||
# them in. For now, enforce a limit to make sure we don't exceed
|
||||
# limits.
|
||||
my $limit = 50;
|
||||
while (<>) {
|
||||
chomp;
|
||||
if (/^PUZZLE:/) {
|
||||
@ -123,19 +115,26 @@ while (<>) {
|
||||
@solution = &getSolution;
|
||||
}
|
||||
|
||||
if ((/^RATING: 0/) &&
|
||||
($#easy < $limit)) {
|
||||
if (/^RATING: 0/) {
|
||||
push(@easy, &generatePuzzle);
|
||||
} elsif ((/^RATING: 1/) &&
|
||||
($#medium < $limit)) {
|
||||
} elsif (/^RATING: 1/) {
|
||||
push(@medium, &generatePuzzle);
|
||||
} elsif ((/^RATING: /) &&
|
||||
($#hard < $limit)) {
|
||||
} elsif (/^RATING: /) {
|
||||
push(@hard, &generatePuzzle);
|
||||
}
|
||||
}
|
||||
|
||||
open(FILE, ">easy.puzzles") || die "Unable to open easy.puzzles";
|
||||
print FILE pack("v", $#easy + 1);
|
||||
print FILE join("", @easy);
|
||||
close (FILE);
|
||||
|
||||
print "tPuzzle easyPuzzles[] = {\n" . join("", @easy) . "};\n\n\n";
|
||||
print "tPuzzle mediumPuzzles[] = {\n" . join("", @medium) . "};\n\n\n";
|
||||
print "tPuzzle hardPuzzles[] = {\n" . join("", @hard) . "};\n\n\n";
|
||||
open(FILE, ">medium.puzzles") || die "Unable to open medium.puzzles";
|
||||
print FILE pack("v", $#medium + 1);
|
||||
print FILE join("", @medium);
|
||||
close (FILE);
|
||||
|
||||
open(FILE, ">hard.puzzles") || die "Unable to open hard.puzzles";
|
||||
print FILE pack("v", $#hard + 1);
|
||||
print FILE join("", @hard);
|
||||
close (FILE);
|
||||
|
1
a2sudoku/hard.puzzles
Normal file
1
a2sudoku/hard.puzzles
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -206,3 +206,7 @@ then
|
||||
else
|
||||
"$JAVA" -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "$TARGETFILE" $FILETYPE < "$PROGRAM"
|
||||
fi
|
||||
|
||||
"$JAVA" -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "easy.puzzles" "bin" < "easy.puzzles"
|
||||
"$JAVA" -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "hard.puzzles" "bin" < "hard.puzzles"
|
||||
"$JAVA" -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "medium.puzzles" "bin" < "medium.puzzles"
|
||||
|
1
a2sudoku/medium.puzzles
Normal file
1
a2sudoku/medium.puzzles
Normal file
File diff suppressed because one or more lines are too long
2407
a2sudoku/puzzles.c
2407
a2sudoku/puzzles.c
File diff suppressed because it is too large
Load Diff
34800
a2sudoku/puzzles.txt
Normal file
34800
a2sudoku/puzzles.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -156,7 +156,7 @@ void loadOptions(void)
|
||||
}
|
||||
|
||||
|
||||
void shutdownUI(void)
|
||||
void saveOptions(void)
|
||||
{
|
||||
FILE *optionsFile;
|
||||
optionsFile = fopen("a2sudoku.opts", "wb");
|
||||
@ -164,7 +164,11 @@ void shutdownUI(void)
|
||||
fwrite(&gameOptions, sizeof(gameOptions), 1, optionsFile);
|
||||
fclose(optionsFile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void shutdownUI(void)
|
||||
{
|
||||
// Uninstall drivers
|
||||
tgi_uninstall();
|
||||
}
|
||||
@ -186,6 +190,7 @@ bool setOptions(void)
|
||||
{
|
||||
bool shouldUpdate = false;
|
||||
bool keepLooping = true;
|
||||
bool shouldSave = false;
|
||||
|
||||
while (keepLooping) {
|
||||
clrscr();
|
||||
@ -219,17 +224,20 @@ bool setOptions(void)
|
||||
gameOptions.difficulty = DIFFICULTY_EASY;
|
||||
else
|
||||
gameOptions.difficulty++;
|
||||
shouldSave = true;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
case 'I':
|
||||
gameOptions.showInvalid = !gameOptions.showInvalid;
|
||||
shouldSave = true;
|
||||
shouldUpdate = true;
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
case 'W':
|
||||
gameOptions.showWrong = !gameOptions.showWrong;
|
||||
shouldSave = true;
|
||||
shouldUpdate = true;
|
||||
break;
|
||||
|
||||
@ -239,6 +247,11 @@ bool setOptions(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldSave) {
|
||||
printf("\n\nSaving options...");
|
||||
saveOptions();
|
||||
}
|
||||
|
||||
clrscr();
|
||||
|
||||
return shouldUpdate;
|
||||
@ -506,12 +519,19 @@ bool playGame(void)
|
||||
{
|
||||
initUI();
|
||||
|
||||
clrscr();
|
||||
printf("\n\nLoading your puzzle for you\n Please be patient...");
|
||||
|
||||
textMode();
|
||||
|
||||
cursorX = 0;
|
||||
cursorY = 0;
|
||||
|
||||
drawGrid();
|
||||
|
||||
startGame(DIFFICULTY_EASY, updatePos);
|
||||
startGame(gameOptions.difficulty, updatePos);
|
||||
|
||||
graphicsMode();
|
||||
|
||||
while (true) {
|
||||
char ch;
|
||||
|
Loading…
x
Reference in New Issue
Block a user