Load puzzles from files at runtime. Save options when they change and not at quit time.

This commit is contained in:
Jeremy Rand 2015-07-16 15:04:06 -05:00
parent 7ebfde42fe
commit 0bce2a1da6
10 changed files with 34950 additions and 2368 deletions

View File

@ -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

File diff suppressed because one or more lines are too long

View File

@ -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

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -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

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

34800
a2sudoku/puzzles.txt Normal file

File diff suppressed because it is too large Load Diff

View File

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