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:

    http://ideone.com/NNdzB



  • 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


Anmelden zum Antworten