C++ Ascii Spiel programmieren



  • Hey Leute!
    Ich will ein Ascii Spiel programmieren.. ich hab folgendes schon gefunden

    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    
    using namespace std;
    
    void CPos(int i, int j)
    {
         COORD cPos;
         cPos.X = j;
         cPos.Y = i;
         SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos);
    }
    
    void StdColor()
    {
         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
    }
    
    char map[20][30] = {"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X             P             X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "X                           X",
                        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"};
    
    void DrawArray()
    {
         CPos(20,0);
         for(int i =0; i < 20; i++)
         {
                 for(int j = 0; j < 30; j++)
                 {
                         cout << map[i][j];
                 }
                 cout << endl;
         }
    }
    
    void DrawMap();
    void Map();
    void Keys();
    void Inst();
    void Check();
    
    int Key;
    int x,y;
    char player = (char)1;
    char back = ' ';
    char s_save = ' ';
    bool switcher = false;
    bool draw = false;
    int s_side;
    
    int main()
    {
        SetConsoleTitle("Console PhysX");
        DrawMap();
        while(Key != 27)
        {
        Map();
        Inst();
        Check();
        if(draw == true) DrawArray();
        if(kbhit()){ Key = getch(); Keys(); }
        if(kbhit()){ Key = getch(); Keys(); }
        if(kbhit()){ Key = getch(); Keys(); }
        CPos(21,0);
        Sleep(100);
        }
        return 0;
    }
    
    void DrawMap()
    {
         for(int i = 0; i < 20; i++)
         {
                 for(int j = 0; j < 30; j++)
                 {
                         switch(map[i][j])
                         {
                                          case 'X':
                                               CPos(i,j);
                                               cout << (char)219;
                                               break;
                         }
                 }
                 cout << endl;
         }
    }
    
    void Map()
    {
         for(int i = 0; i < 20; i++)
         {
                 for(int j = 0; j < 30; j++)
                 {
                         switch(map[i][j])
                         {
                                          case 'P':
                                               y = i;
                                               x = j;
                                               map[y][x] = 'P';
                                               CPos(i,j);
                                               cout << player;
                                               break;
                                          case '#':
                                               CPos(i,j);
                                               cout << '#';
                                               switch(switcher)
                                               {
                                                               case true:
                                                                    if (s_side == 1 && map[i][j-2] == ' ' && map[i][j-1] != 'W' || map[i][j-2] == 'W' && map[i][j-1] != '~' || map[i][j-2] == '~'){ s_save = map[i][j-1];
                                                                                                                                                        map[i][j-1] = ' ';
                                                                                                                                                        CPos(i,j-1); cout << ' ';
                                                                                                                                                        map[i][j-2] = s_save; }
                                                                    if (s_side == 2 && map[i][j+2] == ' ' && map[i][j+1] != 'W' || map[i][j+2] == 'W' && map[i][j+1] != '~' || map[i][j+2] == '~'){ s_save = map[i][j+1];
                                                                                                                                                        map[i][j+1] = ' ';
                                                                                                                                                        CPos(i,j+1); cout << ' ';
                                                                                                                                                        map[i][j+2] = s_save; }
                                                                    break;
                                               }
                                               break;
                                          case 'l':
                                               map[i][j] = 'L';
                                               CPos(i,j);
                                               cout << (char)176;
                                               break;
                                          case '5':
                                               map[i][j] = 'b';
                                               CPos(i,j);
                                               cout << (char)178;
                                               break;
                                          case 'L':
                                               CPos(i,j); 
                                               cout << (char) 176;
                                               if(map[i+1][j] == ' ' || map[i+1][j] == 'W'){ map[i][j] = ' '; CPos(i,j); cout << ' '; map[i+1][j] = 'l'; }
                                               break;
                                          case 'b':
                                               CPos(i,j);
                                               cout << (char)178;
                                               if(map[i+1][j] == ' ' || map[i+1][j] == 'W'){ map[i][j] = ' '; CPos(i,j); cout << ' '; map[i+1][j] = '5'; }
                                               break;
                                          case 'B':
                                               CPos(i,j);
                                               cout << (char)219;
                                               break;
                                          case 'w':
                                               CPos(i,j);
                                               SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 153);
                                               cout << ' ';
                                               StdColor();
                                               map[i][j] = 'W';
                                               break;
                                          case 'W':
                                               SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 153);
                                               CPos(i,j);
                                               cout << ' ';
                                               if(map[i-1][j] == '~'  && map[i+1][j] == '~' || map[i-1][j] == 'W') map[i][j] = '~';
                                               if(map[i+1][j] == ' ') map[i+1][j] = '`';
                                               if(map[i+1][j] == 'W' || map[i+1][j] == 'w' || map[i+1][j] == '~' || map[i+1][j] == '`');
                                               else if(map[i+1][j] == 'P');
                                               else{
                                               if(map[i][j-1] == ' ' && map[i+1][j] != 'P') map[i][j-1] = 'W';
                                               if(map[i][j+1] == ' ' && map[i+1][j] != 'P') map[i][j+1] = 'w';
                                               // Light block physx
                                               if(map[i][j-1] == 'L' && map[i][j-2] == ' '){ map[i][j-1] = 'W'; map[i][j-2] = 'L'; }
                                               if(map[i][j+1] == 'L' && map[i][j+2] == ' '){ map[i][j+1] = 'w'; map[i][j+2] = 'L'; }
                                               }
                                               StdColor();
                                               break;
                                          case '~':
                                               CPos(i,j); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 153); cout << ' '; StdColor();
                                               if(map[i-1][j] != 'W' && map[i-1][j] != 'w' && map[i-1][j] != '~' && map[i-1][j] != '`'){ map[i][j] = ' '; CPos(i,j); cout << ' '; }  
                                               if(map[i+1][j] == ' ' && map[i+1][j] != 'P'){ map[i+1][j] = '`'; }
                                               if(map[i+1][j] != 'W' && map[i+1][j] != 'w' && map[i+1][j] != '~' && map[i+1][j] != '`' && map[i+1][j] != ' ' && map[i+1][j] != 'P')
                                               {
                                                              map[i][j] = 'W';
                                               }
                                               break;
                                          case '`':
                                               map[i][j] = '~';
                                               CPos(i,j); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 153); cout << ' '; StdColor();
                                               break;
                         }
                 }
         }
         switcher = false;
    }
    
    void Keys()
    {
         switch(Key)
         {
                    case 9: // TAB
                         for(int i = 0; i < 20; i++)
                         {
                                 for(int j = 0; j < 30; j++)
                                 {
                                         switch(map[i][j])
                                         {
                                                          case 'P':
                                                                  break; 
                                                          case 'X':
                                                                  break;
                                                          default:
                                                                  map[i][j] = ' ';
                                                                  CPos(i,j);
                                                                  cout << ' ';
                                                                  break;
                                         }
                                 }
                         }
                         DrawMap();
                         CPos(y,x);
                         cout << (char)1;
                         back = ' ';
                         break;
                    case 112: // P
                         switch(draw)
                         {
                                     case true:
                                          draw = false;
                                          system("CLS");
                                          DrawMap();
                                          break;
                                     case false:
                                          draw = true;
                                          break;
                         }
                         break;
                    case 32: // SPACE
                         back = ' ';
                         break;
                    case 114: // R
                         switcher = false;
                         back = '#';
                         break;
                    case 99: // C
                         back = 'L';
                         break;
                    case 102: // F
                         back = 'b';
                         break;
                    case 113: // Q
                         back = 'B';
                         break;
                    case 101: // E
                         back = 'W';
                         break;
                    case 75: // LEFT
                         switcher = true;
                         s_side = 1;
                         break;
                    case 77: // RIGHT
                         switcher = true;
                         s_side = 2;
                         break;
                    case 119: // W
                    if(map[y-1][x] == 'X') break;
                         map[y][x] = back;
                         CPos(y,x);
                         cout << back;
                         back = map[y-1][x];
                         y--;
                         map[y][x] = 'P';
                         CPos(y,x);
                         cout << player;
                         break;
                    case 115: // S
                    if(map[y+1][x] == 'X') break;
                         map[y][x] = back;
                         CPos(y,x);
                         cout << back;
                         back = map[y+1][x];
                         y++;
                         map[y][x] = 'P';
                         CPos(y,x);
                         cout << player;
                         break;
                    case 97: // A
                    if(map[y][x-1] == 'X') break;
                         map[y][x] = back;
                         CPos(y,x);
                         cout << back;
                         back = map[y][x-1];
                         x--;
                         map[y][x] = 'P';
                         CPos(y,x);
                         cout << player;
                         break;
                    case 100: // D
                    if(map[y][x+1] == 'X') break;
                         map[y][x] = back;
                         CPos(y,x);
                         cout << back;
                         back = map[y][x+1];
                         x++;
                         map[y][x] = 'P';
                         CPos(y,x);
                         cout << player;
                         break;
         }
    }
    
    void Check()
    {
         if(back == '~' || back == '`') back = ' ';
    }
    
    void Inst()
    {
         CPos(1,32);
         cout << "WASD - move";
         CPos(2,32);
         cout << "L/R arrows - switchers";
         CPos(3,32);
         cout << "Q - place block " << (char)219;
         CPos(4,32);
         cout << "F - place falling block " << (char)178;
         CPos(5,32);
         cout << "E - place water block "; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 153); cout << ' '; StdColor();
         CPos(6,32);
         cout << "R - place switcher " << '#';
         CPos(7,32);
         cout << "C - place light block " << (char)176;
         CPos(8,32);
         cout << "P - draw array";
         CPos(9,32);
         cout << "TAB - clean the map";
         CPos(10,32);
         cout << "ESC - exit";
         CPos(21,0);
    }
    
    Ich will das man die Blöcke dann auch wieder abbauen kann.
    Und dass es mehrere Blöcke gibt also andere Farben und so  :) 
    
    Auch möchte ich dass man die Blöcke neben dem Spieler platzieren kann:
     x         P  ... Player
    xPx        x ... dort sollte man dann die Blöcke platzieren können
     x
    


  • Und wo sind deine Schwierigkeiten, das umzusetzen? Lass mich raten: du verstehst den Code nicht komplett. 🙂 Mein Vorschlag wäre, dass du dein Spiel lieber selbst programmierst, anstatt dir fremden Code aus dem Internet zu besorgen. Was du selbst schreibst, verstehst du auch (hoffentlich 😉 ). Also kannst du es auch nach deinen Wünschen verändern.



  • Ja genau ich versteh den Code nicht deswegen wollte ich fragen ob jemand so nett ist und mir dabei hilft 🙂



  • Wenn du konkret Hilfe zum Code brauchst musst du natürlich auch schildern, was du verstehst und was nicht, damit man dir behilflich sein kann. Bitte gib dir doch etwas Mühe und beschreibe, was die Probleme bereitet.



  • Also ich weiß nicht wie ich das machen kann, dass der Spieler nicht schwebt, sondern läuft(a,d) und springt(Space) und wo ich das dann einfügen muss 😕



  • Tut mir leid, dir das zu sagen, aber wenn du nicht den geringsten Ansatz hast, wie du deine Änderungen durchführen könntest, dann wird das nicht funktionieren. Auch nicht mit Hilfe unsererseits. Jetzt könnte dir natürlich jemand was basteln (vorausgesetzt, du findest hier jemanden, der das freiwillig für dich machen möchte). Dann hättest du deinen laufenden und springenden Charakter. Tja, und dann willst du wieder irgendwas haben, wie z.B. mehrere Screens, durch die dein Charakter durchläuft oder so. Und wieder wirst du nicht den geringsten Ansatz haben, wie du den Code verändern musst. Einfach, weil du ihn überhaupt nicht verstehst. Mach es doch anders: lerne die Sprache, in der du programmieren willst, anstatt wild rumzuraten und auf fremde Hilfe angewiesen zu sein. Wenn du dir erst mal ein paar Grundlagen angeeignet hast, ist das Schreiben solcher Konsolenspielchen auch kein Problem mehr. Und damit meine ich selbst schreiben. Nicht aus dem Internet kopieren und im Internet erweitern lassen. Viel befriedigender, glaub mir. 🙂



  • Danke für den Tipp 🙂 Ich habe jetzt ein Buch gekauft (für Anfänger)

    Könntest du mir BITTE beim Spiel helfen? Also immer dazu sagen für was der Code steht und so...ich finde so lernt man programmieren viel schneller 🙂
    wäre echt nett und toll von dir, wenn du mir die Codes die ich für solche Konsolenspiele benötige beibringst und erklärst 👍
    Ich wäre dir sehr sehr dankbar 😃



  • Ich glaube bei dir hackts.



  • Was meinst du mit "ich glaube bei dir hackts" ?! 😕



  • Wir haben zwar keinen größern Wunsch als jemandem hier den Popo abzuwischen, aber leider sind alle Freiwilligen leider schon in den Waldorfschulen im Einsatz, bitte warten Sie, der nächste freie Forenbesucher ohne Leben und Freizeit wird Ihnen zur Hand gehen.



  • Gegenvorschlag: ich gebe dir ein Grundgerüst für ein Konsolenspielchen. Es behinhaltet wirklich nur das Steuern einer Figur über die Pfeiltasten in alle 4 Richtungen. Es hat kein Menü, du kannst nicht springen o.ä., es gibt keine Kollisionsabfrage - es kann fast gar nichts. Aber es ist so simpel, dass du als Anfänger keine großen Schwierigkeiten haben solltest, es zu verstehen. Ich habe bewusst auf alles verzichtet, was dich überfordern könnte. Wenn du einzelne Funktionen oder Schlüsselwörter nicht kennst oder verstehst, schlage sie in der Doku nach (wenn die Doku nicht hilft, frage hier einfach nach). Und sobald du das bisschen Code durchblickst, kannst du anfangen, es nach deinen Wünschen zu verändern. Wenn du beispielsweise eher in Richtung Jump 'n' Run gehen willst, macht es keinen Sinn, dass du die Figur nach unten steuern kannst. Also nimmst du es raus. Es macht keinen Sinn, dass du die Figur zeichenweise nach oben bewegen kannst. Also änderst du es ab und machst aus dem simplen Bewegen einen Sprung. Und damit du nicht auf dem Nichts 'rumspringst, zeichnest du unten einen Balken. Und so weiter, und so weiter. Arbeite dich Stück für Stück vor.

    ich finde so lernt man programmieren viel schneller

    Nö, leider nicht. Man lernt programmieren am besten, indem man programmiert. Nicht, indem man fremden Code benutzt, den man nicht versteht.

    #include <iostream> 
    #include <windows.h> 
    #include <conio.h> 
    
    using namespace std; 
    
    void SetPos(int x, int y) 
    { 
    	COORD cPos; 
    	cPos.X = x;
    	cPos.Y = y;
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos); 
    }
    
    enum Keys {
    	left=75,
    	right=77,
    	up=72,
    	down=80
    };
    
    int main() {
    	unsigned int xPos=40;
    	unsigned int yPos=12;
    	const char player=1;
    
    	do {
    		SetPos(xPos,yPos);
    		cout << player;
    		if(kbhit()) {
    			SetPos(xPos,yPos);
    			cout << " ";
    			unsigned char key=getch();
    			switch(key) {
    			case Keys::left:
    				--xPos;
    				break;
    			case Keys::right:
    				++xPos;
    				break;
    			case Keys::up:
    				--yPos;
    				break;
    			case Keys::down:
    				++yPos;
    				break;
    			}
    		}
    	} while(1);
    }
    


  • @_matze
    Bitte antworte doch auf so unverschämte Anfragen nicht auch noch.
    Ich persönlich finde sogar jegliche Erklärung warum das total unverschämt ist schon zuviel, ich mach mich doch nicht zum Affen und erkläre jmd. die Grundbegriffe der Höflichkeit.



  • @_matze
    vielen vielen Dank!!
    Ich finde dein Vorschlag gut und werde es auch so probieren! 🙂



  • Beim Kompilieren gab es Fehlermeldungen:

    [Error] 'Keys' is not a class or namespace

    😕 😕 Was jetzt??



  • Humanorgan schrieb:

    Beim Kompilieren gab es Fehlermeldungen:

    [Error] 'Keys' is not a class or namespace

    😕 😕 Was jetzt??

    Jetzt guckst du in dein Programmiersprachenbuch für Anfänger und schlägst nach.



  • PS:

    Der Code von _matze läuft übrigens nicht unter Linux.



  • hustbaer schrieb:

    @_matze
    Bitte antworte doch auf so unverschämte Anfragen nicht auch noch.
    Ich persönlich finde sogar jegliche Erklärung warum das total unverschämt ist schon zuviel, ich mach mich doch nicht zum Affen und erkläre jmd. die Grundbegriffe der Höflichkeit.

    Na ja, ich hatte hier noch Hoffnung, ehrlich gesagt. Ich hoffe, dass er sich jetzt mal auf seinen Arsch setzt und lernt, und wir nicht (mehr) jede Zeile vorkauen sollen. 😉

    Popo Abwischer schrieb:

    PS:

    Der Code von _matze läuft übrigens nicht unter Linux.

    Muss er auch nicht. Siehe Eröffnungspost (windows.h).



  • Ich bin der Meinung das man Neulingen frühzeitig beibringen sollte, darauf zu achten, dass der Code crossplattformfähig ist und überall läuft.



  • @Humanorgan:
    Fehler von _matze.
    Ersetze das enum durch ein enum class oder lasse das Keys:: weg.


Anmelden zum Antworten