diff --git a/a2sudoku/game.c b/a2sudoku/game.c index e58d8ce..7ecc7ae 100644 --- a/a2sudoku/game.c +++ b/a2sudoku/game.c @@ -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; } \ No newline at end of file diff --git a/a2sudoku/game.h b/a2sudoku/game.h index 2c5e073..dd15208 100644 --- a/a2sudoku/game.h +++ b/a2sudoku/game.h @@ -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__) */ diff --git a/a2sudoku/puzzles.c b/a2sudoku/puzzles.c index 6be2273..0052c05 100644 --- a/a2sudoku/puzzles.c +++ b/a2sudoku/puzzles.c @@ -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), - } - }, }; diff --git a/a2sudoku/ui.c b/a2sudoku/ui.c index 065b61e..aff8daf 100644 --- a/a2sudoku/ui.c +++ b/a2sudoku/ui.c @@ -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");