C++ do-while-Schleife
Habe ich eine Vektor-holding 10 items (alle von der gleichen Klasse für die Einfachheit nennen es 'ein'). Was ich tun möchte, ist zu überprüfen, dass 'A' ist nicht entweder a) ausblenden der Wände oder b) versteckt sich ein weiteres 'A'. Ich habe eine collisions Funktion, die dies tut.
Die Idee besteht einfach darin, diese Schleife Klasse gehen und bewegen, 'A', um die nächste position, wenn, dass der Trank verursacht eine Kollision, dann muss es zu geben, selbst eine neue, zufällige position auf dem Bildschirm. Weil der Bildschirm klein ist, ist es eine gute chance, dass das element auf ein anderes (oder von oben von der Wand etc.). Die Logik der code funktioniert auch in meinem Kopf - aber das Debuggen Sie den code, der das Objekt einfach stecken bleibt in der Schleife, und bleiben in der gleichen position. 'A' soll sich auf dem Bildschirm bewegen, aber es bleibt immer noch!
Wenn ich kommentieren Sie die Do while-Schleife, und verschieben Sie die " MoveObject ()' - Funktion, bis der code funktioniert einwandfrei und das 'A' bewegen sich über den Bildschirm. Es ist nur, wenn ich versuchen, und fügen Sie zusätzliche Funktionen, um es, wenn es nicht funktioniert.
void Board::Loop(void){
//Display the postion of that Element.
for (unsigned int i = 0; i <= 10; ++i){
do {
if (checkCollisions(i)==true){
moveObject(i);
}
else{
objects[i]->ResetPostion();
}
}
while (checkCollisions(i) == false);
objects[i]->SetPosition(objects[i]->getXDir(),objects[i]->getYDir());
}
}
Die folgende Klasse ist die Kollisionserkennung. Diese werde ich dann später erweitern.
bool Board::checkCollisions(int index){
char boundry = map[objects[index]->getXDir()][objects[index]->getYDir()];
//There has been no collisions - therefore don't change anything
if(boundry == SYMBOL_EMPTY){
return false;
}
else{
return true;
}
}
Jede Hilfe wäre sehr geschätzt werden. Ich werde kaufen Sie ein virtuelles Bier 🙂
Dank
Edit:
ResetPostion -> dieses wird das element A einer beliebigen position auf dem Bildschirm
moveObject -> dieses wird sich mit der Richtung des Objekts und stellen Sie die x-und Y-Kabel ist angemessen.
- +1 für das virtuelle Bier.
- nicht
->SetPosition()
so ziemlich das gleiche tun wiemoveObject()
? Vielleicht entfernen eine oder andere aus dem code-Beispiel, um Verwirrung zu vermeiden? Auch, warum die unendlichewhile()**;**
? und auch ohne das Semikolon, warum bewegeni
zweimal in einer Schleife? - Die 10 Elemente in einem array. Der erste index, der von 0 startet nicht bei 1, nicht wahr? Was sowieso ResetPosition tut? Nichts?
- Guter Punkt. Nehmen Sie Ihren Punkt an Bord. Ich merge die zwei in eins Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie müssen:
Auch, wenn Sie 10 Elemente, dann
i = 0; i < 10; i++
Und btw. schreiben Sie nicht
if (something == true)
einfachif (something)
oderif (!something)
while (!checkCollisions(i));
wäre das gleiche wie das original-code.ist falsch, denn das ist ein loop für die elf items, verwenden Sie
statt.
Sie definieren nicht, was "funktioniert nicht" bedeutet, also das ist alle Hilfe, die ich geben kann für jetzt.
Es scheint eine Menge Verwirrung hier über die grundlegende Struktur der Sprache und Logik fließen. Schreiben Sie ein paar sehr einfache test-apps, die üben verschiedene Funktionen der Sprache wird wahrscheinlich helfen, eine Menge. (So wird ein Schritt-thru-debugger, wenn Sie eine haben)
do/while()
ist ein ziemlich erweiterte Funktion, die von einigen Menschen verbringen ganze Karriere nie verwenden, finden Sie unter: do...while-vs währendIch empfehlen, sich ein solides Fundament mit
while
undif/else
bevor Sie sogar mitfor
. Der erste Blick aufdo
sein sollten, wenn Sie haben gerade einewhile
oderfor
loop und erkennen, das Sie retten könnte ein Berg von doppelten code für die Initialisierung, wenn Sie gerade verändert die Reihenfolge der Ausführung ein bisschen. (Ich persönlich don ' T verwenden sogardo
für mehr, ich nur benutzen Sie einen iterator mitwhile(true)/break
da lässt es mir vor und post code, die alle innerhalb einer single-loop)Ich denke, das vereinfacht das, was Sie versuchen zu erreichen:
Diese Funktion name scheint mehrdeutig zu mir:
Ich würde empfehlen, es zu verändern:
Im Gegensatz
checkCollisions()
könnte auch bedeuten:Letzte Anmerkung: überprüfen Sie, dass
->ResetPosition()
stellt die Dinge innen die Grenzen.