Tic-Tac-Toe



  • Wie kann ich eine 3x3 Tabelle ausgeben??

    [cppint Matrix[3][3];[/cpp]

    Soweit bin ich scho, aber ich möchte das sie so aus sieht

    | | 
        -------
          | |
        -------
          | |
    

    danke im Voraus

    mfg Tiς-Taς-Tσe



  • Wie kann ich eine 3x3 Tabelle ausgeben??

    int Matrix[3][3];
    

    Soweit bin ich scho, aber ich möchte das sie so aus sieht

    | | 
        -------
          | |
        -------
          | |
    

    danke im Voraus

    hier nochmals ohne Fehler...sorry

    mfg Tiς-Taς-Tσe



  • Ich weiß nicht genau wie du das meinst, die ganze
    Tabelle ausgeben?

    Hier mal ein kleiner Ausschnitt aus meiner Schach Engine
    wie ich das geregelt habe:

    int board_value[10][10] = {
         {99,99,99,99,99,99,99,99,99,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99, 0, 0, 0, 0, 0, 0, 0, 0,99},
         {99,99,99,99,99,99,99,99,99,99} };
    
    void board_rebuild(){
          int x=0;
    	 int y=0;
    	 int r=0;
    	 int t=0;
    	 int V=0;
              while((x==r)&&(y<=9)){
    		       t++;
                   V=board_value[x][y];
    			        if(V==0){printf(". ");
    			        }if(V==10){printf("B ");
    			        }if(V==20){printf("S ");
    			        }if(V==30){printf("L ");
    			        }if(V==40){printf("T ");
    			        }if(V==50){printf("D ");
    			        }if(V==60){printf("K ");
    			        }if(V==11){printf("b ");
    				   }if(V==21){printf("s ");
    				   }if(V==31){printf("l ");
    				   }if(V==41){printf("t ");
    				   }if(V==51){printf("d ");
    				   }if(V==61){printf("k ");
    				   }
                    y++;
                    if((t==10)||
    			       (t==20)||
    			       (t==30)||
    			       (t==40)||
    			       (t==50)||
    			       (t==60)||
    			       (t==70)||
    			       (t==80)||
    			       (t==90)){
    			         printf("\n");
    			         r++;
    			         x++;
    			         y=0;
    		        }
              }          
    }
    


  • @ blacktea:
    In C hat man die Möglichkeit, switch zu benutzen 😉



  • Nexus schrieb:

    @ blacktea:
    In C hat man die Möglichkeit, switch zu benutzen 😉

    Ich freue mich immer über Verbesserungsvorschläge! Das ist eine gute Idee.
    Oder wie heißt es: Man sieht den Wald vor lauter Bäumen nicht :).



  • Wie ineffizent!
    Das ganze Schachbrett jedesmal neu zu zeichnen.

    Wieso überschreibst du nicht einfach nur die Änderungen?



  • Performance schrieb:

    Wie ineffizent!
    Das ganze Schachbrett jedesmal neu zu zeichnen.

    Wieso überschreibst du nicht einfach nur die Änderungen?

    Ich schreibe auch nur die Änderungen, dies ist nur die Funktion um das Schachbrett
    in seiner aktuellen Stellung auf der Konsole auszugeben falls man sie
    sehen möchte, kann man das über ein kleines Menue machen. Zur Überprüfung
    sozusagen.

    Sonst sieht das ganze nur so aus:

    [white][computer] [1]: e4
    [black][you     ] [1]: _
    

    Ich spiele auf einem seperatem echten Schachbrett vor dem
    Computer und ziehe lediglich die Koords die mir meine Engine
    wiedergibt auf dem Brett nach.



  • @Tic-Tac-Toe_

    Willst du dieses einfache Gebilde echt mit Kontrollstrukturen realisieren? Scheint mir wenig sinnvoll.

    char szInterface[] =
    "  | |  \n"
    "-------\n"
    "  | |  \n"
    "-------\n"
    "  | |  " ;
    
    puts (szInterface) ;
    

    MfG WilMen



  • Nein, ich habe das nur so gemacht weil ich nicht weiss wie ich das anderst ausgeben könnte...Ich möchte danach die einzelnen Felder anwählen können und so tic-tac-toe spielen...



  • Hi,

    du bist hier im Forum "ANSI C" also einem Forum wo reines C ohne irgendwelche Oberflächen behandelt wird. Alles was du hier aus-/eingibst geschieht über die Console. Dir bleibt also hier nichts anderes übrig als deine Züge mit Koordinaten anzugeben. Du kannst die Felder nicht mit der Maus selektieren. Bei einer Veränderung muss das gesamte Feld neu gezeichnet werden.

    Mach es doch so:

    Ich hatte beim vorherigen Post völlig die Ausgabe der Variablen vergessen. :p

    void OutputInterface(int iMatrix[][])
    {
    	for (i = 0; i < 3; i++)
    	{
    		printf (" %d | %d | %d \n", iMatrix[i][0], iMatrix[i][1],  iMatrix[i][2]) ;
    
    		if (i != 2)
    			puts ("--------------\n");
    	}	
    }
    

    Alternativ könnte man auch alle Variablen in einem Aufruf von printf ausgeben, da diese kleine Matrix wie gesagt eigentlich keine Kontrollstrukturen rechtfertigt. Bei einem Schachbrett sieht es da natürlich schon anders aus.

    MfG WilMen



  • Hier ein Komplettes Tic-Tac-Toe-Spiel:

    #include "stdafx.h"
    #include <stdlib.h>
    #ifdef __unix__
        #define clrscr() printf("\x1B[2J")
    #elif __BORLANDC__ && __MSDOS__
        #include <conio.h>
    #elif __WIN32__ || _MSC_VER
        #define clrscr() system("cls")
    #else
        #define clrscr() printf("clrscr() – Fehler!!\n")
    #endif
    #define X 'X'
    #define O 'O'
    #define LEER ' '
    #define GAME_OVER 0
    #define A_WINNER 1
    #define CONTINUE 2
    /* Inhalt des 3 x 3 grossen Felds */
    char TicTacToe[3][3] = { {' ',' ',' '},
                             {' ',' ',' '},
                             {' ',' ',' '} };
    /* Spieler1 hat das Zeichen 'X' */
    char Spieler1 = X;
    /* Spieler2 hat das Zeichen 'O' */
    char Spieler2 = O;
    /* Anzahl der Felder, die besetzt werden können */
    unsigned int felder = 9;
    /* Funktionsprototypen */
    void print_spielfeld(void);
    char neuer_zug(char);
    int if_win(void);
    /* Gibt den aktuellen Zustand des Spielfelds aus */
    void print_spielfeld(void) {
       int i;
       clrscr();
       printf("       1   2   3  \n     +---+---+---+\n");
       for(i = 0; i < 3; i++) {
          printf("  %d  | ",i+1);
          printf("%c",TicTacToe[i][0]);
          printf(" | ");
          printf("%c",TicTacToe[i][1]);
          printf(" | ");
          printf("%c",TicTacToe[i][2]);
          printf(" | \n");
          if(i != 2) {
             printf("     +---+---+---+\n");
          }
          else {
             printf("     +---+---+---+\n");
          }
       }
    }
    /* Führt einen neuen Zug aus.
     * char ch: Zeichen des Spielers, der an der Reihe ist, 'X'
     * oder 'O'
     * Rückgabewert: Zeichen des Spielers, der eben an der Reihe war
     * falls ein Feld besetzt ist, wird der Rückgabewert vertauscht,
     * damit der aktuelle Spieler nochmals seinen Zug machen kann.
     * Hat ein Spieler gewonnen, gibt die Funktion die
     * symb. Konstante GAME_OVER zurück
     */
    char neuer_zug(char ch) {
       unsigned int row, colum;
       printf("\nSpieler \"%c\" ist an der Reihe\n\n",ch);
       printf("Zeile  (1–3): ");
       scanf("%d",&row);
       printf("Spalte (1–3): ");
       scanf("%d",&colum);
       if(TicTacToe[row-1][colum-1] == LEER) {
          /* Zeichen in das mehrdim. Array */
          TicTacToe[row-1][colum-1] = ch;
          print_spielfeld();
          /* Haben wir schon einen Gewinner? */
          if(if_win() == A_WINNER)
             return GAME_OVER;
       }
       else { /* Ein bereits besetztes Feld */
          print_spielfeld();
          printf("\n!!! Feld ist bereits gesetzt !!!\n");
          return (ch == X) ?O :X;
       }
       /* Sind bereits alle Felder besetzt? */
       if(--felder > 0)
          return ch;
       else {
          printf("\nAlle Felder sind besetzt – Unentschieden\n");
          return GAME_OVER;
       }
    }
    /* Auswertung aller Möglichkeiten, um einen Gewinner zu ermitteln
     * Rückgabewert: symb. Konstante A_WINNER falls ein Gewinner
     * ermittelt wurde oder die symb. Konstante CONTINUE zum
     * Weiterspielen.
     */
    int if_win(void) {
      /* Zuerst Spieler1 'X' */
      if(TicTacToe[0][0] == Spieler1 &&
         TicTacToe[0][1] == Spieler1 &&
         TicTacToe[0][2] == Spieler1 ||
         TicTacToe[1][0] == Spieler1 &&
         TicTacToe[1][1] == Spieler1 &&
         TicTacToe[1][2] == Spieler1 ||
         TicTacToe[2][0] == Spieler1 &&
         TicTacToe[2][1] == Spieler1 &&
         TicTacToe[2][2] == Spieler1 ||
         TicTacToe[0][0] == Spieler1 &&
         TicTacToe[1][0] == Spieler1 &&
         TicTacToe[2][0] == Spieler1 ||
         TicTacToe[0][1] == Spieler1 &&
         TicTacToe[1][1] == Spieler1 &&
         TicTacToe[2][1] == Spieler1 ||
         TicTacToe[0][2] == Spieler1 &&
         TicTacToe[1][2] == Spieler1 &&
         TicTacToe[2][2] == Spieler1 ||
         TicTacToe[0][0] == Spieler1 &&
         TicTacToe[1][1] == Spieler1 &&
         TicTacToe[2][2] == Spieler1 ||
         TicTacToe[0][2] == Spieler1 &&
         TicTacToe[1][1] == Spieler1 &&
         TicTacToe[2][0] == Spieler1) {
            printf("Spieler1 hat gewonnen\n");
            return A_WINNER;
      }
      /* Jetzt Spieler2 'O' */
      else if( TicTacToe[0][0] == Spieler2 &&
               TicTacToe[0][1] == Spieler2 &&
               TicTacToe[0][2] == Spieler2 ||
               TicTacToe[1][0] == Spieler2 &&
               TicTacToe[1][1] == Spieler2 &&
               TicTacToe[1][2] == Spieler2 ||
               TicTacToe[2][0] == Spieler2 &&
               TicTacToe[2][1] == Spieler2 &&
               TicTacToe[2][2] == Spieler2 ||
               TicTacToe[0][0] == Spieler2 &&
               TicTacToe[1][0] == Spieler2 &&
               TicTacToe[2][0] == Spieler2 ||
               TicTacToe[0][1] == Spieler2 &&
               TicTacToe[1][1] == Spieler2 &&
               TicTacToe[2][1] == Spieler2 ||
               TicTacToe[0][2] == Spieler2 &&
               TicTacToe[1][2] == Spieler2 &&
               TicTacToe[2][2] == Spieler2 ||
               TicTacToe[0][0] == Spieler2 &&
               TicTacToe[1][1] == Spieler2 &&
               TicTacToe[2][2] == Spieler2 ||
               TicTacToe[0][2] == Spieler2 &&
               TicTacToe[1][1] == Spieler2 &&
               TicTacToe[2][0] == Spieler2)  {
                  printf("Spieler2 hat gewonnen\n");
                  return A_WINNER;
       }
       return CONTINUE;
    }
    int main(void) {
       char check = X;
       /* Leeres Spielfeld ausgeben */
       print_spielfeld();
       do { /* War Spieler mit dem Zeichen 'X' gerade dran ... */
          /* ... dann ist jetzt Spieler mit dem Zeichen 'O' dran */
          if(check==X) {
                check=neuer_zug(O);
          }
          else { /* ... ansonsten der Spieler mit dem Zeichen 'X' */
            check=neuer_zug(X);
          }
       } while( check != GAME_OVER );
       return EXIT_SUCCESS;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    

    Es ist nicht von mir sondern von: Galileo Computing http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_013_009.htm#RxxobKap0130090400284E1F01E1AB


Anmelden zum Antworten