Schere, Stein, Papier
-
Vielen Dank an alle, die beim fehlerbeheben geholfen haben. Das Programm läuft jetzt so, wie ich mir das vorgestellt hatte!
Ich wäre dankbar, wenn ihr noch strukturelle Besserungsvorschläge hättet.
nochmal der aktuelle, fertige Code:#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> #include <string.h> #define AE (unsigned char)142 #define ae (unsigned char)132 #define OE (unsigned char)153 #define oe (unsigned char)148 #define UE (unsigned char)154 #define ue (unsigned char)129 #define ss (unsigned char)225 int main() { SetConsoleTitle("Schere, Stein, Papier!"); srand(time(0)); int wahl1; //VAR für "Neues Spiel" oder "Programm beenden" int punkte_pc=0; //Punkte des Computers int punkte_spieler=0; //Punkte des Spielers int wahl_spieler; //Wahl des Spielers int wahl_pc; //Wahl des PCs int neue_runde=1; //"Neue Runde"...1 oder 2 printf("Willkommen zu Schere, Stein, Papier!\n"); printf("1. Neues Spiel starten!\n"); printf("2. Das Programm beenden\n"); printf("Was wollen Sie tun: "); scanf("%i", &wahl1); system("cls"); if(wahl1==1) { do { printf("Sie haben nun 3 Moglichkeiten: \n", oe); printf(" 1. Schere\n"); printf(" 2. Stein\n"); printf(" 3. Papier\n"); printf("Was wollen Sie tun?: "); scanf("%i", &wahl_spieler); wahl_pc=1+(rand()%(4-1)); //Wahl des PCs wird generiert printf("Sie haben %i ausgew%chlt!\n", wahl_spieler, ae); printf("Der PC hat %i ausgew%chlt!\n", wahl_pc, ae); //Eigentliches Vergleichen der Wahl - Schere if(wahl_spieler==wahl_pc) { printf("Unentschieden...Niemand bekommt einen Punkt!\n"); } if(wahl_spieler==1 && wahl_pc==2) { printf("Der Computer gewinnt...er bekommt einen Punkt!\n"); punkte_pc++; } if(wahl_spieler==1 && wahl_pc==3) { printf("Sie gewinnen...Sie bekommen einen Punkt!\n"); punkte_spieler++; } //Eigentliches Vergleichen der Wahl - Stein if(wahl_spieler==2 && wahl_pc==1) { printf("Sie gewinnen...Sie bekommen einen Punkt!\n"); punkte_spieler++; } if(wahl_spieler==2 && wahl_pc==3) { printf("Der Computer gewinnt...er bekommt einen Punkt!\n"); punkte_pc++; } //Eigentliches Vergleichen der Wahl - Papier if(wahl_spieler==3 && wahl_pc==1) { printf("Der Computer gewinnt...er bekommt einen Punkt!\n"); punkte_pc++; } if(wahl_spieler==3 && wahl_pc==2) { printf("Sie gewinnen...Sie bekommen einen Punkt!\n"); punkte_spieler++; } printf("Spieler: %i\n", punkte_spieler); printf("PC: %i\n", punkte_pc); printf("M%cchten Sie eine neue Runde starten? (1=ja, 2=nein)", oe); scanf("%i", &neue_runde); system("cls"); } while(neue_runde==1); return 0; } if(wahl1==2) { return 0; } system("PAUSE"); return 0; }
-
Ich würde auf die Frage am Anfang verzichten.
Gib den aktuellen Punktestand aus und lass dem User die Wahl 1, 2, 3 und 0 (für Programm verlassen).Das system() kann auch weg. Mach einfach ein paar Leerzeilen (3 reichen)
Und wenn du Probleme mit Umlauten hast, dann nutze sie nicht.
-
Wenn du das Windowszeugs entfernst, funktioniert es sogar unter Unix:
-
DirkB schrieb:
Da ist noch ein '\n' (die Enter-Taste) im Tastatur-Puffer.
Versuch mal
scanf(" %i", &neue_runde);
Da ist ein Leerzeichen vor dem %.
Nein das bringt nichts. Whitespaces direkt vor Formatspezifizierern sind redundant.
scanf("%i"
ist äquivalent zu
scanf(" %i"
ist äquivalent zu
scanf(" %i"
ist äquivalent zu
scanf("\n%i"
ist äquivalent zu
scanf("\t%i"
ist äquivalent zu
scanf("\n \t %i"
ist äquivalent zu
...
-
Ersetz mal deine vielen if-abfragen durch sowas wie
/* ----->8------->8------->8------->8------->8------ */ /* +1: erste Dimension gewinnt */ /* -1: erste Dimension verliert */ /* 0: Unentschieden */ int gewinn_matrix[][] = { /* SCHERE, STEIN, PAPIER */ {0, +1, -1}, /* SCHERE */ {-1, 0, +1}, /* STEIN */ {+1, -1, 0} /* PAPIER */ } /* ----->8------->8------->8------->8------->8------ */ switch (gewinn_matrix[wahl_spieler][wahl_pc]) { case +1: printf("du hast gewonnen\n"); break; case -1: printf("du hast verloren\n"); break; default: printf("unentschieden\n"); } /* ----->8------->8------->8------->8------->8------ */
Das macht deinen Code um einiges lesbarer.
-
mazal schrieb:
Das macht deinen Code um einiges lesbarer.
Das bezweifle ich.
Aber symbolische Konstanten statt magic numbers wären nett.if(wahl_spieler==SCHERE && wahl_pc==STEIN) { printf("Der Computer gewinnt...er bekommt einen Punkt!\n"); punkte_pc++; }
Das Folgende ist auch nicht gut zu lesen.
int wergewinnt=(wahl_spieler+2-wahl_pc)%3;//0:Sie, 1:Computer, 2:Unentschieden
-
volkard schrieb:
Das Folgende ist auch nicht gut zu lesen.
int wergewinnt=(wahl_spieler+2-wahl_pc)%3;//0:Sie, 1:Computer, 2:Unentschieden
Halte meine Variante zwar für verständlicher, aber was er wirklich machen sollte, ist irgendwie ausrechnen wer gewonnen hat und erst dann Ausgeben, damit, wenn er mal die Ausgabe ändert, dies nicht gleich an drei Stellen machen muss. Aber das brauch ich dir wohl nicht zu erklären
Im Übrigen mach ich das eigentlich gerne, wenn die "Daten" schon bekannt sind, die nicht zur Laufzeit auszurechnen, sondern hardzucoden.
-
mazal schrieb:
aber was er wirklich machen sollte, ist irgendwie ausrechnen wer gewonnen hat und erst dann Ausgeben, damit, wenn er mal die Ausgabe ändert, dies nicht gleich an drei Stellen machen muss. Aber das brauch ich dir wohl nicht zu erklären
Trotzdem gut, daß Du es erwähnst.
Deine Tabelle hat den Vorteil, daß man sie leicht für die richtigen Spielregeln http://www.youtube.com/watch?v=5cujdrWbc9k ausbauen kann.
-
mazal schrieb:
Ersetz mal deine vielen if-abfragen durch sowas wie
int gewinn_matrix[][] = { ...
Ersetze den Code lieber nicht mit o.g., der Vorschlag ist nämlich falsch wegen fehlender 2. Dimensionsgröße.
-
ups, schon erledigt