Programm Tic, Tac, Toe läuft nicht richtig !

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Programm Tic, Tac, Toe läuft nicht richtig !

Beitrag von MartyMcFly1976 » Mo Mai 11, 2015 11:55 am

Hallo Ihr Profis !

Ich hab ein Problem an dem ich jetzt schon seit knapp 3 Wochen sitze, ich soll das Spiel Tic, Tac, Toe als C-Programm erstellen. Eigendlich funktioniert es schon mal ganz gut, nur leider gibt es ein paar Kleinigkeiten die noch nicht so funktionieren wie ich das möchte und ich finde einfach keinen Lösungsansatz.

EIn Problem ist, das wenn Spieler 1 gewinnonnen hat und das Spiel neu Starte sofort wieder gewinnt ohne jegliche Eingabe. Spieler 2 hat leider das Pech das er nie gewinnt und wenn er noch so viele 3 er Reihen hat. :(

Ich weiss mir einfach nicht weiter.....

Hier mal mein Code:

Code: Alles auswählen

#include <stdio.h>
#include "conio.h"
#include <stdlib.h>

int main(void)
{
  //Variablen deklarieren

  char spielfeld[10]={'0','1','2','3','4','5','6','7','8','9'};
  char string1[100];
  char string2[100];
  int durchlauf;
  int wahl;
  int repeat;
  int gewonnen=0;

  do
  {
  //Berüßung und Vorstellen des Spiels
    
	printf("\t\t\tWillkommen zu Tic, Tac, Toe\n\n\n");
	printf("Die Spielregeln:\n\n");
    printf("Einer der Spieler hat gewonnen, wenn er 3 seiner Steine in einer Reihe hat !\n\n");
	printf("Eine Reihe besteht aus 3 Feldern,\n");
	printf("die vertikal, horizontal oder auch diagonal angeordnet sein k\x94nnen.\n");
    printf("\nSpieler 1 spielt mit einem X und Spieler 2 spielt mit einem O\n\n");

	//Name Spieler 1 einlesen
	printf("Spieler 1 Bitte geben sie Ihren Namen ein:");
	scanf("%99s",&string1[0]);

	//Name Spieler 2 einlesen
	printf("Spieler 2 Bitte geben sie Ihren Namen ein:");
	scanf("%99s",&string2[0]);

	//Das Spielfeld von Spieler 1

		 printf("\n                                  Spielfeld\n\n");
		 printf("                                \xDA\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xBF");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[1],spielfeld[2],spielfeld[3]);
		 printf("                                \xC3\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xB4");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[4],spielfeld[5],spielfeld[6]);
		 printf("                                \xC3\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xB4");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[7],spielfeld[8],spielfeld[9]);
		 printf("                                \xC0\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xD9\n\n");

  for(durchlauf=1; durchlauf<10&&gewonnen==0; durchlauf++)
  { 
    //Spielrunde 1, 3, 5, 7, 9 für Spieler 1
	  //Modulo wegen Zuweisung der Runde
    if (durchlauf%2==1)
    {
      //Einlesen des Spielsteins Spieler 1
      do 
      {
        printf("%s, ist an der Reihe, bitte drücken Sie die entsprechende Zahl.\n",string1);
        scanf("%i",&wahl);
        fflush(stdin);

        //Überprüfung wegen Doppelbelegung des Feldes
        if((spielfeld[wahl]=='X')||(spielfeld[wahl]=='O'))
        {
          printf("Das eingegebene Feld ist schon besetzt.\n");
          //Schleife bei Falscheingabe
          wahl=10;
        }
      }
      //Überprüfung ob die Zahl zwichen 1 & 9 liegt
      while((wahl<1)||(wahl>9));


      //Wahl des Spielfeldes bei Richtigen Bedingungen
      spielfeld[wahl]='X';
    }
    //Spielrunde 2, 4, 6, 8 für Spieler 2
    else
    {
      //Einlesen des Spielsteins Spieler 1
      do 
      {
        printf("%s ist an der Reihe, bitte druecken Sie die entsprechende Zahl.\n",string2);
        scanf("%i",&wahl);
        fflush(stdin);
 
        //Überprüfung wegen Doppelbelegung des Feldes
        if((spielfeld[wahl]=='O')||(spielfeld[wahl]=='X'))
        {
          printf("Das eingegebene Feld ist schon besetzt.\n");
          //Schleife bei Falscheingabe
          wahl=10;
        }
      }
      //Überprüfung ob die Zahl zwichen 1 & 9 liegt
      while((wahl<1)||(wahl>9));

      //Wahl des Spielfeldes bei Richtigen Bedingungen
      spielfeld[wahl]='O';
    }
		 printf("\n                                  Spielfeld\n\n");

		 printf("                                \xDA\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xC2\xC4\xC4\xC4\xBF");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[1],spielfeld[2],spielfeld[3]);
		 printf("                                \xC3\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xB4");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[4],spielfeld[5],spielfeld[6]);
		 printf("                                \xC3\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xC5\xC4\xC4\xC4\xB4");
		 printf("                                                                   \xB3 %c \xB3 %c \xB3 %c \xB3\n",spielfeld[7],spielfeld[8],spielfeld[9]);
		 printf("                                \xC0\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xC1\xC4\xC4\xC4\xD9\n\n");

    //Bedingungen zum Sieg Spieler 2


    if(((spielfeld[1]=='0') && (spielfeld[2]=='0') && (spielfeld[3]=='0')) || 
		((spielfeld[4]=='0') && (spielfeld[5]=='0') && (spielfeld[6]=='0')) || 
		((spielfeld[7]=='0') && (spielfeld[8]=='0') && (spielfeld[9]=='0')) || 
		((spielfeld[1]=='0') && (spielfeld[5]=='0') && (spielfeld[9]=='0')) || 
		((spielfeld[3]=='0') && (spielfeld[5]=='0') && (spielfeld[7]=='0')) ||       
		((spielfeld[1]=='0') && (spielfeld[4]=='0') && (spielfeld[7]=='0')) || 
		((spielfeld[2]=='0') && (spielfeld[5]=='0') && (spielfeld[8]=='0')) || 
		((spielfeld[3]=='0') && (spielfeld[6]=='0') && (spielfeld[9]=='0')))
    {
      printf("\n%s,du hast gewonnen!",string2);
      // FOR-Schleife verlassen
      gewonnen=2; // speichern das Spieler 2 gewonnen hat

	  //Bedingungen zum Sieg Spieler 2
    }

    if(((spielfeld[1]=='X') && (spielfeld[2]=='X') && (spielfeld[3]=='X')) || 
		((spielfeld[4]=='X') && (spielfeld[5]=='X') && (spielfeld[6]=='X')) || 
		((spielfeld[7]=='X') && (spielfeld[8]=='X') && (spielfeld[9]=='X')) || 
		((spielfeld[1]=='X') && (spielfeld[5]=='X') && (spielfeld[9]=='X')) || 
		((spielfeld[3]=='X') && (spielfeld[5]=='X') && (spielfeld[7]=='X')) ||       
		((spielfeld[1]=='X') && (spielfeld[4]=='X') && (spielfeld[7]=='X')) || 
		((spielfeld[2]=='X') && (spielfeld[5]=='X') && (spielfeld[8]=='X')) || 
		((spielfeld[3]=='X') && (spielfeld[6]=='X') && (spielfeld[9]=='X')))
    {
      printf("\n%s,du hast gewonnen!",string1);
      // FOR-Schleife verlassen
      gewonnen=1; // speichern das Spieler 1 gewonnen hat
    }

  }
    
  //Bedingung zum Unentschieden
  if(gewonnen==0)
  {
    printf("\nUnenschieden");
  }

  printf("\n");


  //Wiederholung der Runde
  printf("M\x94 \bchenten Sie noch mal Spielen?\n");
  printf("Ja = 1 und Nein = 2.\n");
  scanf("%i",&repeat);
  }
  while(repeat==1);

  getch();

  return(0);
}
Es wäre schön wenn jemand von euch mir einen Tip geben könnte wo der Fehler steckt und hoffe ich hab diesmal alles Richtig eingerückt :D

