public void seleccionaDir(int fant) { //Crear la lista de dirs posibles ListaPares l = new ListaPares(); int cont = 0; posiblesDirs(fant, out l, out cont); //Ya tenemos la lista de posibles dirs //Ahora hay que eliminar la contraria si hay mas de 1 direccion //Cogemos un elemento random de la lista int ran = rnd.Next(0, cont); //Y cambiamos la direccion if (cont > 0) { l.nEsimo(ran, out pers[fant].dirX, out pers[fant].dirY); } }
public void posiblesDirs(int fant, out ListaPares l, out int cont) { //Inicializamos las direcciones l = new ListaPares(); l.insertaFin(1, 0); l.insertaFin(0, 1); l.insertaFin(-1, 0); l.insertaFin(0, -1); //Inicializamos la lista de direcciones cont = 4; int dx, dy; int nx, ny; //Ahora hacemos un recorrido en esa lista l.iniciaRecorrido(); while (l.dame_actual_y_avanza(out dx, out dy)) { //Donde comprobamos para cada direccion de el fantasma dado si se puede mover if (!(siguiente(pers[fant].posX, pers[fant].posY, dx, dy, out nx, out ny) && !hayFantasma(nx, ny))) { //En cuyo caso añadimos la direccion a la lista de posibles direcciones y aumentamos cont l.eliminaElto(dx, dy); cont--; } else if (!(siguiente(pers[fant].posX, pers[fant].posY, dx, dy, out nx, out ny))) { l.eliminaElto(-pers[fant].dirX, -pers[fant].dirY); cont--; } } if (cont > 1) { l.eliminaElto(-pers[fant].dirX, -pers[fant].dirY); // (0,1) --> (-0,-1) = (0,-1) , Que es la dir contraria cont--; } }