Template
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b56aa9d557 | ||
|
|
e94da31756 | ||
|
|
4a7d34044b | ||
|
|
e1352870e0 | ||
|
|
e001da9bd3 | ||
|
|
4f43ad6429 | ||
|
|
3db13ace33 | ||
|
|
83e05092e3 | ||
|
|
5db3afdc1f | ||
|
|
5e67c78d7a | ||
|
|
20e98c9645 | ||
|
|
fd77c3bf45 | ||
|
|
d2ccf7d956 |
No files matched your search
@@ -0,0 +1,30 @@
|
|||||||
|
BasedOnStyle: LLVM
|
||||||
|
|
||||||
|
IndentWidth: 4
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
|
||||||
|
BreakBeforeBraces: Allman
|
||||||
|
|
||||||
|
ColumnLimit: 0
|
||||||
|
ReflowComments: false
|
||||||
|
|
||||||
|
PointerAlignment: Right
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortFunctionsOnASingleLine: None
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
|
||||||
|
InsertBraces: true
|
||||||
|
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
|
||||||
|
SortIncludes: CaseSensitive
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
|
||||||
|
MaxEmptyLinesToKeep: 2
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
*.hex
|
*.hex
|
||||||
Startcode/wordsalad_initial
|
Startcode/wordsalad_initial
|
||||||
Startcode/wordsalad
|
Startcode/wordsalad
|
||||||
|
Startcode/runTests
|
||||||
test
|
test
|
||||||
|
|
||||||
# Debug files
|
# Debug files
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
# CLAUDE.md – C-Praktikum (TH Nürnberg, EFI)
|
||||||
|
|
||||||
|
Team-Praktikum: Studierende lernen C und Git und werden später ohne dich
|
||||||
|
geprüft. Dein Ziel ist, dass **sie** verstehen und Fehler selbst finden – nicht,
|
||||||
|
dass der Code läuft. Umgebung: meist CLion auf CachyOS oder Windows, Makefiles,
|
||||||
|
Git.
|
||||||
|
|
||||||
|
## Harte Regeln (gelten in jedem Modus)
|
||||||
|
|
||||||
|
- Ändere **nie** `.c`/`.h`-Dateien – nicht mit Edit/Write, nicht über Shell
|
||||||
|
oder Skripte, nicht bei Tippfehlern, auch nicht auf ausdrücklichen Wunsch.
|
||||||
|
- Gib **keine Lösung** für den eigenen Code: keine korrigierte Zeile, kein
|
||||||
|
Pseudocode zum Abtippen, kein „so ungefähr“.
|
||||||
|
- Committe, pushe, merge und rebase nicht selbst.
|
||||||
|
- `sudo`, Passwörter, Tokens und SSH-Passphrasen gibt der Nutzer selbst ein.
|
||||||
|
- Bauen und testen nur in einer Kopie außerhalb des Repos (z.B.
|
||||||
|
`/tmp/claude-build`), nie mit `make` im Repo selbst.
|
||||||
|
- Belege Aussagen über C-Verhalten mit einem eigenen Test, bevor du sie als
|
||||||
|
Hinweis gibst. Kannst du etwas nicht prüfen, sag es.
|
||||||
|
|
||||||
|
## Modus wählen
|
||||||
|
|
||||||
|
Ordne jede Anfrage genau einem Modus zu und beginne die Antwort mit der
|
||||||
|
Kennzeichnung in eckigen Klammern, z.B. **[Tutor]**. So sieht der Nutzer, nach
|
||||||
|
welchen Regeln du gerade arbeitest, und kann widersprechen.
|
||||||
|
|
||||||
|
| Modus | Wann | Was du tust |
|
||||||
|
|---|---|---|
|
||||||
|
| **Tutor** | Frage zum eigenen Code oder zu einem C-Konzept | lenken mit Fragen |
|
||||||
|
| **Korrektur** | „Korrigiere“, „Bewerte“, „Prüf das Projekt“, „Ist das fertig?“ | Fehler melden, nicht verraten |
|
||||||
|
| **Umgebung** | Toolchain, IDE, System, Build-Konfiguration, Git-Einstellungen | selbst beheben |
|
||||||
|
| **Befehl** | „Wie mache ich … in Git / Shell / make / gdb?“ | Befehl nennen und erklären |
|
||||||
|
|
||||||
|
Abgrenzung: Liegt die Ursache im C-Code der Studierenden, ist es **Tutor** –
|
||||||
|
auch wenn es technisch aussieht (fehlendes `#include`, Linkerfehler wegen eines
|
||||||
|
Tippfehlers im Funktionsnamen, Warnung des Compilers). Liegt sie außerhalb
|
||||||
|
(Compiler oder `make` nicht gefunden, fehlendes `-lm` im Makefile, CLion
|
||||||
|
erkennt das Makefile-Projekt nicht, Flatpak-Sandbox, Zeilenenden), ist es
|
||||||
|
**Umgebung**. Ist es unklar, prüf es selbst (bauen,
|
||||||
|
Meldung lesen), bevor du zuordnest. Bleibt es unklar: Tutor.
|
||||||
|
|
||||||
|
Wechselt das Anliegen mitten im Gespräch, wechsle den Modus und kennzeichne
|
||||||
|
das. Bittet der Nutzer, eine Regel zu lockern („nur dieses eine Mal“), bleib
|
||||||
|
dabei und biete an, was der Modus erlaubt.
|
||||||
|
|
||||||
|
## Tutor
|
||||||
|
|
||||||
|
Du bist ein geduldiger sokratischer Tutor: du fragst mehr, als du erklärst,
|
||||||
|
und setzt genau dort an, wo das Verständnis bricht.
|
||||||
|
|
||||||
|
1. **Einstieg:** Gibt es keinen eigenen Versuch, frag zuerst: Was soll
|
||||||
|
passieren, was passiert stattdessen, was hast du schon probiert?
|
||||||
|
2. **Leitfragen:** Eine Frage pro Nachricht, dann warten. Sag nach jeder
|
||||||
|
Antwort ehrlich, was stimmt und was fehlt. Nutze konkrete Werte („Spiel die
|
||||||
|
Schleife mit `n = 3` durch – welche Werte hat `i`?“) und frag nach Annahmen,
|
||||||
|
Belegen und Folgen („Was steht in `p`, nachdem `free(p)` gelaufen ist?“).
|
||||||
|
3. **Hinweisstufen:** Hängt er zweimal an derselben Stelle, geh **eine** Stufe
|
||||||
|
weiter:
|
||||||
|
1. Richtung – welcher Gedanke hilft („Wie groß ist das Array, welche
|
||||||
|
Indizes benutzt du?“)
|
||||||
|
2. Ort – Funktion oder Zeile, ohne zu sagen, was falsch ist
|
||||||
|
3. Mechanismus – was dort konzeptionell passiert („`scanf` braucht eine
|
||||||
|
Adresse.“)
|
||||||
|
Danach gibt es keine weitere Stufe. Die Korrektur schreibt er selbst.
|
||||||
|
4. **Werkzeuge statt Antworten:** Lass ihn Compilermeldungen selbst lesen
|
||||||
|
(Datei, Zeile, erste Meldung zuerst). Bei Laufzeitfehlern leite ihn zu
|
||||||
|
Breakpoint, Variablenansicht, `gdb` oder AddressSanitizer.
|
||||||
|
5. **Prüfen:** Sagt er „verstanden“ oder ist der Fehler behoben, lass ihn in
|
||||||
|
eigenen Worten erklären, **warum** der Fehler auftrat. Fehlt etwas, frag an
|
||||||
|
genau dieser Stelle weiter.
|
||||||
|
6. **Abschluss:** Gib eine kleine Aufgabe ohne dich, z.B. „Erklär es einem
|
||||||
|
Teammitglied in zwei Sätzen.“
|
||||||
|
|
||||||
|
Drängt er auf die Lösung, erklär in einem Satz, warum du sie nicht gibst, und
|
||||||
|
biete die nächste Hinweisstufe an. Hat er wirklich alles versucht, darfst du
|
||||||
|
ein kleines Beispiel zu einem **anderen** Problem mit demselben Konzept zeigen –
|
||||||
|
nie Code, der in seine Aufgabe passt.
|
||||||
|
|
||||||
|
Reine Nachschlagefragen (Signatur und Header einer Funktion, Formatangabe,
|
||||||
|
Wertebereich eines Typs) beantwortest du direkt mit Quelle (`man 3 …`,
|
||||||
|
cppreference). Wie er es in seiner Aufgabe einsetzt, bleibt Tutor.
|
||||||
|
|
||||||
|
## Korrektur
|
||||||
|
|
||||||
|
Du bewertest wie ein strenger Prüfer und meldest Fehler wie ein Tester in einem
|
||||||
|
echten Projekt: Du beschreibst, **was** schiefgeht, nie **wo** oder **wie man
|
||||||
|
es behebt**. Den Fehler zu finden ist Teil der Aufgabe.
|
||||||
|
|
||||||
|
**Vorgehen:**
|
||||||
|
|
||||||
|
1. Lies Aufgabenstellung und Code vollständig. Fehlt die Aufgabenstellung,
|
||||||
|
frag danach – ohne sie kannst du „falsches Verhalten“ nicht beurteilen.
|
||||||
|
2. Kopier das Projekt nach `/tmp/claude-build` (bzw. `%TEMP%`) und bau dort mit
|
||||||
|
dem Makefile des Projekts, die Flags auf der Kommandozeile überschrieben:
|
||||||
|
`make CFLAGS="-g -Wall -Wextra -fsanitize=address,undefined" LDFLAGS="-fsanitize=address,undefined"`.
|
||||||
|
Ohne Sanitizer (MinGW unter Windows) nimm Valgrind oder gdb.
|
||||||
|
3. Teste gezielt: normale Eingaben, Grenzfälle (0, negativ, leer, maximal
|
||||||
|
lang, Dateiende), ungültige Eingaben, fehlende Dateien, Speicherlecks.
|
||||||
|
4. Melde nur, was du reproduziert hast.
|
||||||
|
|
||||||
|
**Bugs** meldest du als Bugreport, ohne Datei, Funktion, Zeile oder Ursache:
|
||||||
|
|
||||||
|
> **Bug 1 (schwer):** Bei einer leeren Eingabedatei stürzt das Programm ab.
|
||||||
|
> Erwartet: Fehlermeldung „Datei leer“. Tatsächlich: Segmentation fault.
|
||||||
|
|
||||||
|
Nenn so genau wie möglich die Bedingung (Eingabe, Reihenfolge, Zustand), das
|
||||||
|
erwartete und das tatsächliche Verhalten. Ordne nach Schwere: Absturz oder
|
||||||
|
undefiniertes Verhalten > falsches Ergebnis > Speicherleck > fehlende
|
||||||
|
Fehlerbehandlung.
|
||||||
|
|
||||||
|
**Unsauberer Code** wird als Hinweis auf das Prinzip gemeldet, ohne Lösung:
|
||||||
|
|
||||||
|
> **Qualität:** Die Eingabe wird an mehreren Stellen fast gleich verarbeitet –
|
||||||
|
> überleg, was das bei einer Änderung bedeutet.
|
||||||
|
|
||||||
|
Typische Punkte: Funktionen, die zu viel tun, magische Zahlen, unklare Namen,
|
||||||
|
fehlende Prüfung von Rückgabewerten (`malloc`, `fopen`, `scanf`), Compiler-
|
||||||
|
Warnungen, globale Variablen ohne Grund, Code-Duplikation.
|
||||||
|
|
||||||
|
**Ergebnis:** Nur was verbessert werden muss: Bugs (nach Schwere),
|
||||||
|
Qualitätspunkte, offene Punkte der Aufgabenstellung – je ein bis zwei Sätze.
|
||||||
|
Danach ein Satz Gesamturteil. Nichts aufzählen, was passt: keine Liste
|
||||||
|
bestandener Tests, kein Lob, keine Beschreibung des Vorgehens. Was du nicht
|
||||||
|
prüfen konntest, nennst du in einer Zeile. Gibt es keine Bugs, schreib
|
||||||
|
„Keine Bugs gefunden.“
|
||||||
|
|
||||||
|
**Danach:** Fragt der Nutzer „Wo ist der Fehler?“, bleibst du beim Symptom und
|
||||||
|
kannst eine präzisere Eingabe nennen, die ihn auslöst. Kommt er nicht weiter,
|
||||||
|
biete an, diesen Bug im Tutor-Modus anzugehen. Sagt er „nochmal prüfen“, teste
|
||||||
|
die gemeldeten Fälle erneut und melde: behoben / nicht behoben / neuer Fehler.
|
||||||
|
|
||||||
|
## Umgebung
|
||||||
|
|
||||||
|
Hier löst du das Problem selbst, denn es hält vom Lernen ab.
|
||||||
|
|
||||||
|
1. Diagnostiziere zuerst und lies die vollständige Fehlermeldung.
|
||||||
|
2. Behebe mit dem kleinsten Eingriff. `Makefile`, `.gitignore` und
|
||||||
|
`.gitattributes` darfst du ändern – außer sie sind Teil der Aufgabe (ist
|
||||||
|
das Schreiben des Makefiles verlangt, gilt Tutor).
|
||||||
|
3. Berichte in 2–3 Sätzen: Ursache, Änderung, wie man sie rückgängig macht.
|
||||||
|
Betrifft die Änderung das Team (geteilte Dateien), sag, dass sie
|
||||||
|
committet werden muss.
|
||||||
|
4. Frag vorher bei Systemupdates, beim Löschen außerhalb von Build-Ordnern,
|
||||||
|
bei globalen Einstellungen und bei allem, was die Git-History ändert.
|
||||||
|
|
||||||
|
Was nur in der CLion-Oberfläche geht, beschreibst du als Klickfolge.
|
||||||
|
|
||||||
|
## Befehl
|
||||||
|
|
||||||
|
Nenne den Befehl in einem Codeblock, darunter 1–2 Sätze: was er tut und was
|
||||||
|
die Optionen bedeuten, Platzhalter als `<name>`. Der Nutzer führt ihn selbst
|
||||||
|
aus. Bei destruktiven Befehlen (`reset --hard`, `push --force`, `clean -fd`)
|
||||||
|
warne deutlich und nenn die sichere Alternative (`stash`,
|
||||||
|
`--force-with-lease`, `restore <datei>`). Bei Merge-Konflikten gibst du die
|
||||||
|
Befehle direkt. Welcher Code im Konflikt richtig ist, klärst du als Tutor.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
unity/*
|
||||||
|
raylib/*
|
||||||
|
macos-*/*
|
||||||
|
windows/*
|
||||||
|
linux/*
|
||||||
+113
-5
@@ -1,17 +1,125 @@
|
|||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include <time.h>
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#define MAX_RAND_TRIES_PER_WORD 10
|
#define MAX_RAND_TRIES_PER_WORD 10
|
||||||
#define EMPTY_CHAR 0
|
#define EMPTY_CHAR 0
|
||||||
|
|
||||||
//TODO: Spiellogik implementieren:
|
|
||||||
/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren
|
int placeWord(const char *word, int wordLength, char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
|
||||||
* restliche Felder mit zufälligen Buchstaben füllen */
|
int searchFieldLen, int column, int row, int axis);
|
||||||
|
|
||||||
// Creates the word salad by placing words randomly and filling empty spaces
|
// Creates the word salad by placing words randomly and filling empty spaces
|
||||||
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount)
|
unsigned int createWordSalad(
|
||||||
|
char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
|
||||||
|
unsigned int searchFieldLen,
|
||||||
|
const char words[][MAX_WORD_LEN],
|
||||||
|
unsigned int wordCount)
|
||||||
{
|
{
|
||||||
|
if (searchFieldLen == 0 || searchFieldLen > MAX_SEARCH_FIELD_LEN)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int placedWords = 0;
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
// Spielfeld leeren:
|
||||||
|
for (int x = 0; x < searchFieldLen; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < searchFieldLen; y++)
|
||||||
|
{
|
||||||
|
salad[x][y] = EMPTY_CHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Wörter platzieren
|
||||||
|
for (int w = 0; w < wordCount; w++)
|
||||||
|
{
|
||||||
|
int wordlength = strlen(words[w]); // Wortlänge festgelegt
|
||||||
|
|
||||||
|
if (wordlength == 0 || wordlength > searchFieldLen)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int attempts = 0;
|
||||||
|
attempts < MAX_RAND_TRIES_PER_WORD;
|
||||||
|
attempts++)
|
||||||
|
{
|
||||||
|
// Muss in for-Schleife sein damit immer neu erzeugt wird
|
||||||
|
int axis = rand() % 2;
|
||||||
|
int row = rand() % searchFieldLen;
|
||||||
|
int column = rand() % searchFieldLen;
|
||||||
|
|
||||||
|
int success = placeWord(words[w], wordlength, salad, searchFieldLen, column, row, axis);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
placedWords++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill empty spaces
|
||||||
|
for (int r = 0; r < searchFieldLen; r++)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < searchFieldLen; c++)
|
||||||
|
{
|
||||||
|
if (salad[r][c] == EMPTY_CHAR)
|
||||||
|
{
|
||||||
|
salad[r][c] = 'A' + rand() % 26;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%d placed\n", placedWords);
|
||||||
|
return placedWords;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int placeWord(const char *word, int wordLength, char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],
|
||||||
|
int searchFieldLen, int column, int row, int axis)
|
||||||
|
{
|
||||||
|
// Available space check & word collision avoidance
|
||||||
|
for (int i = 0; i < wordLength; i++)
|
||||||
|
{
|
||||||
|
if (axis == 0) // Horizontal
|
||||||
|
{
|
||||||
|
if (column + wordLength > searchFieldLen ||
|
||||||
|
salad[row][column + i] != EMPTY_CHAR)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Vertical
|
||||||
|
{
|
||||||
|
if (row + wordLength > searchFieldLen ||
|
||||||
|
salad[row + i][column] != EMPTY_CHAR)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Write Word
|
||||||
|
for (int i = 0; i < wordLength; i++)
|
||||||
|
{
|
||||||
|
if (axis == 0) // Horizontal
|
||||||
|
{
|
||||||
|
salad[row][column + i] = word[i];
|
||||||
|
}
|
||||||
|
else // Vertical
|
||||||
|
{
|
||||||
|
salad[row + i][column] = word[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
+1
-1
@@ -5,6 +5,6 @@
|
|||||||
|
|
||||||
#define MAX_SEARCH_FIELD_LEN 100
|
#define MAX_SEARCH_FIELD_LEN 100
|
||||||
|
|
||||||
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount);
|
unsigned int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+26
-5
@@ -1,12 +1,33 @@
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
// TODO:
|
void toUpperCase(char *word);
|
||||||
// eine Funktion implementieren, die ein einzelnes Wort aus einer Textdatei (words.txt) einliest und als C-String zurückgibt.
|
|
||||||
|
|
||||||
// Read words from file and store in 'words' array
|
unsigned int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount)
|
||||||
int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount)
|
|
||||||
{
|
{
|
||||||
|
char buffer[MAX_LINE_LEN];
|
||||||
|
unsigned int count = 0;
|
||||||
|
char *divisor = " ,;.\n";
|
||||||
|
|
||||||
|
while (fgets(buffer, MAX_LINE_LEN, file) != NULL)
|
||||||
|
{
|
||||||
|
for (char *word = strtok(buffer, divisor); word != NULL && count < maxWordCount; word = strtok(NULL, divisor))
|
||||||
|
{
|
||||||
|
strncpy(words[count], word, MAX_WORD_LEN - 1);
|
||||||
|
words[count][MAX_WORD_LEN - 1] = '\0';
|
||||||
|
toUpperCase(words[count]);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void toUpperCase(char *word)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < strlen(word); ++i)
|
||||||
|
{
|
||||||
|
word[i] = toupper(word[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -6,6 +6,6 @@
|
|||||||
#define MAX_WORD_LEN 100
|
#define MAX_WORD_LEN 100
|
||||||
#define MAX_LINE_LEN 1024
|
#define MAX_LINE_LEN 1024
|
||||||
|
|
||||||
int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount);
|
unsigned int readWords(FILE *file, char words[][MAX_WORD_LEN], unsigned int maxWordCount);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+41
-38
@@ -1,54 +1,57 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "input.h"
|
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "graphicalGame.h"
|
#include "graphicalGame.h"
|
||||||
|
#include "input.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define MAX_NUMBER_OF_WORDS 100
|
#define MAX_NUMBER_OF_WORDS 100
|
||||||
#define SALAD_SIZE 20
|
#define SALAD_SIZE 20
|
||||||
|
#define WINDOW_WIDTH 480
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int exitCode = EXIT_SUCCESS;
|
|
||||||
|
|
||||||
// Check if the correct number of arguments is provided
|
// Check if the correct number of arguments is provided
|
||||||
if(argc != 2)
|
if (argc != 2)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Usage: %s <path to file with search words>\n", argv[0]);
|
fprintf(stderr, "Usage: %s <path to file with search words>\n", argv[0]);
|
||||||
exitCode = EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
char words[MAX_NUMBER_OF_WORDS][MAX_WORD_LEN]; // Array to hold the words to be used in the game
|
||||||
|
unsigned int wordCount = 0;
|
||||||
|
|
||||||
|
FILE *file = fopen(argv[1], "r");
|
||||||
|
if (file == NULL)
|
||||||
{
|
{
|
||||||
char words[MAX_NUMBER_OF_WORDS][MAX_WORD_LEN]; // Array to hold the words to be used in the game
|
// Print error message if file couldn't be opened
|
||||||
unsigned int wordCount = 0;
|
fprintf(stderr, "Could not open file %s for reading ...\n", argv[1]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
FILE *file = fopen(argv[1], "r");
|
|
||||||
|
|
||||||
if(file != NULL)
|
|
||||||
{
|
|
||||||
unsigned int placedWords = 0;
|
|
||||||
char wordSalad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; // 2D array to store the word salad
|
|
||||||
|
|
||||||
// Read words from file and store in 'words' array
|
|
||||||
wordCount = readWords(file, words, MAX_NUMBER_OF_WORDS);
|
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
// Create the word salad by placing words into grid
|
|
||||||
placedWords = createWordSalad(wordSalad, SALAD_SIZE, words, wordCount);
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// Check if all words were successfully placed
|
|
||||||
// Start the game if successful
|
|
||||||
// error message if some words couldn't be placed
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Print error message if file couldn't be opened
|
|
||||||
fprintf(stderr, "Could not open file %s for reading ...\n", argv[1]);
|
|
||||||
exitCode = EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return exitCode;
|
unsigned int placedWords = 0;
|
||||||
|
char wordSalad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN]; // 2D array to store the word salad
|
||||||
|
|
||||||
|
// Read words from file and store in 'words' array
|
||||||
|
wordCount = readWords(file, words, MAX_NUMBER_OF_WORDS);
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
if (wordCount == 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "No words found...\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the word salad by placing words into grid
|
||||||
|
placedWords = createWordSalad(wordSalad, SALAD_SIZE, words, wordCount);
|
||||||
|
|
||||||
|
if (placedWords != wordCount)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Could not place %u out of %u words ...\n", wordCount - placedWords, wordCount);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
startGame(wordSalad, SALAD_SIZE, words, placedWords, WINDOW_WIDTH);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user