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.

397 lines
8.5 KiB

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