switch - if else c++
C++ do while loop (3)
Parece que hay mucha confusión aquí sobre la estructura básica del lenguaje y el flujo lógico. Escribir algunas aplicaciones de prueba muy simples que ejercen diferentes funciones de idioma probablemente te ayudarán mucho. (También lo hará un depurador paso a paso, si tiene uno)
do/while()
es una característica bastante avanzada que algunas personas pasan carreras enteras sin usar, ver: hacer ... mientras que mientras
Recomiendo obtener una base sólida con while
y if/else
antes incluso de usar for
. Lo primero do
debes do
es cuando acabas de terminar un ciclo o haz un bucle y te das cuenta de que puedes guardar una montaña de código de inicialización duplicado si cambias un poco el orden de ejecución. (Personalmente ni siquiera uso do
para eso, simplemente uso un iterador con while(true)/break
ya que me permite pre y post código todo dentro de un solo bucle)
Creo que esto simplifica lo que estás tratando de lograr:
void Board::Loop(void) {
//Display the postion of that Element.
for (unsigned int i = 0; i < 10; ++i) {
while(IsGoingToCollide(i)) //check is first, do while doesn''t make sense
objects[i]->ResetPosition();
moveObject(i); //same as ->SetPosition(XDir, YDir)?
//either explain difference or remove one or the other
}
}
El nombre de esta función me parece ambiguo:
bool Board::checkCollisions(int index) {
Yo recomendaría cambiarlo a:
// returns true if moving to next position (based on inertia) will
// cause overlap with any other object''s or structure''s current location
bool Board::IsGoingToCollide(int index) {
En contraste, checkCollisions()
también podría significar:
// returns true if there is no overlap between this object''s
// current location and any other object''s or structure''s current location
bool Board::DidntCollide(int index) {
Nota final: comprueba que ->ResetPosition()
pone las cosas dentro de los límites.
Tengo un vector con 10 elementos (todos de la misma clase para simplificar, llámalo ''a''). Lo que quiero hacer es verificar que ''A'' no sea a) ocultando las paredes ob) ocultando otra ''A''. Tengo una función de colisiones que hace esto.
La idea es simplemente hacer avanzar esta clase de bucle y mover ''A'' a la siguiente posición, si esa poción está causando una colisión, entonces necesita darse una nueva posición aleatoria en la pantalla. Debido a que la pantalla es pequeña, existe una buena posibilidad de que el elemento se coloque en otro (o en la parte superior de la pared, etc.). La lógica del código funciona bien en mi cabeza, pero al depurar el código, el objeto simplemente se queda atascado en el ciclo, y permanece en la misma posición. Se supone que ''A'' se mueve alrededor de la pantalla, ¡pero permanece quieto!
Cuando comento el ciclo Do while, y muevo la función ''MoveObject ()'', el código funciona perfectamente, los ''A'' se mueven por la pantalla. Es justo cuando intento y agrego la funcionalidad adicional que es cuando no funciona.
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());
}
}
La clase a continuación es la detección de colisión. Esto lo expandiré más tarde.
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;
}
}
Cualquier ayuda sería muy apreciada. Te compraré una cerveza virtual :-)
Gracias
Editar:
ResetPostion -> esto le dará al elemento A una posición aleatoria en la pantalla moveObject -> esto mirará la dirección del objeto y ajustará los cables x e Y apropiadamente.
Supongo que necesitas:
do { ...
... } while (checkCollisions(i));
Además, si tiene 10 elementos, entonces i = 0; i < 10; i++
i = 0; i < 10; i++
Y por cierto. no escriba if (something == true)
, simplemente if (something)
o if (!something)
for (unsigned int i = 0; i <= 10; ++i){
está mal porque es un ciclo de once elementos, usa
for (unsigned int i = 0; i < 10; ++i){
en lugar.
No define qué significa "no funciona", así que esa es toda la ayuda que puedo brindar por ahora.