Add undo support. Remove some puzzles because I am running out of space.

This commit is contained in:
Jeremy Rand 2015-07-16 12:05:55 -05:00
parent a4ac18ffa2
commit 72f0fe6253
4 changed files with 131 additions and 275 deletions

View File

@ -28,10 +28,19 @@ typedef struct tGameSquare {
} tGameSquare;
typedef struct tUndoMove {
tGameSquare oldSquare;
tPos x;
tPos y;
bool isValid;
} tUndoMove;
typedef struct tGame {
tGameSquare squares[BOARD_SIZE * BOARD_SIZE];
struct tPuzzle *puzzle;
tUpdatePosCallback callback;
tUndoMove undo;
} tGame;
@ -149,7 +158,7 @@ bool isSquareInvalid(tPos col, tPos row)
}
void refreshInvalid(tPos col, tPos row)
void refreshInvalid(void)
{
tPos x, y;
tGameSquare *square;
@ -184,6 +193,11 @@ bool setValueAtPos(tPos x, tPos y, tSquareVal val)
return false;
}
theGame.undo.isValid = true;
memcpy(&(theGame.undo.oldSquare), square, sizeof(*square));
theGame.undo.x = x;
theGame.undo.y = y;
if (square->value != val) {
square->value = val;
update = true;
@ -207,7 +221,7 @@ bool setValueAtPos(tPos x, tPos y, tSquareVal val)
refreshPos(x,y);
if (checkValues)
refreshInvalid(x, y);
refreshInvalid();
return true;
}
@ -220,8 +234,63 @@ bool toggleScratchValueAtPos(tPos x, tPos y, tSquareVal val)
if (square->knownAtStart) {
return false;
}
theGame.undo.isValid = true;
memcpy(&(theGame.undo.oldSquare), square, sizeof(*square));
theGame.undo.x = x;
theGame.undo.y = y;
square->scratchValues ^= (0x1 << val);
refreshPos(x, y);
return true;
}
bool undoLastMove(void)
{
tGameSquare *square;
bool update = false;
bool checkValues = false;
tPos x = theGame.undo.x;
tPos y = theGame.undo.y;
bool correct;
if (!theGame.undo.isValid)
return false;
square = &(SQUARE_XY(x, y));
if (square->knownAtStart) {
return false;
}
theGame.undo.isValid = false;
if (square->value != theGame.undo.oldSquare.value) {
square->value = theGame.undo.oldSquare.value;
update = true;
checkValues = true;
}
if (square->scratchValues != theGame.undo.oldSquare.scratchValues) {
square->scratchValues = theGame.undo.oldSquare.scratchValues;
update = true;
}
if (checkValues) {
correct = checkValueAtPos(theGame.puzzle, square->value, x, y);
if (square->correct != correct) {
square->correct = correct;
update = true;
}
}
if (update)
refreshPos(x,y);
if (checkValues)
refreshInvalid();
return true;
}

View File

@ -40,5 +40,8 @@ extern bool setValueAtPos(tPos x, tPos y, tSquareVal val);
// Returns false if unable to toggle the scratch value for some reason
extern bool toggleScratchValueAtPos(tPos x, tPos y, tSquareVal val);
// Returns false if the last move cannot be undone.
extern bool undoLastMove(void);
#endif /* defined(__a2sudoku__game__) */

View File