Danke schon mal in vorraus !

MfG Marty

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Programm Tic, Tac, Toe läuft nicht richtig !

Beitrag von cloidnerux » Mo Mai 11, 2015 1:18 pm

Du setzt deine Variablen nach der ersten Runde nicht zurück, sodass das Spielfeld und auch die Variable "gewonnen" weiterhin einen wert haben.
Wenn "gewonnen" immer auf 1 steht, läuft die Schleife direkt durch.

Dein Spieler zwei kann nicht gewinnen, weil du die Felder mit dem Buchstaben O Belegst, dann aber prüfst ob das Zeichen "0"(Null) drin steht.
Redundanz macht wiederholen unnötig.
quod erat expectandum

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Programm Tic, Tac, Toe läuft nicht richtig !

Beitrag von MartyMcFly1976 » Mo Mai 11, 2015 2:16 pm

Hallo und Danke für die Antwort !
Dein Spieler zwei kann nicht gewinnen, weil du die Felder mit dem Buchstaben O Belegst, dann aber prüfst ob das Zeichen "0"(Null) drin steht.
Ja stimmt, ich Trottel ! Da kann ich lange suchen... :roll: Ich wusste das da was nicht stimmt.

Du setzt deine Variablen nach der ersten Runde nicht zurück, sodass das Spielfeld und auch die Variable "gewonnen" weiterhin einen wert haben.
Wenn "gewonnen" immer auf 1 steht, läuft die Schleife direkt durch.
Das muss ich mir dann nochmal anschauen !

Danke erstmal für die Hilfe !

Gruss Marty

MartyMcFly1976
Beiträge: 34
Registriert: Sa Dez 06, 2014 5:56 pm

Re: Programm Tic, Tac, Toe läuft nicht richtig !

Beitrag von MartyMcFly1976 » Mi Mai 13, 2015 4:39 pm

Hallo cloidnerux !

Ich hab es gefunden :

Code: Alles auswählen

char spielfeld[10]={'0','1','2','3','4','5','6','7','8','9'};
Den Code musste ich ja unter die do schleife setzen sonst ist das Programm ja nie da durch gelaufen !

Gleichzeitig am Ende der for Schleife :

Code: Alles auswählen

//Bedingung zum Unentschieden
  if(gewonnen==0)
  {
    printf("\nIhr habt ein Unenschieden ereicht");
  }
[color=#FF0000]   //Löschen des Ergebnisses vom Spiel
   gewonnen=0;[/color]
Danke Dir für die Denkastöße!

G.Marty

Antworten