2016-04-16 7 views
1

Ich bin ein Computer-Ingenieur des ersten Jahres, so bin ich ein bisschen Amateur in Codierung C++, sowieso ich ein Spiel erstellen, wo es zwei Raumschiffe sind, die sich gegenseitig schießen. Es ist mir momentan gelungen, die erste Raumschiffbewegung durchzuführen, indem ich eine while-Schleife und die GetASyncKeyState-Funktion verwende. aber jetzt lasse ich die Kugeln reisen. Ich benutzte eine Schleife, und es gelang mir, die Kugel nach oben zu bewegen. Aber es gibt ein Problem, ich kann das Raumschiff nicht bewegen, bis der for-Loop-Stop oder das Bullet den oberen Rand des Konsolenfensters erreichen (ich benutze die Konsole btw). Gibt es eine Möglichkeit, sowohl die for-Schleife als auch gleichzeitig laufen zu lassen? oder um zwei verschiedene Funktionen gleichzeitig auszuführen, da GameMovement() für die Bewegung des Raumschiffs und BulletTravel() für die Kugel steht. und ich rufe BulletTravel() von GameMovement().Zwei Schleifen gleichzeitig ausführen? Bewegen und Reisen mit Loops

void GameMovements() 
{ 
bool FirstInitialization = true; 
int Player1XCoordinate = 55, Player2XCoordinate = 55; 
int Player1YCoordinateU = 28, Player1YCoordinateD = 29; 


while (true) 
{ 
    BulletPattern(Player1XCoordinate); 

    if (FirstInitialization == true) 
    { 
     GameBorderAndStatus(); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
     FirstInitialization = false; 
    } 

    //MOVEMENTS FOR PLAYER 1 
    else if (GetAsyncKeyState(VK_LEFT) && Player1XCoordinate != 16) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 

     Sleep(10); 
     Player1XCoordinate -= 3; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_RIGHT) && Player1XCoordinate != 94) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1XCoordinate += 3; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_UP) && Player1YCoordinateU != 24) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1YCoordinateU -= 2; 
     Player1YCoordinateD -= 2; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 
    else if (GetAsyncKeyState(VK_DOWN) && Player1YCoordinateU != 28) 
    { 
     system("cls"); 
     GameBorderAndStatus(); 
     Player1YCoordinateU += 2; 
     Player1YCoordinateD += 2; 

     Sleep(10); 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateU); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinateD); 
     cout << "^==|==^ \n"; 
    } 

} 
} 

void GameBorderAndStatus() 
{ 
     //Draw game border 
     for (int i = 0; i < 31; i++) 
     { 
     SetCoordinate(15, i); 
     cout << "|"; 
     SetCoordinate(104, i); 
     cout << "|"; 
     } 

} 

void BulletPattern(int Player1MuzzleLocation) 
{ 
    for (int i = 25; i != 3; i--) 
    { 
     Sleep(100); 
     SetCoordinate(Player1MuzzleLocation + 3, i); 

    } 
} 

void SetCoordinate(int CoordinateX, int CoordinateY) 
{ 
    COORD Coordinate; 
    Coordinate.X = CoordinateX; 
    Coordinate.Y = CoordinateY; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Coordinate); 
} 
+0

Ich bin mir nicht sicher, dass Sie sich dessen bewusst sind, aber keiner Ihrer "Game Code", die Sie verwenden ('GetAsyncKeyState',' SetCoordinate', usw.) sind Standard C++. Das bedeutet, dass wir keine Ahnung haben, was sie sind oder ob es ein Problem damit gibt, wie Sie sie verwenden. Ich würde Ihnen aufrichtig empfehlen, dass Sie mit Ihrem Lehrer sprechen, da es sehr wenig gibt, was wir tun können, um Ihnen bei der Fehlersuche in Ihrem Code mit so vielen Mystery-Funktionen zu helfen. –

+0

@ChrisBritt Es ist Sommer und die Klasse ist zu Ende. Ich tue das nur, um etwas Zeit zu verlieren. Wie auch immer, ich dachte, Sie alle würden GetASyncKetState() so leid tun. Irgendwie werde ich den Code mit SetCoordinate() darin aktualisieren. – Neo

+1

@Neo Da Ihr Code stark von der Windows-API abhängt, habe ich Ihre Frage erneut geschrieben, um Sie hoffentlich besser mit den relevanten Funktionen vertraut zu machen. Fühlen Sie sich frei, meine Bearbeitung zurückzusetzen, wenn Sie es nicht hilfreich finden. – computerfreaker

Antwort

1

