You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

396 lines
8.4 KiB

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #include <unistd.h>
  6. void protokoll();
  7. void clear_screen();
  8. void willkommen();
  9. int namePruefen();
  10. void nameWaehlen();
  11. void startauswahl();
  12. void nameAusgeben();
  13. void levelauswahl();
  14. void hauptSpiel(int level);
  15. void zeichne_galgen(int versuche);
  16. void add_guessed_letter(char* guessed_letters, char guessed_letter);
  17. char eingabe_buchstabe();
  18. void lade_secret_word(char* secret_word, int level, char* path);
  19. void show_letters(char secret_word[100], char guessed_letters[100]);
  20. int letter_in_secret_word(char guessed_letter, char secret_word[100]);
  21. int has_won(char secret_word[100], char guessed_letters[100]);
  22. void level_plus();
  23. int overlay();
  24. void protokoll(){
  25. clear_screen();
  26. willkommen();
  27. namePruefen();
  28. startauswahl();
  29. }
  30. void clear_screen() {
  31. system("clear");
  32. // system("cls"); // fuer Windows
  33. // system("clear"); // fuer UNIX/Linux
  34. }
  35. void willkommen(){
  36. char ENTERtxt[] = {"-Druecke ENTER zum starten-\n"};
  37. overlay();
  38. printf("%s", ENTERtxt);
  39. getchar();
  40. }
  41. int namePruefen() {
  42. char KonfDatei[100];
  43. int laengeKonfDatei = 0;
  44. FILE *fp = NULL;
  45. fp = fopen("hangman.txt", "r");
  46. if (fp == NULL) {
  47. printf("Fehler beim Öffnen der Konfigurationsdatei\n");
  48. return 1;
  49. } else {
  50. fscanf(fp, "%s", KonfDatei); //Inhalt der KonfDatei wird ins Array gelesen
  51. while(KonfDatei[laengeKonfDatei] != 0){ //Laenge der KonfDatei wird ermittelt
  52. laengeKonfDatei++;
  53. }
  54. if(laengeKonfDatei > 14){ //mit der Laenge wird geschaut, ob ein Name gespeichert ist oder nicht
  55. fclose(fp);
  56. return 0;
  57. } else {
  58. printf("Sieht aus, als haettest du noch keinen Namen :(\n");
  59. nameWaehlen();
  60. fclose(fp);
  61. return 0;
  62. }
  63. }
  64. fclose(fp);
  65. }
  66. void nameWaehlen(){
  67. char name[50];
  68. FILE *fp = NULL;
  69. fp = fopen("hangman.txt", "w");
  70. clear_screen(); //
  71. overlay();
  72. printf("Geben Sie den Namen ein: ");
  73. scanf("%s", name);
  74. char KonfDatei[100];
  75. snprintf(KonfDatei, sizeof(KonfDatei), "name:%s,level:01", name);
  76. fprintf(fp, "%s", KonfDatei);
  77. fclose(fp);
  78. }
  79. void startauswahl() {
  80. int auswahl;
  81. int modus;
  82. clear_screen(); //
  83. overlay();
  84. printf("Willkommen ");
  85. nameAusgeben();
  86. printf("[1] Spielen\n[2] Namen aendern\n");
  87. scanf("%d", &auswahl);
  88. if(auswahl == 1){
  89. levelauswahl();
  90. } else if (auswahl == 2){
  91. nameWaehlen();
  92. } else {
  93. printf("Eingabe ungueltig");
  94. }
  95. }
  96. void nameAusgeben(){
  97. char KonfDatei[100];
  98. char name[50];
  99. int i = 5;
  100. int zaehler = 0;
  101. int nullt;
  102. FILE *fp = NULL;
  103. fp = fopen("hangman.txt", "r");
  104. fscanf(fp, "%s", KonfDatei);
  105. while(KonfDatei[i] != ','){
  106. zaehler++;
  107. i++;
  108. }
  109. nullt = zaehler;
  110. while(zaehler != 0){
  111. name[--zaehler] = KonfDatei[--i];
  112. }
  113. i = 0;
  114. while(name[i] != 0){
  115. i++;
  116. }
  117. name[nullt] = '\0';
  118. printf("%s\n", name);
  119. fclose(fp);
  120. }
  121. void levelauswahl(){
  122. char levelstr[3];
  123. char KonfDatei[100];
  124. int level;
  125. int i = 0;
  126. clear_screen(); //
  127. overlay();
  128. FILE *fp = NULL;
  129. fp = fopen("hangman.txt", "r");
  130. fscanf(fp, "%s", KonfDatei);
  131. while(KonfDatei[i] != 0){
  132. i++;
  133. }
  134. levelstr[0] = KonfDatei[i-2];
  135. levelstr[1] = KonfDatei[i-1];
  136. levelstr[2] = '\0';
  137. level = atoi(levelstr);
  138. hauptSpiel(level);
  139. fclose(fp);
  140. }
  141. void hauptSpiel(int level){
  142. char secret_word[100];
  143. int versuche = 0;
  144. char guessed_letter;
  145. char guessed_letters[100];
  146. char path[] = "hangman_words.txt";
  147. int result;
  148. int won = 0;
  149. lade_secret_word(secret_word, level, path);
  150. while (versuche < 6 && won == 0) {
  151. zeichne_galgen(versuche);
  152. show_letters(secret_word, guessed_letters);
  153. guessed_letter = eingabe_buchstabe();
  154. result = letter_in_secret_word(guessed_letter, secret_word);
  155. if (result == 0){
  156. add_guessed_letter(guessed_letters, guessed_letter);
  157. }
  158. else {
  159. versuche++;
  160. }
  161. won = has_won(secret_word, guessed_letters);
  162. }
  163. if (won == 1){
  164. level_plus();
  165. }
  166. }
  167. void zeichne_galgen(int versuche) {
  168. clear_screen();
  169. printf("Galgenmann!\n");
  170. printf("v.1.0.2\n\n");
  171. switch(versuche) {
  172. case 0:
  173. printf(" _______\n");
  174. printf(" | |\n");
  175. printf(" |\n");
  176. printf(" |\n");
  177. printf(" |\n");
  178. printf(" |\n");
  179. printf("__|_________\n\n\n\n");
  180. break;
  181. case 1:
  182. printf(" _______\n");
  183. printf(" | |\n");
  184. printf(" | O\n");
  185. printf(" |\n");
  186. printf(" |\n");
  187. printf(" |\n");
  188. printf("__|_________\n\n\n\n");
  189. break;
  190. case 2:
  191. printf(" _______\n");
  192. printf(" | |\n");
  193. printf(" | O\n");
  194. printf(" | |\n");
  195. printf(" |\n");
  196. printf(" |\n");
  197. printf("__|_________\n\n\n\n");
  198. break;
  199. case 3:
  200. printf(" _______\n");
  201. printf(" | |\n");
  202. printf(" | O\n");
  203. printf(" | /|\n");
  204. printf(" |\n");
  205. printf(" |\n");
  206. printf("__|_________\n\n\n\n");
  207. break;
  208. case 4:
  209. printf(" _______\n");
  210. printf(" | |\n");
  211. printf(" | O\n");
  212. printf(" | /|\\\n");
  213. printf(" |\n");
  214. printf(" |\n");
  215. printf("__|_________\n\n\n\n");
  216. break;
  217. case 5:
  218. printf(" _______\n");
  219. printf(" | |\n");
  220. printf(" | O\n");
  221. printf(" | /|\\\n");
  222. printf(" | /\n");
  223. printf(" |\n");
  224. printf("__|_________\n\n\n\n");
  225. break;
  226. case 6:
  227. printf(" _______\n");
  228. printf(" | |\n");
  229. printf(" | O\n");
  230. printf(" | /|\\\n");
  231. printf(" | / \\\n");
  232. printf(" |\n");
  233. printf("__|_________\n\n\n\n");
  234. break;
  235. default:
  236. break;
  237. }
  238. }
  239. void add_guessed_letter(char* guessed_letters, char guessed_letter){
  240. for (int i = 0; i < strlen(guessed_letters); i++){
  241. if (guessed_letters[i] == guessed_letter){
  242. return;
  243. }
  244. }
  245. guessed_letters[strlen(guessed_letters)] = guessed_letter;
  246. guessed_letters[strlen(guessed_letters) + 1] = '\0';
  247. }
  248. char eingabe_buchstabe(){
  249. char guess;
  250. scanf(" %c", &guess);
  251. guess = tolower(guess);
  252. return guess;
  253. }
  254. void lade_secret_word(char* secret_word, int level, char* path){
  255. FILE *file = fopen(path, "r");
  256. int count = 0;
  257. if ( file != NULL )
  258. {
  259. char line[100]; /* or other suitable maximum line size */
  260. while (fgets(line, sizeof line, file) != NULL) /* read a line */
  261. {
  262. if (count == level)
  263. {
  264. strcpy(secret_word, line);
  265. secret_word[strlen(secret_word) - 1] = '\0';
  266. return;
  267. }
  268. else
  269. {
  270. count++;
  271. }
  272. }
  273. fclose(file);
  274. }
  275. }
  276. void show_letters(char secret_word[100], char guessed_letters[100]){
  277. printf("Erratene Buchstaben: ");
  278. for(int i = 0; i < strlen(secret_word); i++) {
  279. if(strchr(guessed_letters, secret_word[i])){
  280. printf("%c ", secret_word[i]);
  281. }
  282. else{
  283. printf("_ ");
  284. }
  285. }
  286. printf("\n");
  287. }
  288. int letter_in_secret_word(char guessed_letter, char secret_word[100]){
  289. for(int i = 0; i < strlen(secret_word); i++){
  290. if(guessed_letter == secret_word[i]){
  291. return 0;
  292. }
  293. }
  294. return 1;
  295. }
  296. int has_won(char secret_word[100], char guessed_letters[100]){
  297. int occured;
  298. for (int i = 0; i < strlen(secret_word); i++){
  299. occured = 0;
  300. for (int k = 0; k < strlen(guessed_letters); k++){
  301. if (secret_word[i] == guessed_letters[k]){
  302. occured = 1;
  303. }
  304. }
  305. if (occured == 0){
  306. return 0;
  307. }
  308. }
  309. return 1;
  310. }
  311. void level_plus(){
  312. char KonfDatei[100];
  313. char levelstr[3];
  314. int i = 0;
  315. FILE *fp = NULL;
  316. fp = fopen("hangman.txt", "r+");
  317. fscanf(fp, "%s", KonfDatei);
  318. while(KonfDatei[i] != 0){
  319. i++;
  320. }
  321. levelstr[0] = KonfDatei[i-2];
  322. levelstr[1] = KonfDatei[i-1];
  323. levelstr[2] = '\0';
  324. if (levelstr[1] == '9'){
  325. KonfDatei[i-2]++;
  326. KonfDatei[i-1] = '0';
  327. } else {
  328. KonfDatei[i-1]++;
  329. }
  330. fclose(fp);
  331. fp = fopen("hangman.txt", "w");
  332. fprintf(fp, "%s", KonfDatei);
  333. fclose(fp);
  334. }
  335. int overlay(){
  336. char hangmanArt[10][41] = {
  337. " _______ ",
  338. " | | ",
  339. " | ",
  340. " | ",
  341. " | ",
  342. " | ",
  343. "__|_________\n"
  344. };
  345. printf("Galgenmann!\n");
  346. printf("v.1.0.2\n\n");
  347. for (int i = 0; i < 9; i++) {
  348. printf("%s\n", hangmanArt[i]);
  349. }
  350. return 0;
  351. }