2016-04-24 4 views
-2

Ich versuche, ein C++ - Konsolenspiel zu machen - es gibt eine Karte mit '#' als Rahmen und einem '@', das über die Tastatur verschoben werden kann. Aber wenn man den Knopf drückt, passiert nichts ... Kann nicht herausfinden, was dieses Verhalten verursacht haben könnte.GetAsyncKeyState() funktioniert nicht, macht ein Konsolenspiel

 #include <iostream> 
     #include <windows.h> 

     using namespace std; 

     char Map[10][10]={ "#########", 
           "#  #", 
           "#  #", 
           "#  #", 
           "#  #", 
           "#  #", 
           "#  #", 
           "#  #", 
           "#@  #", 
           "#########"}; 

    int Gamespeed=100; 
    int lvl=0; 
    bool stopgame=false; 


    int main() 
    { 
    while (stopgame==false) 
    { 
      system("cls"); 
      for (int y=0; y<10; y++) 
      { 
       cout<<Map[y]<<endl; //rows 
    } 


    for (int y=0; y<10; y++) //rows 
     for (int x=0; x<10; x++) //columns 
       { 
         switch (Map[y][x]) 
         { 
         case '@': 
          { cout<<"@ here"; 
           if (GetAsyncKeyState(VK_UP)!=0) 
           { cout<<"Key up"; 
            int y2=y-1; 
            switch (Map[y2][x]) 
            { 
            case ' ': 
             { 
              Map[y][x]=' '; 
              y--; 
              Map[y][x]='@'; 
             } 
             break; 
            } 
           } 

           if (GetAsyncKeyState(VK_DOWN)!=0) 
           { 
              switch (Map[y+1][x]) 
               { 
               case ' ': 
                { 
                  Map[y][x]=' '; 
                  y++; 
                  Map[y][x]='@'; 
                } 
                break; 
               } 

           } 

           if (GetAsyncKeyState(VK_RIGHT)!=0) 
           { 
            switch (Map[y][x+1]) 
            { 
            case ' ': 
             { 
              Map[y][x]=' '; 
              x++; 
              Map[y][x]='@'; 
             } 
             break; 
            } 
           } 

           if (GetAsyncKeyState(VK_LEFT)!=0) 
           { 
            switch (Map[y][x-1]) 
            { 
            case ' ': 
             { 
              Map[y][x]=' '; 
              x--; 
              Map[y][x]='@'; 
             } 
             break; 
            } 
           } 
          } 
         } 


       } 






return 0; 
} 
+3

Der richtige Weg zu testen, ob eine Taste gedrückt ist, ist 'if (GetAsyncKeyState (...) <0) '. Was mit der Logik Ihres Codes nicht stimmt, ist aufgrund der Einrückung sehr schwer zu lesen. Riefst du deinen Code wirklich so ein? Haben Sie daran gedacht, Ihr Programm zu debuggen? Wenn Sie nicht wissen, was das bedeutet, müssen Sie aufhören, mehr Code zu schreiben und zu lernen, wie man debuggt. Jede andere Aktivität ist einfach eine Verschwendung Ihrer Zeit. –

+0

Es ist nicht wirklich mein Code, ich spiele nur mit dem Code aus diesem Video, https://www.youtube.com/watch?v=kfRjvvgjTNQ&list=PLGxFit7OrNc5jjF5rHPZSCaovAw_FvUiI&index=2 Mein Hauptanliegen ist es zu studieren, wie man mit dem umgehen Tastatureingabe und das Symbol bewegt sich trotzdem. – parsecer

+0

Die Verwendung von GetAsyncKeyState macht mir Sorgen aus einer Konsolenanwendung. Sein Teil des Benutzers 32 und seine Begleitfunktionen befassen sich alle mit dem Schlüsselstatus, der von der Nachrichtenschleife verwaltet wird. –

Antwort

1

Oh, schlechte Formatierung und Code-Stil, aber für mich ist es funktioniert, wenn Sie für while Zyklus schließen Klammer hinzufügen:

int main() 
{ 
    while (stopgame == false) 
    { 
     // your code here 
    } // <- you don't have this brace 
    return 0; 
} 
+0

Es wird eine "Schleife" genannt. –

+0

autsch, ja, mein Herr, danke, nur ein Tippfehler. – sashadereh

+0

Ich denke, es ist ziemlich klar, dass die Frage nicht den tatsächlichen Code enthält. Wenn dies der Fall wäre, wäre es richtig eingerückt und hätte die richtige Anzahl an geschweiften Klammern. –

Verwandte Themen