public bool Equals(clsFicha f) { if (this.Ubicacion.X == f.ubicacion.X && this.ubicacion.Y == f.ubicacion.Y && this.tipo == f.tipo) { return(true); } else { return(false); } }
public auxMov(clsFicha pc, clsFicha pl, double distancia) { this.pc = pc; this.pl = pl; this.distancia = distancia; }
public bool Equals(clsFicha f) { if (this.Ubicacion.X == f.ubicacion.X && this.ubicacion.Y == f.ubicacion.Y && this.tipo == f.tipo) return true; else return false; }
/// <summary> /// valida el movimiento de la ficha hacia la IZQUIERDA /// contemplando la movilidad de la ficha y el rango del enemigo /// de ser posible realiza el movimiento y retorna true /// </summary> /// <param name="fichaPC"></param> /// <param name="cercana"></param> /// <returns></returns> private bool IAIzquierda(clsFicha fichaPC, clsFicha cercana) { for (int i = fichaPC.RangoMovimiento; i >= 1; i--) { Point destino = new Point(fichaPC.Ubicacion.X - (unidad * i), fichaPC.Ubicacion.Y); //si destino no es ni ostaculo, ni ficha, ni entra en rango enemigo if (!IAEnRangoPlayer(destino, cercana) && !obstaculos.Contains(destino) && !playerPoint.Contains(destino) && !pcPoint.Contains(destino) && destino.X > 0) { if (i == 1) { IAMoverFicha(fichaPC, destino); return true; } else if (i == 2) { Point intermedio = new Point(fichaPC.Ubicacion.X, destino.Y - unidad); if (!obstaculos.Contains(intermedio) && !playerPoint.Contains(intermedio) && !pcPoint.Contains(intermedio)) { if (cercana.Ubicacion.Y == intermedio.Y && !IAEnRangoPlayer(intermedio, cercana)) { IAMoverFicha(fichaPC, intermedio); return true; } else { IAMoverFicha(fichaPC, destino); return true; } } } else if (i == 3) { Point intermedio1 = new Point(fichaPC.Ubicacion.X, destino.Y - unidad); Point intermedio2 = new Point(fichaPC.Ubicacion.X, destino.Y - (unidad * 2)); if (!obstaculos.Contains(intermedio1) && !playerPoint.Contains(intermedio1) && !pcPoint.Contains(intermedio1) && !obstaculos.Contains(intermedio2) && !playerPoint.Contains(intermedio2) && !pcPoint.Contains(intermedio2)) { if (cercana.Ubicacion.Y == intermedio1.Y && !IAEnRangoPlayer(intermedio1, cercana)) { IAMoverFicha(fichaPC, intermedio1); return true; } else if (cercana.Ubicacion.Y == intermedio2.Y && !IAEnRangoPlayer(intermedio2, cercana)) { IAMoverFicha(fichaPC, intermedio2); return true; } else { IAMoverFicha(fichaPC, destino); return true; } } } } } return false; }
/// <summary> /// si alguna fichaPC tiene una fichaPLayer al alcance la elimina /// </summary> private bool IAmato() { if (sonido) soundFight(); foreach (clsFicha f in fichasPc)//si alguna ficha enemiga tiene un player al alcance lo mata { IAhayObjetivo(f); if (IATarget.Count > 0) { bool mato = false; clsFicha exPlayer = new clsFicha(); foreach (clsFicha fi in fichasPlayer) { if (IATarget.Contains(fi.Ubicacion)) { exPlayer = fi; IAObjetivo = fi.Ubicacion; gBase.DrawImage(Resources.blanco, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); gBase.DrawImage(f.ImagenMovimiento, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); gBase.DrawImage(exPlayer.ImagenObjetivo, IAObjetivo.X, IAObjetivo.Y, 48, 48); System.Threading.Thread.Sleep(1000); Explosion(IAObjetivo); gBase.DrawImage(Resources.blanco, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); gBase.DrawImage(f.ImagenQuieto, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); mato = true; break; } } if (mato) { fichasPlayer.Remove(exPlayer); playerPoint.Remove(exPlayer.Ubicacion); if (puntaje - 150 >= 0) puntaje = puntaje - 150; else puntaje = 0; lblPuntos.Text = puntaje.ToString(); return true; } } } return false; }
/// <summary> /// evalua si el posible movimiento de PCesta en el rango de Player /// </summary> /// <param name="posiblePc"></param> /// <param name="cercana"></param> /// <returns></returns> private bool IAEnRangoPlayer(Point posiblePc, clsFicha cercana) { int plX = cercana.Ubicacion.X; int plY = cercana.Ubicacion.Y; List<Point> rangoPlayer = new List<Point>(); for (int i = 1; i <= cercana.RangoTiro; i++) { Point a = new Point((plX + (i * unidad)), plY); Point b = new Point((plX - (i * unidad)), plY); Point c = new Point(plX, (plY + (i * unidad))); Point d = new Point(plX, (plY - (i * unidad))); rangoPlayer.Add(a); rangoPlayer.Add(b); rangoPlayer.Add(c); rangoPlayer.Add(d); } if (rangoPlayer.Contains(posiblePc)) { return true; } return false; }
/// <summary> /// IA-carga los posible blancos de la pc, en opcionesPlayer las posibles fichas, /// y en opcionesPc los posibles bloques /// y cambia la imagen del enemigo en accion /// </summary> /// <param name="f"></param> private void IAhayObjetivo(clsFicha f) { IATarget.Clear(); //gBase.DrawImage(Resources.blanco, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); //gBase.DrawImage(f.ImagenMovimiento, f.Ubicacion.X, f.Ubicacion.Y, 48, 48); //System.Threading.Thread.Sleep(1000); bool ar = true; bool ab = true; bool de = true; bool iz = true; for (int i = 1; i <= f.RangoTiro; i++) { int arriba = f.Ubicacion.Y - (unidad * i); int abajo = f.Ubicacion.Y + (unidad * i); int derecha = f.Ubicacion.X + (unidad * i); int izquierda = f.Ubicacion.X - (unidad * i); if (arriba >= 0 && ar) { Point arr = new Point(f.Ubicacion.X, arriba); if ((obstaculos.Contains(arr) || playerPoint.Contains(arr))) { IATarget.Add(arr); ar = false; } } if (abajo < pnlBase.Height && ab) { Point aba = new Point(f.Ubicacion.X, abajo); if ((obstaculos.Contains(aba) || playerPoint.Contains(aba))) { IATarget.Add(aba); ab = false; } } if (derecha < pnlBase.Width && de) { Point der = new Point(derecha, f.Ubicacion.Y); if ((obstaculos.Contains(der) || playerPoint.Contains(der))) { IATarget.Add(der); de = false; } } if (izquierda >= 0 && iz) { Point izq = new Point(izquierda, f.Ubicacion.Y); if ((obstaculos.Contains(izq) || playerPoint.Contains(izq))) { posiblesPc.Add(izq); iz = false; } } } }
/// <summary> /// elimina el objetivo clickeado y grafica una explosión /// </summary> /// <param name="p"></param> private void disparar() { clsFicha fi = new clsFicha(); if (obstaculos.Contains(objetivo)) { obstaculos.Remove(objetivo); puntaje += 50; } if (pcPoint.Contains(objetivo)) { foreach (clsFicha f in fichasPc) { if (f.Ubicacion == objetivo) { fi = f; break; } } pcPoint.Remove(objetivo); fichasPc.Remove(fi); puntaje += 100; } Explosion(objetivo); lblPuntos.Text = puntaje.ToString(); }
/// <summary> /// DEFINE el jugador seleccionado y guarda su posicion en "actual" /// </summary> /// <param name="pos"></param> private bool defActual(Point pos) { if (playerPoint.Contains(pos)) { foreach (clsFicha f in fichasPlayer) { if (f.Ubicacion == objetivo) { if (!actual.isNull()) { gBase.DrawImage(Resources.blanco, actual.Ubicacion.X, actual.Ubicacion.Y, 48, 48); gBase.DrawImage(actual.ImagenQuieto, actual.Ubicacion.X, actual.Ubicacion.Y, 48, 48); } actual = f;//defino jugador actual posiblesPlayer.Clear();//lista de posiciones posibles posiblesPc.Clear();//lista de enemigos al alcance limpiarSomYObj(); return true; } } } return false; }
private bool IAPosSupIzqPc(clsFicha fichaPC, clsFicha cercana) { //si pc esta arriba y a la izquierda if (fichaPC.Ubicacion.Y < cercana.Ubicacion.Y && fichaPC.Ubicacion.X <= cercana.Ubicacion.X) { //si esta mas "centrado" por Y que por X if (Math.Abs(fichaPC.Ubicacion.Y - cercana.Ubicacion.Y) <= Math.Abs(fichaPC.Ubicacion.X - cercana.Ubicacion.X)) { if (!IADerecha(fichaPC, cercana)) { if (!IAAbajo(fichaPC, cercana)) { if (!IAIzquierda(fichaPC, cercana)) { IAArriba(fichaPC, cercana); } } } } else { if (!IAAbajo(fichaPC, cercana)) { if (!IADerecha(fichaPC, cercana)) { if (!IAIzquierda(fichaPC, cercana)) { IAArriba(fichaPC, cercana); } } } } return true; } else return false; }
/// <summary> /// realiza el movimiento de una fichaPc randomeada /// </summary> private void IAmovimiento() { if (fichasPlayer.Count > 0) { clsFicha fichaPC = fichasPc[r.Next(0, fichasPc.Count)];//randomeo una fichaPC double distancia = pnlBase.Width; List<auxMov> distancias = new List<auxMov>(); foreach (clsFicha fpc in fichasPc) { clsFicha cercana = new clsFicha(); foreach (clsFicha f in fichasPlayer)//establezco la fichaPlayer mas cercana a la fichaPC randomeada { if (IADistancia(fpc.Ubicacion, f.Ubicacion) < distancia) { cercana = f; } } distancias.Add(new auxMov(fpc, cercana, IADistancia(fpc.Ubicacion, cercana.Ubicacion))); } distancia = pnlBase.Width; auxMov am = new auxMov(); foreach (auxMov a in distancias) { if (a.Distancia < distancia) am = a; } distancias.Clear(); if (!IAPosSupIzqPc(am.Pc, am.Pl)) { if (!IAPosSupDerPc(am.Pc, am.Pl)) { if (!IAPosInfIzqPc(am.Pc, am.Pl)) { IAPosInfDerPc(am.Pc, am.Pl); } } } //foreach (clsFicha f in fichasPlayer)//establezco la fichaPlayer mas cercana a la fichaPC randomeada //{ // if (IADistancia(fichaPC.Ubicacion,f.Ubicacion)<distancia) // { // cercana = f; // } //} //if(!IAPosSupIzqPc(fichaPC, cercana)) //{ // if (!IAPosSupDerPc(fichaPC, cercana)) // { // if (!IAPosInfIzqPc(fichaPC, cercana)) // { // IAPosInfDerPc(fichaPC, cercana); // } // } //} } }
/// <summary> /// grafica el movimiento de una ficha dada al lugar especificado en destino /// </summary> /// <param name="fichaPC"></param> /// <param name="destino"></param> private void IAMoverFicha(clsFicha fichaPC, Point destino) { gBase.DrawImage(fichaPC.ImagenSombra, destino.X, destino.Y, 48, 48); System.Threading.Thread.Sleep(500); gBase.DrawImage(Resources.blanco, fichaPC.Ubicacion.X, fichaPC.Ubicacion.Y, 48, 48); gBase.DrawImage(fichaPC.ImagenQuieto, destino.X, destino.Y, 48, 48); gBase.DrawImage(Resources.blanco, destino.X, destino.Y, 48, 48); gBase.DrawImage(fichaPC.ImagenQuieto, destino.X, destino.Y, 48, 48); pcPoint.Remove(fichaPC.Ubicacion); fichaPC.Ubicacion = destino; pcPoint.Add(destino); }