summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile22
-rw-r--r--README1
-rw-r--r--board.c77
-rw-r--r--board.h12
-rw-r--r--main.c46
5 files changed, 158 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..a4ccc66
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,22 @@
+PREFIX = /usr/local
+
+CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -O3
+NCURSES = -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -lncurses -ltinfo
+
+CC = cc
+
+SRC = main.c board.c
+TARGET = sudoku
+
+all:
+ ${CC} ${SRC} -o ${TARGET} ${CFLAGS} ${NCURSES}
+
+install: all
+ ${CC} ${NCURSES} ${CFLAGS} ${SRC} -o ${TARGET}
+ cp -f sudoku ${DESTDIR}${PREFIX}/bin
+ chmod 755 ${DESTDIR}${PREFIX}/bin/${TARGET}
+
+uninstall:
+ rm -f ${DESTDIR}${PREFIX}/bin/${TARGET}
+
+
diff --git a/README b/README
new file mode 100644
index 0000000..364063d
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+This is a very slow and predictable sudoku puzzle generator
diff --git a/board.c b/board.c
new file mode 100644
index 0000000..4b9fb7c
--- /dev/null
+++ b/board.c
@@ -0,0 +1,77 @@
+#include <ncurses.h>
+#include <stdlib.h>
+#include <time.h>
+#include "board.h"
+
+int puzzle[81];
+int total = 0;
+
+void puzzle_swap(int puzzle[81]);
+
+void generate_first_line(int puzzle[81]) {
+ srand ( time(NULL) );
+ for (int i=0; i < 9; i++) {
+ puzzle[i] = i + 1;
+ }
+
+ for (int i=0; i < 9; i++) {
+ int random = (rand() % 9);
+ int swap;
+
+ swap = puzzle[random];
+ puzzle[random] = puzzle[i];
+ puzzle[i] = swap;
+
+ }
+}
+
+void print_puzzle(int puzzle[81], bool reveal) {
+ for (int i=0; i < 81; i++) {
+ if ( i == 0 ) printw(" SUDOKU");
+ if ( i % 9 == 0 ) printw("\n");
+ else if ( i % 3 == 0 ) printw("|");
+ if ( i != 0 && i % 27 == 0 ) printw(" ===========================\n");
+
+ if (puzzle[i] & 2) printw("%2d ", puzzle[i]);
+ else if ( reveal == true ) printw("%2d ", puzzle[i]);
+ else printw(" ");
+ }
+}
+
+void generate_puzzle(int puzzle[81]){
+ for (int i=9; i < 81; i++){
+ /* way too much nonsense to make a valid board
+ * "The seed row method" -> https://sudokupulse.com/articles/how-to-create-sudoku-puzzles/
+ * row 2 */
+ if ( i < 15) puzzle[i] = puzzle[i-6];
+ else if ( i >= 15 && i < 18 ) puzzle[i] = puzzle[i-15];
+ /* row 3 */
+ else if ( i >= 18 && i < 24 ) puzzle[i] = puzzle[i-6];
+ else if ( i >= 24 && i < 27 ) puzzle[i] = puzzle[i-15];
+ /* row 4 */
+ else if ( i >= 27 && i < 35 ) puzzle[i] = puzzle[i-26];
+ else if ( i == 35 ) puzzle[i] = puzzle[i-35];
+ /* row 5 */
+ else if ( i >= 36 && i < 42 ) puzzle[i] = puzzle[i-6];
+ else if ( i >= 42 && i < 45 ) puzzle[i] = puzzle[i-15];
+ /* row 6 */
+ else if ( i >= 45 && i < 51 ) puzzle[i] = puzzle[i-6];
+ else if ( i >= 51 && i < 54 ) puzzle[i] = puzzle[i-15];
+ /* row 7 */
+ else if ( i >= 54 && i < 62 ) puzzle[i] = puzzle[i-26];
+ else if ( i == 62 ) puzzle[i] = puzzle[i-35];
+ /* row 8 */
+ else if ( i >= 63 && i < 69 ) puzzle[i] = puzzle[i-6];
+ else if ( i >= 69 && i < 72 ) puzzle[i] = puzzle[i-15];
+ /* row 9 */
+ else if ( i >= 72 && i < 78 ) puzzle[i] = puzzle[i-6];
+ else if ( i >= 78 && i < 81 ) puzzle[i] = puzzle[i-15];
+
+ puzzle_swap(puzzle);
+
+ }
+}
+
+void puzzle_swap(int puzzle[81]) {
+
+}
diff --git a/board.h b/board.h
new file mode 100644
index 0000000..becb68e
--- /dev/null
+++ b/board.h
@@ -0,0 +1,12 @@
+#ifndef BOARD_H_ /* Include guard */
+#define BOARD_H_
+
+extern int puzzle[81];
+
+void generate_first_line(int puzzle[81]);
+void generate_puzzle(int puzzle[81]);
+
+void print_puzzle(int puzzle[81], bool reveal);
+
+#endif // BOARD_H_
+
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..b79f16d
--- /dev/null
+++ b/main.c
@@ -0,0 +1,46 @@
+#include <ncurses.h>
+#include <stdlib.h>
+#include "board.h"
+
+int main(void) {
+ initscr(); /* Start curses mode */
+ if(has_colors() == FALSE)
+ { endwin();
+ printf("Your terminal does not support colour\n");
+ return 1;
+ }
+ start_color(); /* Start color */
+ noecho();
+ curs_set(0);
+ /* End of ncurses init nonsense */
+
+ int ch;
+ bool reveal = false;
+ generate_first_line(puzzle);
+ generate_puzzle(puzzle);
+
+ while (1) {
+ print_puzzle(puzzle, reveal);
+
+ ch = getch();
+ switch (ch) {
+ case 'q':
+ endwin();
+ return 1;
+ break;
+ case 'g':
+ reveal = false;
+ generate_first_line(puzzle);
+ generate_puzzle(puzzle);
+ break;
+ case 'r':
+ if ( reveal == true ) reveal = false;
+ else reveal = true;
+ break;
+ }
+ clear();
+ };
+
+ endwin(); /* End curses mode */
+ return 0;
+}