Ich würde das ganze wie folgt angehen:
Das Framework für die GUI
Um solch ein Sudoku auf dem Bildschirm anzuzeigen, benötigst du eine Bibliothek zum Erstellen der graphischen Benutzeroberfläche. Bei solch einem Projekt würde ich eine möglichst minimalistische und einfache Bibliothek wählen. Möglichkeiten hierfür wären:
- imgui (Würde ich empfehlen)- Hätte zudem den Vorteil das du dein Sudoku später relativ leicht noch mit allen möglichen OpenGL basierten Animationen erweitern kannst). Hinweise: Bei imgui brauchst du allerdings noch andere Bibliotheken, um den OpenGL Kontext zu erstellen (Kannst du natürlich auch selbst machen, aber dann wird dein Programm zum Erstellen des Kontextes länger als dein eigentliches Sudoku). Eine Möglichkeit hierfür wäre beispielsweise eine Kombination aus GLFW (Kannst du für deinen Timer auch gleich platformübergreifend auf die Systemzeit zugreifen) und Glad.
- WINAPI - Wenn du wirklich so wenig Bibliotheken wie möglich nutzen möchtest, kannst du natürlich auch direkt auf API von Windows zurückgreifen (funktioniert dann natürlich auch nur auf windows).
- GTK - ist zwar alles andere als minimalistisch, sollte auf dieser Liste aber auch nicht fehlen.
Die Struktur der GUI
Bei eigentlich jedem Framework würde ich dann mit einem Table/Grid aus Eingabefeldern arbeiten. Ist die Eingabe falsch/ungültig, würde ich diese dann einfach vom Code aus rot färben. Dinge wie die Aktualisierung der GUI oder die Überprüfung der Eingabe würde ich in jedem Fall in extra Funktionen auslagern.
Datenstrukturen
Damit dein Programm in irgendeiner Form übersichtlich bleibt, würde ich für alles was über ein paar Variablen hinaus geht ein struct implementieren. Beim Sodoku könnte das von der grundlegenden Struktur beispielsweise irgendwie so aussehen:
struct SCoord {
int x;
int y;
SCoord(int _x, int _y) {
x = _x;
y = _y;
}
};
struct Field {
int value;
bool editable;
// ...
};
struct Sodoku {
Field fields[9][9];
// Generiert ein neues Sodoku
Sodoku();
// Lädt ein Sodoku aus einer Datei
Sodoku(const char* path);
void setField(SCoord coord);
bool isValid();
bool isFieldValid(SCoord coord);
// ...
};
// ...
Ich hoffe ich konnte dir weiterhelfen :-)