Tic Tac Toe - Gebt eure Meinung zu meinem Code ab!



  • Hay,
    hab soeben meine Projekt arbeit für die Schule fertig getippt,
    z.zt. erfüllt es seinen Zweck, sprich man kann es Spielen etc

    werde noch n bischen dran ändern
    hier mal der Code

    // Tic Tac Toe.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include "stdio.h"
    
    /************************************************************************************/
    /**														                           **/
    /**  void arrayfuellen(int *feld, int len)		                                   **/
    /**														                           **/
    /*#**********************************************************************************/
    /*
    Parameter:
      (i) int len   : Groesse des Von len, kann verschieden geaendert werden (Feld muss feld[len][len] gross sein)
      (o) int *feld : Fuellt das ganze Array mit leerzeichen 
    Return:
    
    Beschreibung: 
      Ein feld (der groesse feld[len][len] wird mit leerzeichen gefuellt) und mit dem *feld
      an die entsprechene Stelle geschrieben.
    */
    
    void arrayfuellen(int *pointer, int len){
    	len=len*len;
    	for(int i=0;i<len;i++){
    		*(pointer+i)=' ';
    	}
    }
    
    /************************************************************************************/
    /**														                           **/
    /**  void spielfeldaus(int *feld, int len)		                                   **/
    /**														                           **/
    /*#**********************************************************************************/
    /*
    Parameter:
      (i) int len   : Groesse von len, kann verschieden geaendert werden (Feld muss feld[len][len] gross sein)
      (i) int *feld : Zugriff auf Spielfeldspeicher
    Return:
    
    Beschreibung: 
      Hier wird das Tic Tac Toe Spielfeld ausgegeben
    */
    
    void spielfeldaus(int *feld,int len){
    	int j=1;
    	system("cls");
    	printf("\n\n\n");
    	printf("\t\t\t\t     y-Koordinate \n");
    	printf("\t\t\t\t       1   2   3\n\n");
    	for(int i=0;i<9;i=i+3){
    		printf("\t\t\t\tx = %d  %c | %c | %c\n",j,*(feld+i),*(feld+i+1),*(feld+i+2));
    		if(i==0||i==3){     
    			printf("\t\t\t\t      -----------\n");
    		} 
    		j++;
    	}
    	printf("\n\n");
    
    }
    
    /************************************************************************************/
    /**														                           **/
    /**  void spielereingabe(int *eingabe1ptr)	                                       **/
    /**														                           **/
    /*#**********************************************************************************/
    /*
    Parameter:
      (o) int *eingabe1ptr : Eingabe des 1. Spielers
    Return:
    
    Beschreibung: 
      Die Koordinaten zum Punkt setzen werden hiereingegeben. In der Form XY ohne Leerzeichen o.a.
    */
    
    void spielereingabe(int *eingabe1ptr){
    	int eingabe1;
    		do{
    		printf("Bitte geben Sie den Punkt an wo Sie Setzen wollen:\n");
    		printf("xy-Koordinaten: ");
    		scanf("%d",&eingabe1);
    		fflush(stdin);
    		if(eingabe1<11||eingabe1>13&&eingabe1<21||eingabe1>23&&eingabe1<31||eingabe1>33){
    			printf("Koordinaten nicht vorhanden!\n");
    			printf("Bitte erneut eingeben!\n\n");
    		}
    	}while(eingabe1<11||eingabe1>13&&eingabe1<21||eingabe1>23&&eingabe1<31||eingabe1>33);
    
    	*eingabe1ptr=eingabe1;
    }
    
    /************************************************************************************/
    /**														                           **/
    /**  void koordinaten(int koordinaten,int *xptr,int *yptr)       	               **/
    /**														                           **/
    /*#**********************************************************************************/
    /*
    Parameter:
      (i) int koordinaten : Eingabe aus der Funktion 'spielereingabe'
      (o) int *xptr       : Die Ausgabe der x-Koordinate
      (o) int *yptr       : Die Ausgabe der y-Koordinate
    Return:
    
    Beschreibung: 
      Hier wird die Eingabe der Form XY in seine bestandteile x und y zerlegt und in den
      entsprechenden Variablen abgespeichert.
    */
    
    void koordinaten(int koordinaten,int *xptr,int *yptr){
    	*yptr=koordinaten%10;
    	*xptr=koordinaten/10;
    
    }
    
    /************************************************************************************/
    /**														                           **/
    /**  void gewinnerkennung(int *feld,int *gewonnen)              	               **/
    /**														                           **/
    /*#**********************************************************************************/
    /*
    Parameter:
      (i) int *feld     : Eingabe aus der Funktion 'spielereingabe'
      (o) int *gewonnen : Ausgabe des Gewinners 
    
    Return:
    
    Beschreibung: 
      Hier wird geprueft wer gewonnen hat.
      1==Spieler 1 hat gewonnen
      2==Spieler 2 hat gewonnen
    
    */
    void gewinnerkennung(int *feld,int *gewonnen){
    
    	//diagonale Gewinnpruefung
    	if(*feld=='x'&&*(feld+4)=='x'&&*(feld+8)=='x'||
    		*(feld+2)=='x'&&*(feld+4)=='x'&&*(feld+6)=='x'){
    		*gewonnen=1;    //Gewonnen hat Spieler 1
    	}
    	if(*feld=='o'&&*(feld+4)=='o'&&*(feld+8)=='o'||
    		*(feld+2)=='o'&&*(feld+4)=='o'&&*(feld+6)=='o'){
    		*gewonnen=2;    //Gewonnen hat Spieler 2
    	}
    
    	//horizontale Gewinnpruefung
    	if(*feld=='x'&&*(feld+1)=='x'&&*(feld+2)=='x'||
    		*(feld+3)=='x'&&*(feld+4)=='x'&&*(feld+5)=='x'||
    		*(feld+6)=='x'&&*(feld+7)=='x'&&*(feld+8)=='x'
    		){
    		*gewonnen=1;    //Gewonnen hat Spieler 1
    	}
    	if(*feld=='o'&&*(feld+1)=='o'&&*(feld+2)=='o'||
    		*(feld+6)=='o'&&*(feld+7)=='o'&&*(feld+8)=='o'||
    		*(feld+3)=='o'&&*(feld+4)=='o'&&*(feld+5)=='o'){
    		*gewonnen=2;    //Gewonnen hat Spieler 2
    	}
    
    	//vertikale Gewinnpruefung
    	if(*feld=='x'&&*(feld+3)=='x'&&*(feld+6)=='x'||
    		*(feld+1)=='x'&&*(feld+4)=='x'&&*(feld+7)=='x'||
    		*(feld+2)=='x'&&*(feld+5)=='x'&&*(feld+8)=='x'){
    		*gewonnen=1;    //Gewonnen hat Spieler 1
    	}
    	if(*feld=='o'&&*(feld+3)=='o'&&*(feld+6)=='o'||
    		*(feld+1)=='o'&&*(feld+4)=='o'&&*(feld+7)=='o'||
    		*(feld+2)=='o'&&*(feld+5)=='o'&&*(feld+8)=='o'){
    		*gewonnen=2;    //Gewonnen hat Spieler 2
    	}
    
    }
    
    int main(){
    
    	const int len=3;
    	int spielfeld[len][len];
    	int *ptr;
    	int eingabe;
    	int x,y; //Koordinatenvariablen
    	int gewonnen;
    	arrayfuellen(&spielfeld[0][0],len);
    	spielfeldaus(&spielfeld[0][0],len);
    	ptr=&spielfeld[0][0];
    	gewonnen=0;
    
    	for(int i=1;i<10;i++){
    
    		do{
    			spielereingabe(&eingabe);
    			koordinaten(eingabe,&x,&y);
    			if(spielfeld[x-1][y-1]=='x'||spielfeld[x-1][y-1]=='o'){ 
    			printf("\nAn den eingegebenen Koordinaten sitz schon was.\n");
    			printf("Bitte erneut eingeben\n");
    			}
    
    		}while(spielfeld[x-1][y-1]=='x'||spielfeld[x-1][y-1]=='o');
    
    		if(i%2){   //EDIT if(i==1||i==3||i==5||i==7||i==9){
    			//spieler 1
    			spielfeld[x-1][y-1]='x';
    			spielfeldaus(&spielfeld[0][0],len);
    		}
    		else{
    			//spieler 2
    			spielfeld[x-1][y-1]='o';
    			spielfeldaus(&spielfeld[0][0],len);
    		}
    		gewinnerkennung(&spielfeld[0][0],&gewonnen);
    		if(gewonnen==1||gewonnen==2){
    			break;
    		}
    	}
    
    	if(gewonnen==1){
    		printf("\nSpieler 1 hatt gewonnen\n");
    	}
    	else if(gewonnen==2){
    		printf("\nSpieler 2 hat gewonnen\n");
    	}
    	else{
    		printf("\nUnentschieden\n");
    	}
    
    	return 0;
    }
    

    Wie findet ihr den Code ?
    Wenn Ihr es an machen stellen zu kompliziert gelöst findet, lasst euch gesagt sein das es so gewollt ist. Dennoch bin ich für verbesserungsvorschläge dankbar.



  • Wenn Ihr es an machen stellen zu kompliziert gelöst findet, lasst euch gesagt sein das es so gewollt ist.

    glaub ich weniger 😃

    so beim überfliegen

    fflush(stdin);

    und deklaration z.b. in einer schleife ...

    das ist kein ansi c



  • nya ist eigentlich normales C, kein C++ oder etc, daher dachte ich kommt nur der begriff ansi c in frage ^^ sry



  • //statt
              if (i==1||i==3||i==5||i==7||i==9)
    
    //kürzer
              if (i%2)
    

    😞



  • Also sowas:

    void gewinnerkennung(int *feld,int *gewonnen)
    

    finde ich tatal daneben, eher

    int gewinnerkennung(int *feld)
    

    und die rueckgabe liefert dann den gewinner. Solche sachen hast du oeffter in dem Quellcode.

    void spielereingabe(int *eingabe1ptr)
    

    Ansonsten wuerde ich meinen Vorredner anschliessen.



  • @gerie thx stimmt is einfacher ^^

    @moe joa das ist beabsichtigt, ich arbeite lieber mit pointern, ka wieso aber so muss ich nicht umdenken



  • Die "gewinnerkennung ()" könnte schon verlassen werden sobald ein Gewinner feststeht.



  • Adi schrieb:

    nya ist eigentlich normales C, kein C++ oder etc, daher dachte ich kommt nur der begriff ansi c in frage ^^ sry

    Er wollte Dir damit auch nicht sagen dass Du im falschen Forum bist 🙄


Anmelden zum Antworten