Anstatt zwei verschiedene Funktionen und ein Objekt in jedem bewegen, könnten Sie beide bessere Ergebnisse zu verfolgen, wo jedes Objekt sein sollte, und mit einer Funktion zeichnen finden.

Es ist ein bisschen schwer zu sagen, was in Ihrem Code vor sich geht, da einige Funktionen und Variablendeklarationen fehlen (Ich sehe Sie nie wirklich eine Kugel zeichnen, zum Beispiel - ein Fehler in Ihrem BulletPattern?), aber etwas wie das könnte den Trick tun:

void GameMovements() 
{ 
    while (true) 
    {   
     //MOVEMENTS FOR PLAYER 1 
     if (GetAsyncKeyState(VK_LEFT) && Player1XCoordinate != GAMEBOARD_LEFT) 
     { 
      Player1XCoordinate -= 3; 
     } 
     else if (GetAsyncKeyState(VK_RIGHT) && Player1XCoordinate != GAMEBOARD_RIGHT) 
     { 
      Player1XCoordinate += 3; 
     } 
     else if (GetAsyncKeyState(VK_UP) && Player1YCoordinate != SPACESHIP_TOP) 
     { 
      Player1YCoordinate -= 2; 
     } 
     else if (GetAsyncKeyState(VK_DOWN) && Player1YCoordinate != SPACESHIP_BOTTOM) 
     { 
      Player1YCoordinate += 2; 
     } 

     Sleep(10); 

     UpdateBulletPosition(); 
     DrawObjects(); 
    } 
} 

void UpdateBulletPosition() 
{ 
    //if the bullet hits the top of the screen, remove it 
    if (bulletYCoordinate == GAMEBOARD_TOP) 
    { 
     bulletXCoordinate = 0; 
     bulletYCoordinate = 0; 
    } 

    //I assume you're automatically generating bullets whenever possible; you'll have to adjust this conditional if that's not the case 

    //no bullet? generate one 
    if (bulletXCoordinate == 0) 
    { 
     bulletXCoordinate = Player1XCoordinate + 3; 
     bulletYCoordinate = 25; 
    } 
    else 
    { 
     bulletYCoordinate--; 

     Sleep(100); 
    } 
} 

void DrawObjects() 
{ 
     //wipe the screen and show status first 
     system("cls"); 
     GameBorderAndStatus(); 

     SetCoordinate(Player1XCoordinate, Player1YCoordinate); 
     cout << " ^\n"; 
     SetCoordinate(Player1XCoordinate, Player1YCoordinate + 1); 
     cout << "^==|==^ \n"; 

     //only draw the bullet if there's a bullet there to draw 
     if (bulletXCoordinate != 0) 
     { 
      SetCoordinate(bulletXCoordinate, bulletYCoordinate); 
      cout << ".\n"; 
     } 
} 

const int GAMEBOARD_LEFT = 16; 
const int GAMEBOARD_RIGHT = 94; 
const int GAMEBOARD_TOP = 3; 
const int SPACESHIP_TOP = 24; 
const int SPACESHIP_BOTTOM = 28; 

int Player1XCoordinate = 55, Player2XCoordinate = 55; 
int Player1YCoordinate = 28; 
int bulletXCoordinate = 0, bulletYCoordinate = 0; 

Ich habe auch einige Verbesserungen an den Rest Ihres Codes. Jeder Fall in Ihrem if-else Block verwendet den gleichen grundlegenden Zeichnungscode, also habe ich das komplett aus dem if-else gezogen. Das ließ mich auch die gesamte Initialisierung if-else fallen lassen.

Ich habe auch eine Ihrer vertikalen Koordinaten für das Raumschiff fallen gelassen. Du brauchst wirklich nicht zwei; Behalte einfach die obere Koordinate im Auge und zeichne die untere Hälfte des Schiffes unter Player1YCoordinate + 1.

Schließlich ersetzte ich Ihre hardcoded Board Kanten mit Konstanten. Magische Zahlen sind im Allgemeinen verpönt; Wenn Sie benannte Konstanten verwenden, können Sie einfacher feststellen, warum Sie einen bestimmten Wert an einem bestimmten Speicherort verwenden, und den Code in Zukunft einfacher aktualisieren (möglicherweise müssen Sie für eine andere Konsolengröße aktualisieren).

+0

@Neo Es gilt als gute Übung, eine Antwort, die Sie nützlich finden, zu verbessern und als die richtige Antwort zu akzeptieren. :-) –

+0

@CareyGregory Ich würde gerne upvote, aber ich brauche mindestens 15 Reputationen zu upvote :( – Neo

Verwandte Themen