@ -842,81 +842,6 @@ tPuzzle easyPuzzles[] = {
PVAL(9),SVAL(8),PVAL(1), SVAL(6),PVAL(5),PVAL(2), SVAL(3),SVAL(4),PVAL(7),
}
},
{
{
PVAL(9),SVAL(1),PVAL(8), SVAL(3),PVAL(6),PVAL(4), PVAL(5),PVAL(2),PVAL(7),
PVAL(3),PVAL(2),SVAL(5), PVAL(9),PVAL(8),PVAL(7), PVAL(6),SVAL(4),PVAL(1),
PVAL(7),SVAL(4),PVAL(6), SVAL(1),PVAL(5),SVAL(2), PVAL(9),SVAL(8),PVAL(3),
PVAL(6),PVAL(5),PVAL(2), SVAL(4),PVAL(3),SVAL(8), PVAL(1),PVAL(7),PVAL(9),
PVAL(4),PVAL(9),SVAL(7), PVAL(6),PVAL(2),PVAL(1), PVAL(8),PVAL(3),SVAL(5),
PVAL(1),PVAL(8),PVAL(3), PVAL(5),SVAL(7),SVAL(9), PVAL(4),PVAL(6),SVAL(2),
PVAL(2),PVAL(6),SVAL(9), PVAL(8),PVAL(1),SVAL(3), SVAL(7),PVAL(5),PVAL(4),
PVAL(8),PVAL(7),PVAL(4), SVAL(2),PVAL(9),PVAL(5), PVAL(3),PVAL(1),SVAL(6),
SVAL(5),PVAL(3),SVAL(1), PVAL(7),SVAL(4),PVAL(6), PVAL(2),PVAL(9),PVAL(8),
}
},
{
{
PVAL(6),PVAL(7),PVAL(3), PVAL(8),PVAL(4),PVAL(2), PVAL(1),SVAL(9),PVAL(5),
SVAL(9),PVAL(1),PVAL(5), SVAL(7),PVAL(3),PVAL(6), SVAL(4),PVAL(8),SVAL(2),
PVAL(4),PVAL(2),PVAL(8), PVAL(1),PVAL(9),SVAL(5), SVAL(3),PVAL(6),PVAL(7),
PVAL(3),PVAL(4),PVAL(2), PVAL(9),PVAL(8),PVAL(7), SVAL(6),SVAL(5),PVAL(1),
SVAL(8),PVAL(6),SVAL(7), SVAL(5),PVAL(1),PVAL(3), PVAL(9),SVAL(2),PVAL(4),
PVAL(5),SVAL(9),SVAL(1), PVAL(2),PVAL(6),SVAL(4), PVAL(8),SVAL(7),PVAL(3),
PVAL(1),PVAL(5),PVAL(6), PVAL(3),PVAL(2),PVAL(9), PVAL(7),PVAL(4),PVAL(8),
PVAL(2),SVAL(3),PVAL(9), PVAL(4),PVAL(7),SVAL(8), PVAL(5),SVAL(1),PVAL(6),
SVAL(7),SVAL(8),PVAL(4), SVAL(6),SVAL(5),PVAL(1), PVAL(2),PVAL(3),PVAL(9),
}
},
{
{
PVAL(9),PVAL(8),SVAL(6), PVAL(4),SVAL(7),PVAL(5), PVAL(1),PVAL(2),PVAL(3),
PVAL(5),PVAL(1),PVAL(7), SVAL(3),PVAL(6),SVAL(2), SVAL(4),SVAL(9),SVAL(8),
PVAL(4),PVAL(2),PVAL(3), PVAL(1),PVAL(8),PVAL(9), PVAL(6),PVAL(7),SVAL(5),
PVAL(2),PVAL(9),SVAL(5), PVAL(6),PVAL(1),PVAL(8), PVAL(3),PVAL(4),PVAL(7),
PVAL(6),PVAL(4),PVAL(1), SVAL(5),SVAL(3),PVAL(7), PVAL(2),PVAL(8),SVAL(9),
PVAL(7),PVAL(3),PVAL(8), PVAL(2),PVAL(9),PVAL(4), PVAL(5),SVAL(1),SVAL(6),
SVAL(8),PVAL(6),PVAL(2), PVAL(9),PVAL(5),SVAL(1), SVAL(7),PVAL(3),SVAL(4),
SVAL(3),PVAL(7),SVAL(4), SVAL(8),PVAL(2),PVAL(6), PVAL(9),PVAL(5),PVAL(1),
PVAL(1),SVAL(5),SVAL(9), PVAL(7),PVAL(4),PVAL(3), PVAL(8),PVAL(6),PVAL(2),
}
},
{
{
SVAL(7),PVAL(8),SVAL(9), SVAL(2),PVAL(3),PVAL(1), PVAL(6),PVAL(5),PVAL(4),
PVAL(1),PVAL(3),PVAL(4), PVAL(5),PVAL(6),PVAL(7), PVAL(2),PVAL(9),SVAL(8),
SVAL(2),SVAL(5),PVAL(6), SVAL(4),PVAL(9),PVAL(8), PVAL(1),SVAL(7),SVAL(3),
SVAL(4),PVAL(1),PVAL(3), PVAL(6),SVAL(8),PVAL(5), PVAL(9),SVAL(2),PVAL(7),
PVAL(5),SVAL(7),PVAL(2), PVAL(3),SVAL(4),PVAL(9), PVAL(8),PVAL(6),PVAL(1),
PVAL(9),SVAL(6),SVAL(8), PVAL(1),PVAL(7),PVAL(2), PVAL(3),SVAL(4),PVAL(5),
PVAL(8),PVAL(2),PVAL(7), PVAL(9),PVAL(5),SVAL(3), PVAL(4),PVAL(1),SVAL(6),
SVAL(3),SVAL(4),PVAL(1), SVAL(7),SVAL(2),SVAL(6), SVAL(5),PVAL(8),PVAL(9),
PVAL(6),PVAL(9),PVAL(5), PVAL(8),PVAL(1),PVAL(4), PVAL(7),PVAL(3),PVAL(2),
}
},
{
{
PVAL(1),PVAL(2),PVAL(4), SVAL(3),PVAL(9),PVAL(5), SVAL(6),PVAL(7),SVAL(8),
PVAL(7),PVAL(8),PVAL(9), PVAL(6),SVAL(4),PVAL(2), PVAL(3),PVAL(5),PVAL(1),
PVAL(3),PVAL(6),SVAL(5), PVAL(7),SVAL(1),SVAL(8), PVAL(2),PVAL(4),PVAL(9),
PVAL(4),PVAL(9),SVAL(1), SVAL(5),SVAL(2),PVAL(6), PVAL(8),SVAL(3),PVAL(7),
SVAL(5),PVAL(7),PVAL(8), PVAL(1),PVAL(3),SVAL(9), PVAL(4),PVAL(6),PVAL(2),
PVAL(6),SVAL(3),PVAL(2), PVAL(4),PVAL(8),PVAL(7), SVAL(9),SVAL(1),PVAL(5),
SVAL(8),PVAL(4),SVAL(6), PVAL(9),PVAL(5),PVAL(1), SVAL(7),SVAL(2),PVAL(3),
PVAL(9),PVAL(1),PVAL(3), PVAL(2),PVAL(7),SVAL(4), PVAL(5),PVAL(8),PVAL(6),
PVAL(2),PVAL(5),PVAL(7), PVAL(8),PVAL(6),PVAL(3), SVAL(1),SVAL(9),PVAL(4),
}
},
};
@ -1686,81 +1611,6 @@ tPuzzle mediumPuzzles[] = {
PVAL(6),PVAL(9),PVAL(3), PVAL(5),PVAL(7),PVAL(4), PVAL(1),PVAL(8),SVAL(2),
}
},
{
{
PVAL(3),SVAL(8),PVAL(4), SVAL(9),PVAL(2),PVAL(5), PVAL(6),PVAL(7),SVAL(1),
SVAL(2),PVAL(6),PVAL(1), SVAL(8),PVAL(3),PVAL(7), PVAL(4),PVAL(9),PVAL(5),
SVAL(7),PVAL(9),SVAL(5), PVAL(6),PVAL(1),SVAL(4), PVAL(8),SVAL(3),PVAL(2),
SVAL(5),PVAL(1),PVAL(7), PVAL(2),PVAL(4),PVAL(3), SVAL(9),PVAL(6),SVAL(8),
SVAL(6),SVAL(2),PVAL(3), PVAL(1),PVAL(8),PVAL(9), PVAL(5),PVAL(4),SVAL(7),
PVAL(9),PVAL(4),PVAL(8), PVAL(7),SVAL(5),SVAL(6), PVAL(1),PVAL(2),PVAL(3),
PVAL(1),PVAL(3),PVAL(9), PVAL(4),SVAL(7),PVAL(8), PVAL(2),SVAL(5),PVAL(6),
SVAL(8),PVAL(7),SVAL(6), SVAL(5),PVAL(9),PVAL(2), PVAL(3),SVAL(1),PVAL(4),
PVAL(4),PVAL(5),PVAL(2), PVAL(3),PVAL(6),PVAL(1), PVAL(7),PVAL(8),PVAL(9),
}
},
{
{
PVAL(9),PVAL(4),PVAL(7), PVAL(5),PVAL(3),SVAL(8), PVAL(1),PVAL(6),PVAL(2),
PVAL(6),PVAL(5),PVAL(8), SVAL(2),PVAL(7),PVAL(1), PVAL(3),SVAL(4),PVAL(9),
PVAL(1),SVAL(3),PVAL(2), PVAL(9),PVAL(6),PVAL(4), PVAL(8),SVAL(5),SVAL(7),
PVAL(2),PVAL(7),SVAL(1), PVAL(6),SVAL(9),PVAL(3), PVAL(5),PVAL(8),SVAL(4),
SVAL(5),PVAL(9),SVAL(3), PVAL(8),SVAL(4),PVAL(2), PVAL(6),PVAL(7),PVAL(1),
PVAL(4),SVAL(8),SVAL(6), PVAL(1),PVAL(5),SVAL(7), PVAL(9),PVAL(2),SVAL(3),
PVAL(3),SVAL(6),PVAL(4), SVAL(7),PVAL(1),PVAL(5), SVAL(2),PVAL(9),PVAL(8),
SVAL(7),PVAL(2),PVAL(5), PVAL(3),SVAL(8),SVAL(9), PVAL(4),SVAL(1),PVAL(6),
SVAL(8),PVAL(1),PVAL(9), PVAL(4),PVAL(2),PVAL(6), PVAL(7),PVAL(3),PVAL(5),
}
},
{
{
PVAL(2),PVAL(1),PVAL(8), SVAL(6),SVAL(5),PVAL(3), PVAL(7),PVAL(9),SVAL(4),
PVAL(3),PVAL(4),PVAL(7), PVAL(9),PVAL(1),SVAL(8), SVAL(6),PVAL(2),SVAL(5),
PVAL(6),PVAL(5),PVAL(9), SVAL(2),PVAL(7),PVAL(4), PVAL(3),SVAL(1),PVAL(8),
PVAL(5),SVAL(8),PVAL(1), PVAL(4),PVAL(9),PVAL(7), PVAL(2),SVAL(6),PVAL(3),
PVAL(4),PVAL(7),SVAL(2), PVAL(8),SVAL(3),PVAL(6), PVAL(1),PVAL(5),PVAL(9),
PVAL(9),PVAL(6),SVAL(3), SVAL(5),PVAL(2),PVAL(1), SVAL(8),PVAL(4),PVAL(7),
PVAL(1),PVAL(3),SVAL(4), PVAL(7),PVAL(6),PVAL(5), PVAL(9),PVAL(8),SVAL(2),
SVAL(8),SVAL(9),PVAL(6), PVAL(3),SVAL(4),PVAL(2), PVAL(5),SVAL(7),PVAL(1),
SVAL(7),PVAL(2),PVAL(5), PVAL(1),PVAL(8),SVAL(9), PVAL(4),PVAL(3),PVAL(6),
}
},
{
{
PVAL(8),SVAL(5),PVAL(7), PVAL(6),SVAL(2),SVAL(9), PVAL(1),PVAL(4),SVAL(3),
SVAL(6),PVAL(3),PVAL(1), SVAL(7),PVAL(8),PVAL(4), PVAL(2),PVAL(9),PVAL(5),
PVAL(9),PVAL(4),PVAL(2), PVAL(1),PVAL(5),SVAL(3), SVAL(8),PVAL(7),PVAL(6),
PVAL(4),PVAL(8),PVAL(6), SVAL(2),PVAL(1),PVAL(5), PVAL(9),PVAL(3),PVAL(7),
SVAL(5),PVAL(7),SVAL(9), PVAL(8),PVAL(3),PVAL(6), PVAL(4),SVAL(1),SVAL(2),
PVAL(2),SVAL(1),PVAL(3), PVAL(4),PVAL(9),PVAL(7), SVAL(6),PVAL(5),PVAL(8),
SVAL(7),PVAL(9),PVAL(4), SVAL(5),SVAL(6),PVAL(8), PVAL(3),SVAL(2),PVAL(1),
PVAL(1),PVAL(6),PVAL(5), SVAL(3),PVAL(4),PVAL(2), PVAL(7),SVAL(8),SVAL(9),
PVAL(3),PVAL(2),SVAL(8), PVAL(9),SVAL(7),PVAL(1), PVAL(5),PVAL(6),PVAL(4),
}
},
{
{
PVAL(3),PVAL(8),PVAL(1), SVAL(9),SVAL(2),PVAL(4), PVAL(6),SVAL(5),PVAL(7),
SVAL(5),PVAL(9),PVAL(4), PVAL(6),PVAL(3),PVAL(7), SVAL(2),PVAL(8),SVAL(1),
SVAL(6),SVAL(7),PVAL(2), PVAL(8),SVAL(1),PVAL(5), SVAL(9),SVAL(3),PVAL(4),
PVAL(7),PVAL(3),PVAL(8), SVAL(1),PVAL(4),SVAL(6), PVAL(5),PVAL(2),PVAL(9),
SVAL(4),PVAL(2),SVAL(9), PVAL(5),PVAL(7),SVAL(3), SVAL(8),SVAL(1),PVAL(6),
PVAL(1),SVAL(5),PVAL(6), PVAL(2),PVAL(8),PVAL(9), PVAL(7),PVAL(4),PVAL(3),
PVAL(2),PVAL(1),PVAL(7), SVAL(3),PVAL(6),PVAL(8), PVAL(4),SVAL(9),PVAL(5),
PVAL(9),SVAL(6),SVAL(3), PVAL(4),PVAL(5),PVAL(2), PVAL(1),PVAL(7),PVAL(8),
SVAL(8),PVAL(4),PVAL(5), SVAL(7),PVAL(9),PVAL(1), PVAL(3),PVAL(6),PVAL(2),
}
},
};
@ -2440,6 +2290,21 @@ tPuzzle hardPuzzles[] = {
PVAL(2),PVAL(5),SVAL(7), SVAL(1),PVAL(9),PVAL(6), PVAL(4),PVAL(8),SVAL(3),
}
},
{
{
PVAL(9),SVAL(1),PVAL(8), SVAL(3),PVAL(6),PVAL(4), PVAL(5),PVAL(2),PVAL(7),
PVAL(3),PVAL(2),SVAL(5), PVAL(9),PVAL(8),PVAL(7), PVAL(6),SVAL(4),PVAL(1),
PVAL(7),SVAL(4),PVAL(6), SVAL(1),PVAL(5),SVAL(2), PVAL(9),SVAL(8),PVAL(3),
PVAL(6),PVAL(5),PVAL(2), SVAL(4),PVAL(3),SVAL(8), PVAL(1),PVAL(7),PVAL(9),
PVAL(4),PVAL(9),SVAL(7), PVAL(6),PVAL(2),PVAL(1), PVAL(8),PVAL(3),SVAL(5),
PVAL(1),PVAL(8),PVAL(3), PVAL(5),SVAL(7),SVAL(9), PVAL(4),PVAL(6),SVAL(2),
PVAL(2),PVAL(6),SVAL(9), PVAL(8),PVAL(1),SVAL(3), SVAL(7),PVAL(5),PVAL(4),
PVAL(8),PVAL(7),PVAL(4), SVAL(2),PVAL(9),PVAL(5), PVAL(3),PVAL(1),SVAL(6),
SVAL(5),PVAL(3),SVAL(1), PVAL(7),SVAL(4),PVAL(6), PVAL(2),PVAL(9),PVAL(8),
}
},
{
{
PVAL(8),SVAL(6),SVAL(4), SVAL(2),PVAL(9),PVAL(7), PVAL(1),PVAL(5),PVAL(3),
@ -2470,6 +2335,36 @@ tPuzzle hardPuzzles[] = {
SVAL(3),PVAL(2),SVAL(5), PVAL(1),PVAL(7),SVAL(8), PVAL(4),PVAL(6),PVAL(9),
}
},
{
{
PVAL(6),PVAL(7),PVAL(3), PVAL(8),PVAL(4),PVAL(2), PVAL(1),SVAL(9),PVAL(5),
SVAL(9),PVAL(1),PVAL(5), SVAL(7),PVAL(3),PVAL(6), SVAL(4),PVAL(8),SVAL(2),
PVAL(4),PVAL(2),PVAL(8), PVAL(1),PVAL(9),SVAL(5), SVAL(3),PVAL(6),PVAL(7),
PVAL(3),PVAL(4),PVAL(2), PVAL(9),PVAL(8),PVAL(7), SVAL(6),SVAL(5),PVAL(1),
SVAL(8),PVAL(6),SVAL(7), SVAL(5),PVAL(1),PVAL(3), PVAL(9),SVAL(2),PVAL(4),
PVAL(5),SVAL(9),SVAL(1), PVAL(2),PVAL(6),SVAL(4), PVAL(8),SVAL(7),PVAL(3),
PVAL(1),PVAL(5),PVAL(6), PVAL(3),PVAL(2),PVAL(9), PVAL(7),PVAL(4),PVAL(8),
PVAL(2),SVAL(3),PVAL(9), PVAL(4),PVAL(7),SVAL(8), PVAL(5),SVAL(1),PVAL(6),
SVAL(7),SVAL(8),PVAL(4), SVAL(6),SVAL(5),PVAL(1), PVAL(2),PVAL(3),PVAL(9),
}
},
{
{
PVAL(9),PVAL(8),SVAL(6), PVAL(4),SVAL(7),PVAL(5), PVAL(1),PVAL(2),PVAL(3),
PVAL(5),PVAL(1),PVAL(7), SVAL(3),PVAL(6),SVAL(2), SVAL(4),SVAL(9),SVAL(8),
PVAL(4),PVAL(2),PVAL(3), PVAL(1),PVAL(8),PVAL(9), PVAL(6),PVAL(7),SVAL(5),
PVAL(2),PVAL(9),SVAL(5), PVAL(6),PVAL(1),PVAL(8), PVAL(3),PVAL(4),PVAL(7),
PVAL(6),PVAL(4),PVAL(1), SVAL(5),SVAL(3),PVAL(7), PVAL(2),PVAL(8),SVAL(9),
PVAL(7),PVAL(3),PVAL(8), PVAL(2),PVAL(9),PVAL(4), PVAL(5),SVAL(1),SVAL(6),
SVAL(8),PVAL(6),PVAL(2), PVAL(9),PVAL(5),SVAL(1), SVAL(7),PVAL(3),SVAL(4),
SVAL(3),PVAL(7),SVAL(4), SVAL(8),PVAL(2),PVAL(6), PVAL(9),PVAL(5),PVAL(1),
PVAL(1),SVAL(5),SVAL(9), PVAL(7),PVAL(4),PVAL(3), PVAL(8),PVAL(6),PVAL(2),
}
},
{
{
SVAL(8),SVAL(1),PVAL(7), PVAL(6),PVAL(3),PVAL(9), PVAL(5),SVAL(2),PVAL(4),
@ -2485,126 +2380,6 @@ tPuzzle hardPuzzles[] = {
PVAL(4),PVAL(5),PVAL(6), PVAL(7),PVAL(9),PVAL(8), SVAL(2),PVAL(3),SVAL(1),
}
},
{
{
PVAL(4),PVAL(8),PVAL(6), PVAL(5),SVAL(1),PVAL(3), PVAL(7),PVAL(9),SVAL(2),
PVAL(5),PVAL(3),PVAL(2), PVAL(9),SVAL(4),PVAL(7), PVAL(6),PVAL(1),PVAL(8),
PVAL(9),SVAL(7),PVAL(1), SVAL(6),PVAL(2),SVAL(8), PVAL(5),SVAL(4),PVAL(3),
PVAL(8),SVAL(2),PVAL(4), PVAL(1),PVAL(7),PVAL(5), PVAL(9),PVAL(3),SVAL(6),
PVAL(7),SVAL(6),PVAL(3), PVAL(8),SVAL(9),PVAL(4), PVAL(1),PVAL(2),SVAL(5),
SVAL(1),PVAL(5),SVAL(9), PVAL(2),PVAL(3),PVAL(6), PVAL(8),SVAL(7),SVAL(4),
PVAL(6),PVAL(1),PVAL(7), PVAL(3),PVAL(5),PVAL(2), PVAL(4),PVAL(8),SVAL(9),
PVAL(3),PVAL(4),SVAL(8), SVAL(7),SVAL(6),PVAL(9), SVAL(2),PVAL(5),PVAL(1),
SVAL(2),PVAL(9),PVAL(5), PVAL(4),PVAL(8),PVAL(1), SVAL(3),PVAL(6),PVAL(7),
}
},
{
{
PVAL(6),PVAL(7),SVAL(4), SVAL(5),PVAL(1),PVAL(3), PVAL(8),PVAL(9),PVAL(2),
PVAL(2),PVAL(5),PVAL(3), PVAL(7),SVAL(8),PVAL(9), SVAL(6),PVAL(4),PVAL(1),
SVAL(1),PVAL(9),PVAL(8), PVAL(4),PVAL(2),SVAL(6), SVAL(3),PVAL(5),PVAL(7),
PVAL(8),PVAL(3),PVAL(1), PVAL(9),SVAL(5),SVAL(7), SVAL(4),PVAL(2),PVAL(6),
PVAL(7),SVAL(4),PVAL(6), SVAL(1),PVAL(3),PVAL(2), PVAL(5),SVAL(8),PVAL(9),
SVAL(9),SVAL(2),PVAL(5), SVAL(6),PVAL(4),PVAL(8), PVAL(7),PVAL(1),PVAL(3),
PVAL(4),PVAL(6),SVAL(9), PVAL(8),PVAL(7),PVAL(1), PVAL(2),PVAL(3),SVAL(5),
SVAL(3),PVAL(8),PVAL(7), SVAL(2),PVAL(9),PVAL(5), PVAL(1),SVAL(6),PVAL(4),
PVAL(5),SVAL(1),PVAL(2), PVAL(3),PVAL(6),SVAL(4), PVAL(9),SVAL(7),PVAL(8),
}
},
{
{
SVAL(8),PVAL(4),PVAL(1), PVAL(6),PVAL(5),SVAL(9), PVAL(3),PVAL(2),SVAL(7),
PVAL(3),PVAL(5),PVAL(6), PVAL(7),SVAL(4),PVAL(2), PVAL(8),PVAL(9),PVAL(1),
PVAL(2),PVAL(9),PVAL(7), SVAL(8),PVAL(1),SVAL(3), PVAL(5),PVAL(6),PVAL(4),
SVAL(6),PVAL(2),PVAL(5), PVAL(3),PVAL(9),SVAL(1), SVAL(4),PVAL(7),PVAL(8),
SVAL(4),PVAL(8),PVAL(9), PVAL(2),PVAL(7),PVAL(5), PVAL(1),SVAL(3),PVAL(6),
PVAL(1),PVAL(7),PVAL(3), PVAL(4),SVAL(8),SVAL(6), PVAL(9),SVAL(5),SVAL(2),
PVAL(9),PVAL(6),SVAL(8), SVAL(5),SVAL(2),PVAL(4), SVAL(7),PVAL(1),PVAL(3),
SVAL(7),SVAL(1),PVAL(2), PVAL(9),SVAL(3),PVAL(8), SVAL(6),PVAL(4),PVAL(5),
PVAL(5),SVAL(3),PVAL(4), PVAL(1),PVAL(6),PVAL(7), SVAL(2),PVAL(8),PVAL(9),
}
},
{
{
PVAL(9),PVAL(8),SVAL(5), PVAL(6),PVAL(3),SVAL(2), PVAL(4),SVAL(7),SVAL(1),
SVAL(4),PVAL(7),SVAL(1), PVAL(8),PVAL(5),PVAL(9), PVAL(2),PVAL(6),PVAL(3),
SVAL(3),PVAL(2),SVAL(6), PVAL(7),PVAL(4),PVAL(1), PVAL(9),SVAL(8),PVAL(5),
PVAL(6),PVAL(5),PVAL(9), PVAL(4),PVAL(1),SVAL(7), SVAL(3),PVAL(2),PVAL(8),
PVAL(2),PVAL(1),PVAL(3), PVAL(9),SVAL(6),SVAL(8), PVAL(5),PVAL(4),PVAL(7),
PVAL(8),PVAL(4),PVAL(7), SVAL(5),PVAL(2),PVAL(3), SVAL(6),SVAL(1),SVAL(9),
PVAL(7),SVAL(9),PVAL(4), PVAL(2),SVAL(8),PVAL(5), PVAL(1),PVAL(3),SVAL(6),
SVAL(1),PVAL(6),PVAL(8), SVAL(3),PVAL(9),PVAL(4), SVAL(7),PVAL(5),PVAL(2),
PVAL(5),PVAL(3),PVAL(2), PVAL(1),SVAL(7),PVAL(6), PVAL(8),PVAL(9),PVAL(4),
}
},
{
{
SVAL(8),PVAL(2),PVAL(4), SVAL(1),PVAL(9),PVAL(6), PVAL(7),PVAL(3),PVAL(5),
SVAL(7),PVAL(1),SVAL(6), PVAL(2),SVAL(5),SVAL(3), PVAL(8),PVAL(4),PVAL(9),
PVAL(3),PVAL(5),PVAL(9), PVAL(4),PVAL(8),PVAL(7), SVAL(1),PVAL(6),SVAL(2),
PVAL(5),SVAL(3),PVAL(1), PVAL(7),SVAL(4),PVAL(2), PVAL(9),SVAL(8),SVAL(6),
SVAL(9),SVAL(6),PVAL(2), SVAL(5),PVAL(3),PVAL(8), PVAL(4),SVAL(7),SVAL(1),
PVAL(4),PVAL(8),PVAL(7), SVAL(9),PVAL(6),PVAL(1), PVAL(5),PVAL(2),PVAL(3),
PVAL(6),PVAL(9),SVAL(5), PVAL(3),PVAL(7),PVAL(4), SVAL(2),PVAL(1),PVAL(8),
SVAL(1),SVAL(7),PVAL(8), PVAL(6),PVAL(2),PVAL(9), SVAL(3),PVAL(5),PVAL(4),
PVAL(2),PVAL(4),PVAL(3), PVAL(8),PVAL(1),PVAL(5), PVAL(6),SVAL(9),PVAL(7),
}
},
{
{
PVAL(7),PVAL(9),PVAL(6), SVAL(1),SVAL(8),PVAL(5), PVAL(2),PVAL(4),PVAL(3),
PVAL(1),SVAL(4),SVAL(3), SVAL(6),PVAL(9),PVAL(2), PVAL(7),PVAL(8),PVAL(5),
PVAL(8),SVAL(5),PVAL(2), SVAL(7),PVAL(4),PVAL(3), SVAL(6),SVAL(1),PVAL(9),
PVAL(3),PVAL(8),PVAL(5), PVAL(4),PVAL(2),PVAL(1), SVAL(9),PVAL(7),SVAL(6),
PVAL(6),SVAL(2),PVAL(4), PVAL(9),PVAL(5),SVAL(7), PVAL(1),PVAL(3),PVAL(8),
PVAL(9),PVAL(1),SVAL(7), PVAL(8),SVAL(3),PVAL(6), PVAL(4),PVAL(5),SVAL(2),
PVAL(5),PVAL(3),SVAL(9), PVAL(2),SVAL(1),SVAL(4), PVAL(8),PVAL(6),PVAL(7),
SVAL(4),SVAL(7),SVAL(8), PVAL(3),PVAL(6),SVAL(9), SVAL(5),PVAL(2),PVAL(1),
PVAL(2),PVAL(6),PVAL(1), SVAL(5),PVAL(7),SVAL(8), PVAL(3),PVAL(9),PVAL(4),
}
},
{
{
SVAL(2),PVAL(6),PVAL(5), PVAL(1),PVAL(3),SVAL(8), PVAL(9),PVAL(4),SVAL(7),
PVAL(3),PVAL(7),SVAL(9), PVAL(5),SVAL(2),PVAL(4), SVAL(1),PVAL(8),PVAL(6),
PVAL(4),SVAL(8),PVAL(1), PVAL(9),SVAL(6),PVAL(7), PVAL(2),PVAL(3),PVAL(5),
SVAL(7),PVAL(5),PVAL(4), SVAL(3),PVAL(1),SVAL(9), PVAL(8),SVAL(6),PVAL(2),
PVAL(8),SVAL(1),SVAL(2), PVAL(7),PVAL(4),PVAL(6), SVAL(5),PVAL(9),SVAL(3),
PVAL(6),SVAL(9),PVAL(3), PVAL(8),PVAL(5),PVAL(2), PVAL(4),PVAL(7),PVAL(1),
PVAL(1),SVAL(2),PVAL(8), PVAL(4),SVAL(7),PVAL(3), PVAL(6),SVAL(5),PVAL(9),
PVAL(5),PVAL(4),SVAL(7), PVAL(6),PVAL(9),PVAL(1), PVAL(3),SVAL(2),PVAL(8),
PVAL(9),PVAL(3),SVAL(6), PVAL(2),SVAL(8),PVAL(5), PVAL(7),PVAL(1),SVAL(4),
}
},
{
{
PVAL(3),PVAL(6),PVAL(7), SVAL(8),PVAL(5),PVAL(9), PVAL(2),SVAL(1),PVAL(4),
PVAL(1),SVAL(5),PVAL(8), PVAL(2),SVAL(4),SVAL(7), PVAL(9),PVAL(3),PVAL(6),
PVAL(9),PVAL(2),PVAL(4), SVAL(3),PVAL(1),SVAL(6), PVAL(5),SVAL(7),PVAL(8),
SVAL(4),PVAL(1),PVAL(5), PVAL(7),PVAL(6),PVAL(8), PVAL(3),SVAL(9),PVAL(2),
SVAL(2),SVAL(3),PVAL(6), SVAL(1),SVAL(9),PVAL(4), PVAL(7),PVAL(8),PVAL(5),
PVAL(8),PVAL(7),SVAL(9), PVAL(5),PVAL(2),PVAL(3), PVAL(4),PVAL(6),SVAL(1),
PVAL(6),SVAL(9),PVAL(2), PVAL(4),PVAL(3),SVAL(1), SVAL(8),PVAL(5),PVAL(7),
SVAL(7),PVAL(4),SVAL(3), SVAL(6),PVAL(8),PVAL(5), PVAL(1),PVAL(2),PVAL(9),
SVAL(5),PVAL(8),PVAL(1), PVAL(9),PVAL(7),SVAL(2), PVAL(6),SVAL(4),SVAL(3),
}
},
};

View File

@ -278,9 +278,9 @@ void displayInstructions(void)
"Press O to change options.\n"
"Press R to start a new game.\n"
"Press H to see this info again.\n"
"\n"
" Press O to change options or any other\n"
" key to start",
"Press U to undo your last move.\n"
" Press O to change options now or any\n"
" other key to start",
difficultyString(gameOptions.difficulty),
(gameOptions.showInvalid ? "On" : "Off"),
(gameOptions.showWrong ? "On" : "Off"));
@ -663,6 +663,15 @@ bool playGame(void)
case '(':
shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 9);
break;
case 'u':
case 'U':
shouldNotBeep = undoLastMove();
break;
default:
shouldNotBeep = false;
break;
}
if (!shouldNotBeep) {
printf("\007");