Türme von Hanoi mal anders als sonst



  • Hallo zusammen erstmal.
    Zuerst einmal worum es geht : Ich will die Türme von Hanoi in C programmieren; bevor ihr jetzt alle aber gleich eure Antworten gebt, unbedingt lesen:
    Ich möchte das Ganze als interaktives Spiel mit grafischer Ausgabe umsetzen.
    Es ist also egal wie viele Bewegungen der Spieler braucht, oder ob er das Spiel überhaupt löst, es soll bloß den üblichen Regeln folgen ( es kann immer nur eine kleinere auf eine größere Scheibe gelegt werden, das Spiel ist gewonnen, falls die Säule auf der ersten ganz zur dritten Position bewegt wurde.)
    Hier ist erstmal meine bisherige Version:

    [code]#include<stdio.h>
    /*Initialisieren der Unterfunktionen */
    void Anzeige ( int mat[4][3] );
    int Startsaeule ( int mat[4][3] );
    int Zielsaeule ( int wert, int mat[4][3] );
    int wert;
    /* Beginn des Hauptprogramms */
    int main(void)
    {	/* Initialisieren der Spielmatrix */
    	int mat[4][3]=
    	{
    	        {1, 0, 0},
    	        {2, 0, 0},
    	        {3, 0, 0},
    	        {4, 0, 0}
    	};
    
    	char wahl;
    	/* Nachprüfende Schleife, die das Programm solange laufen lässt, wie der	 Spieler will*/
    	do 
    	{
    
    		printf ("Willkommen!\n");
    
    		/* Nachprüfende Schleife, die die drei Unterfunktionen laufen
    		 lässt bis das Spiel gewonnen ist */
    		do
    		{	Anzeige ( mat );
    
    			wert = Startsaeule ( mat );
    
    			Zielsaeule ( wert, mat );
    
    		} while ( mat[0][3] != 1 );
    		/* Anzeigen der Matrix nach Spielende */
    		Anzeige ( mat );
    		/* Schleife, die dem Spieler die Wahl lässt das Spiel zu beenden */
    		do
    		{
    			printf ( "Nochmal?\n" );
    			scanf ("%s", wahl );
    			switch ( wahl )
    			{
    				case 'j':
    				case 'y': 
    				case 'n': break;
    				default: printf ("Fehler!\n");
    			}
    		} while ( wahl== 'j' || wahl== 'y' || wahl== 'n' );				
    	} while ( wahl== 'n' );
    
    	printf ("Aufwiedersehen!\n");
    
    	return 0;
    }
    
    #include<stdio.h>
    /* Initialisieren der Unterfunktion */
    int Anzeige ( int mat[5][3] )
    {
    /* Initialisieren der lokalen Variablen */
    	int i;
    	int j;
    /* Ausgabe der Spaltennummerrierung */
    	printf ("    1        2        3    \n");
    /* Zählschleife um die Zeilen der Spielfeldmatrix zu durchlaufen */
    	for ( i=0 ; i<5; i=i+1 )
    	{
    	/* Zählschleife um die Spalten der Spielfeldmatrix zu durchlaufen */
    		for ( j=0 ; j<4 ; j=j+1 )
    		{
    		/* Fallunterscheidung um die korrekte Ausgabe, je nach Eintrag
    		 der Matrix auf dem Bildschirm zu erzeugen */
    			switch ( mat[i][j] )
    			{
    				case 0 : printf ( "    |    \n" );
    					break;	
    				case 1 : printf ( "   X|X   \n" );
    					break;
    				case 2 : printf ( "  XX|XX  \n" );
    					break;
    				case 3 : printf ( " XXX|XXX \n" );
    					break;
    				case 4 : printf ( "XXXX|XXXX\n" );
    					break;
    				default : printf ("Fehler\n" );
    			}
    		}
    	}
    	/* Ausgabe der Basis des Spielfelds */
    	printf ( "_____________________\n" );
    
    	return 0;
    }
    
    #include<stdio.h>
    
    /* Initialisieren der Unterfunktion */
    int Startsaeule( int startmat[4][3] )
    
    {
    /* Initialisieren der lokalen Variablen */
    int wert;
    int start_i;
    int start;
    /* Nachprüfende Schleife, die die Einhaltung der Spielregeln überprüft */
    	do
    	{ /* Schleife zum überprüfen, ob ein Eingabefehler stattfand */
    		do
    		{
    			printf ( "Startsaeule?\n");
    
    			scanf ("%i" , &start );
    			getchar();
    
    			/* Überprüfen der Eingabe */
    			if ( 0< start <4 )
    			{
    			}
    			else 
    			{
    				printf ( "Fehler!\n" );
    			}
    
    			/* Überprüfen der Spielregeln */
    			if ( startmat[3][start]=0 )
    			{
    				printf ( "Leere Saeule!\n");
    			}
    			else
    			{
    			}
    		} while ( 0> start >4 );
    	} while ( startmat[3][start]=0 );
    
    	start_i=0;
    
    	/* Ab Hier wird die erste Scheibe der gewählten Säule und deren Größe
    	 bestimmt */
    	do
    	{
    		start_i=start_i+1;
    
    	} while (startmat[start_i][start]=0);
    /* Speichern der Scheibengröße im Rückgabewert und Umschreiben der Stelle, wo sie vorher war auf 0 */
    wert=startmat[start_i][start];
    startmat[start_i][start]=0;
    /* Rückgabewert */
    return wert;
    }
    
    #include<stdio.h>
    /* Initialisieren der Unterfunktion */
    int Zielsaeule( int ziel_wert , int zielmat[4][3] )
    {
    /* Initialisieren der lokalen Variablen */
    int ziel_i;
    int ziel;
    /* Nachprüfende Schleifen zum Überprüfen der Eingabe und der Spielregeln, ähnlich wie in Startsäule */
    do
    {
            do
            {
                            printf ( "Zielsaeule?\n");
    
                            scanf ("%i" , &ziel );
                            getchar();
    
                            if ( 0< ziel <4 )
                            {
                            }
                            else
                            {
                                    printf ( "Fehler!\n" );
                            }
    
             } while ( 0> ziel >4 );
    	/* Bestimmen des ersten freien Platzes auf der gewählten Säule */
    	ziel_i=1;
    
    	do
    	{
    
    	ziel_i=ziel_i+1;
    
    	} while ( ziel_i != 5 || zielmat[ziel_i][ziel]==0 );
    	/* Überprüfen der Spielregel; die oberste Scheibe auf der Zielsäule muss kleiner sein als die in Startsäule aufgenommene Scheibe */
    	if ( ziel_i==5 || zielmat[ziel_i][ziel]>ziel_wert )
    	{
    		zielmat[ziel_i-1][ziel]=ziel_wert;
    	}
    	else
    	{
    		printf ("Fehler!\n");
    	}
    } while ( zielmat[ziel_i][ziel] != ziel_wert );
    
    return;
    
    }
    [/code]
    

    mal abgesehen davon, dass die Anzeige noch nich ganz funzt, nervt mich aber vor allen Dingen, dass die Funktionen Start- und Zielsäule bisher nur Blödsinn machen.
    Allmählich hab ich keinen Plan mehr, was ich machen soll.
    Meine Kenntnisse in C sind eher beschränkt also bitte nicht böse sein falls ich damit dämlich erscheine 🙄
    schon mal Danke im Voraus,
    N4ginata



  • Benutze bitte die C/C++ Tags.
    Schreibe dir standardkonforme Eingabefunktionen für Einzeichen- und Zahleneingabe mit Einpufferlöschung, versuche für die Korrespondenz hier im Forum alles in eine C-Datei zu implementieren, formatiere den Code besser/übersichtlicher, verwende nicht dasgleiche include mehrfach, trimme das Programm auf 0 Fehler und 0 Warnungen, dazu gehört z.B. auch der Umbau von

    if ( 0< ziel <4 )
    

    .
    Dann versuche einen Testlauf mit einem konkreten, reproduzierbaren Fehler zu gestalten und frage wieder nach.


Anmelden zum Antworten