2D Array, Elemente die "plätze tauschen lassen"



  • moinsen

    ich hatte die idee ein kleines 2d game das in der konsole läuft zu erstellen, nur ich frage mich nun, wie ich 2 elemente aus dem array "plätze tauschen" lassen kann, wenn halt z.b. 'a' eingibt.

    hier mal mein code

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
    /*The Map*/
    char map [5][5]={
        {'#','#','#','#','#'},
        {'#',' ',' ',' ','#'},
        {'#',' ',' ',' ','#'},
        {'#',' ',' ','@','#'},
        {'#','#','#','#','#'} };
    /*X/Y coordinates for the map*/
    int y;
    int x;
    unsigned int life=100;
    /*BTW INFINITE LOOP!!!!!*/
    while(life!=0){
    system("cls");
    /*The loop for printing the 2d array*/
    for (y=0; y<5;y++ )  {
          for (x=0; x<=5;x++){
                if(x<5){
                printf("%c", map[x][y]);
                        }
    /*breaking the line for correct printing of the map*/
                else
                printf("%c\n", map[x][y]);
                        }
          }
    /*making able to move a unit, you*/
    char a;
    a=getchar();
    
        }
    system("Pause");
    return 0;
    }
    

    es geht sich darum, dass das '@' zeichen der bewegbare charakter sein soll.

    danke 😃



  • Jedes Mal alles löschen und alles neu zeichnen oder mit nicht standardkonformen gotoxy Gefrickel die von/nach-Felder berechnen und neu zeichnen.



  • moin, ja das 2. ist das was ich vor hatte, jedoch habe ich keine ahnunh, wie ich es umsetzen soll.

    Denkanstöße?



  • Für deine Spielfigur legst du zwei Variabeln an, eine für die X und eine für Y-Position, oder noch besser eine Struktur, wenn du das schon kennst. Dann schreibst du dir eine Funktion, um das Spielfeld zu zeichnen, in dieser setzt du deine Spielfigur über die Array-Indexe, welche ja die X und Y-Koordinaten sind. Danach gibst du das Spielfeld-Array aus.

    Zum Bewegen der Figur, musst du dann noch Tastatureingaben in einer Loop anfangen und entsprechend deine Spiellogik die Koordinaten neu setzen und zum Schluss dann halt deine render_playfield oder so Funktion aufrufen.

    Lies dir am besten mal Tutorials dazu durch, oder schau dir fertige kleine SourceCodes an, die so etwas in der Art machen.



  • moin, ja ich versuche es nun mit 4 funktionen
    up, down, left, right...

    zum video
    https://www.youtube.com/watch?v=kfRjvvgjTNQ
    das hier hab ich gefunden, jedoch c++...

    //edit

    gibt es eine möglichkeit, die position des '@' im array auszugeben?

    und hab es so gemacht, nur es will nicht...

    int c_X_pos, c_Y_pos, n_X_pos, n_Y_pos;
            c_X_pos=4;
            c_Y_pos=4;
            char temp              = map [c_X_pos][c_Y_pos];
            map [n_X_pos][n_Y_pos] = map [c_X_pos][c_Y_pos];
            map [n_X_pos][n_Y_pos] = temp;
    

    was sublime text sagt:

    main.c: In function 'main':
    main.c:40:32: warning: 'n_X_pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
    map [n_X_pos][n_Y_pos] = map [c_X_pos][c_Y_pos];
    ^
    main.c:40:32: warning: 'n_Y_pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
    [Finished in 0.2s]



  • Du sollst nicht dein '@' auslesen und austauschen, sondern die Map initialisierst du wie vorher auch, nur ohne das '@'. Deine Spielfigur setzt du dann NACH der Initialisierung in das Map-Array mit map[x][y] = '@'; Die Position hat du ja dann automatisch, denn diese ist die X- und Y-Position deiner Spielfigur.

    Das hier ist ungetestet und soll nur an Denkanstoß sein.

    void render_playfield(int x, int y)
    {
     char map [5][5]={
        {'#','#','#','#','#'},
        {'#',' ',' ',' ','#'},
        {'#',' ',' ',' ','#'},
        {'#',' ',' ',' ','#'},
        {'#','#','#','#','#'} };
    
     map[x][y] = '@';
    }
    

    Deine Fehler sind nur Warnungen, weil du Variabeln zwar definierst aber nicht auf einen Wert gesetzt hast.



  • ach so meintest du das. ok gut werde mich ran machen!


  • Mod

    Starglider schrieb:

    Deine Fehler sind nur Warnungen, weil du Variabeln zwar definierst aber nicht auf einen Wert gesetzt hast.

    Du sagst das so, als ob eine Warnung diesbezüglich nicht so ernst wäre. Das ist ein übelst schlimmer Fehler! Der Compiler muss es bloß fehlerlos akzeptieren (obwohl er den Fehler sieht), da das eben die Regel der Sprache ist. Aber er darf warnen und man ist gut beraten, diese Warnung als den Fehler anzusehen, der er ist.



  • #include <stdio.h>
    #include <stdlib.h>
    
    void the_map(int x, int y){
    //x an y show the position of the '@'
    char map [10][10]={
    	{'#','#','#','#','#','#','#','#','#','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#','#','#','#','#','#','#','#','#','#'},	
    };
    map [x][y]= '@';
    int a;
    int b;
    for(a=0;a<10;a++){
    	for(b=0;b<10;b++){
    		if(b<9){
    			printf("%c",map[a][b]);
    				}
    		if(b==9){
    			printf("%c\n",map[a][b]);
    				}
    			}
    		}
    	}
    
    int main(){
    
    unsigned int life=100;
    while(life!=0){
    	if(life<0){
    		break;
    	}
    	system("cls");
    	int x=4;
    	int y=4;
    	the_map(x, y);
    
    char action;
    action=getchar();
    
    switch(action){
    	case 'w': y-=1; break;
    	case 'a': x-=1; break;
    	case 's': y+=1; break;
    	case 'd': x+=1; break;
    			}
    }
    printf("You have lost!\n");
    system("pause");
    return 0;
    }
    

    sieht toll aus, nur es bewegt sich nun nichts, die case teile müssen abgeändert werden...
    ansonsten akzeptabel?
    compiler sagt auch nichts dazu.


  • Mod

    Welchen Wert haben denn wohl x und y, wenn du deine Feldzeichnefunktion aufrufst?

    Ich glaube auch nicht, dass dir ganz klar ist, was getchar macht. Es liegt jedenfalls nicht (nur) am obigen Fehler, dass sich da nichts bewegt. Das ganze Vorhaben, ein Konsolenspiel mit direkter Tastatursteuerung in Standard-C zu schreiben ist von vornherein zum Scheitern verurteilt, weil das Ein-/Ausgabekonzept von C dafür nicht ausgelegt ist.



  • paar zeilen über switch, x=4 und y=4

    ist c wircklich so... naja ich sage mal eingeschränkt?
    c++ werde ich dann machen müssen oder?



  • SparkMonay schrieb:

    ist c wircklich so... naja ich sage mal eingeschränkt?
    c++ werde ich dann machen müssen oder?

    Nein, C++ ist genauso.
    Die Philosophie dahinter ist, dass C++ und C auf jeder möglichen Maschine laufen sollen können. Egal ob High-End-Gaming-PC, Toaster oder wasserbetriebener Bambusrechner*. Und nicht jede Maschine unterstützt halt so etwas wie "Konsolen" oder "Tastaturen".
    Wenn du so etwas machen willst, kannst du das nicht mit Standard C (oder C++) machen, du brauchst plattformabhängige Mittel. Unter Windows bspw. die WinAPI, die liefert Funktionen um die Konsole zu löschen, den Cursor an eine bestimmte Stelle zu setzen, etc.

    *Credit an den, der die Analogie erfunden hat.


  • Mod

    SparkMonay schrieb:

    paar zeilen über switch, x=4 und y=4

    Und was folgerst du daraus?

    ist c wircklich so... naja ich sage mal eingeschränkt?
    c++ werde ich dann machen müssen oder?

    C++ hat das gleiche Ein-/Ausgabemodell*.

    Wenn du Konsolenspiele machen willst, brauchst du etwas, das direkt mit der Tastatur und der Konsolenausgabe spricht. Das gibt es. Unter Windows beispielsweise die (uralte) conio, aber sicher gibt's auch was moderneres -> Winapi-Forum. Aber prinzipiell ist es von da aus kein großer Unterschied, ob du nun ein Konsolenframework oder eines für "richtige" Spiele benutzt. Vielleicht wäre SFML etwas für dich?

    *: Es ist etwas befremdlich, dass du einen Wechsel auf eine komplett andere Sprache so nebenbei vorschlägst. Wäre das eine Kleinigkeit für dich? C und C++ haben nicht viel gemeinsam (nun, technisch gesehen haben sie C gemeinsam, aber das ist nicht, wie man C++ programmiert). Hättest du mit dem gleichen Ton vorgeschlagen, stattdessen beispielsweise Java zu machen? Falls ja: Java enthält meines Wissens nach tatsächlich im Standardsprachumfang Funktionen, die dein Vorhaben direkt möglich machen, ohne Drittbibliotheken.



  • hab das problem mit dem bewegen des charakters gelöst

    naja, das war eine zufällige idee.
    ich hatte im play store halt rougelike dungeon spiel gesehen und war davon angetan.
    so bin ich zu dieser idee gekommen.

    würde es auf meine psp portieren.
    dafür habe ich ja alles 😉



  • Für mehr Konsolen-Kontrolle kannst du auch Libs wie PDCurses oder unter Linux NCurses einsetzen.



  • danke wird gelesen 🙂

    //EDIT
    Es nimmt gestalt an!

    #include <stdio.h>
    #include <stdlib.h>
    //Showig the number of turns and the stage you are in
    int turn=0;
    int stage=1;
    //the map
    char map [10][10]={
    	{'#','#','#','#','#','#','#','#','#','#'},
    	{'#',' ','#',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    	{'#',' ','#',' ','&',' ','#',' ',' ','#'},
    	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    	{'#',' ','#','#','#','#','#',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
    	{'#','#','#','#','#','#','#','#','#','#'}, };
    //x an y show the position of the '@', the character you play
    int x=1;
    int y=1;
    
    void map_initialisation(int x, int y){
    map [x][y]= '@';
    //printing the map
    int a;
    int b;
    for(a=0;a<10;a++){
    	for(b=0;b<10;b++){
    		if(b<9){
    			printf("%c",map[a][b]);
    				}
    		if(b==9){
    			printf("%c\n",map[a][b]);
    			}
    		}
    	}
    }
    
    void moveLEFT(){ 
    	switch(map[x][y-1]){
    		case '#': printf("Don't tun against the wall"); 
    			break;
    		case ' ': y-=1; 
    			      map[x][y+1]=' ';
    			break;
    		case '&': printf("Do you want to enter the next stage?\nY/N?\n\n");
    	       		  char nextStage=getchar();
    					if(nextStage=='Y'||'y'){
    						stage++;
    			break;
    		}
    	}
    }
    
    void moveUP(){
    	switch(map[x-1][y]){
    		case '#': printf("Don't tun against the wall"); 
    			break;
    		case ' ': x-=1; 
    			      map[x+1][y]=' ';
    			break;
    		case '&': printf("Do you want to enter the next stage?\nY/N?\n\n");
    	       		  char nextStage=getchar();
    					if(nextStage=='Y'){
    						stage++;
    			break;
    		}
    	}
    }
    
    void moveRIGH(){
    	switch(map[x][y+1]){
    		case '#': printf("Don't tun against the wall"); 
    			break;
    		case ' ': y+=1; 
    			      map[x][y-1]=' ';
    			break;
    		case '&': printf("Do you want to enter the next stage?\nY/N?\n\n");
    	       		  char nextStage=getchar();
    					if(nextStage=='Y'){
    						stage++;
    			break;
    		}
    	}
    }
    
    void moveDOWN(){
    	switch(map[x+1][y]){
    		case '#': printf("Don't tun against the wall"); 
    			break;
    		case ' ': x+=1; 
    			      map[x-1][y]=' ';
    			break;
    		case '&': printf("Do you want to enter the next stage?\nY/N?\n\n");
    	       		  char nextStage=getchar();
    					if(nextStage=='Y'){
    						stage++;
    			break;
    		}
    	}
    }
    
    int main(){
    unsigned int life=100;
    while(life!=0){
    	if(life<0){
    		break;
    	}
    	if(turn==0){
    		printf("I hope you enjoy the game! :)\n\n");
    		system("Pause");
    	}
    else{
    //printing the map and claring the screen
    	system("cls");
    	printf("Stage %d     Turn%d\n",stage, turn);
    	map_initialisation(x,y);
    //declaring the actions you can perform, f.e moving
    char action=getchar();
    switch(action){
    	case 'a':moveLEFT(); break;
    	case 'w':moveUP();   break;
    	case 'd':moveRIGH(); break;
    	case 's':moveDOWN(); break;
    
    	}
    }
    	turn++;	
    }
    printf("You have lost!\n");
    system("pause");
    return 0;
    }
    

Log in to reply