Bug en c# Siempre gana el jugador dos

cerverus94

Pues como digo en el titulo siempre siempre gana el segundo jugador y no encuentro el fallo

using System;

class Turno
{
    //ATRIBUTOS
    int contador; //cuenta en el turno en el que nos encontramos
    int accion;

//CONSTRUCTOR

public Turno()
{
    contador = 1; // un turno 0 no tiene sentido 
}

//METODOS

public int CONTADOR
{
    get
    {
        return contador;
    }

    set
    {
        contador = value;
    }
}

public int eleccion() //Aquí el jugador selecciona lo que desea hacer en ese turno y lo devuelve
{
    Console.WriteLine("Elije la acción que desea realizar");
    Console.WriteLine("1-Atacar");
    Console.WriteLine("2-Usar objeto");
    Console.WriteLine("3-Pasar turno");

    accion = Convert.ToInt16(Console.ReadLine());
    return (accion);
}
}
using System;

class Programa
{
    static void Main(string[] args)
    {
        do
        {

        Creación_personaje datos_personaje1 = new Creación_personaje(); //Los datos del primer personaje
        Creación_personaje datos_personaje2 = new Creación_personaje(); //Los datos del segundo personaje
        Turno turno = new Turno();//Quiza se pueda poner como static 
        Objetos objeto = new Objetos();//se encarga de controlar los objetos
        Random aleatorio_turno = new Random();//Nos creamos el número aleatorio que luego pasaremos a la clase combate
        int aleatorio = aleatorio_turno.Next(1, 3); //porque si no nunca saldria el 2



        Console.WriteLine("JUGADOR 1:");
        Personaje personaje1 = new Personaje(datos_personaje1.asignar_nombre(), datos_personaje1.asignar_clase()); //Creamos los personajes con los datos anteriormente recogidos
        Console.WriteLine("JUGADOR 2:");
        Personaje personaje2 = new Personaje(datos_personaje1.asignar_nombre(), datos_personaje1.asignar_clase());


        //PARTE DE JUEGO
        Combate combate = new Combate(turno, personaje1, personaje2, objeto, aleatorio);  //Metemos en el combate los dos personajes y los datos del turno
        combate.realizar_combate();//Ejecutamos la pelea

        //PEQUEÑO MENÚ QUE NOS PERMITE VOLVER A JUGAR

        Console.WriteLine("\nPULSA 1 PARA VOLVER A JUGAR O CUALQUIER OTRA TECLA PARA SALIR");
    } while (Convert.ToInt16(Console.ReadLine()) == 1); 
    

}

}
using System;


class Personaje //LA CLASE
{
    //ATRIBUTOS 

string nombre;
int PV; //condición de victoria PV=0
int Clase; // 1 planta, 2 fuego, 3 agua será elegido mediante un switch más adelante 
int objeto; // 0 vacio resto lleno



//CONSTRUCTOR
public Personaje(string n, int c) //Se lo pasamos desde el main después de haberlo preguntado al usuario
{
    PV = 60;
    nombre = n;
    Clase = c;
    objeto = 1;// de momento el personaje empieza con una pocion pocion = 1
}

//METODOS

public int pv
{
    get
    {
        return PV;
    }

    set
    {
        PV = value;
    }
}

public int Objeto//nos permite poner y quitar objetos
{
    get
    {
        return objeto;
    }

    set
    {
        objeto = value;
    }
}

public string GetNombre (){
    return (nombre);
}

public int GetClase()
{
    return(Clase);
}

public void datos_personaje()
{
    Console.WriteLine("\n" + nombre + " : " + PV + "PV");
}

public int atacar()//Realiza el ataque básico
{
    Console.WriteLine(nombre + " realizó un ataque básico");
    return (5);

}

public int ataque_potenciado()//De momento este ataque se puede lanzar cada 4 ataques
{
    Console.WriteLine(nombre + " realizó un ataque potenciado!!!");
    return (10);
}


}
using System;

class Creación_personaje
{
    //ATRIBUTOS
    string nombre;
    int clase;

//CONSTRUCTOR como no vamos a meter ningún parametro dejamos el predefinido

//METODOS

public string asignar_nombre()
{
    Console.WriteLine("Introduzca su nombre: ");
    return (nombre = Console.ReadLine());

}

public int asignar_clase()
{
    Console.WriteLine("Introduzca el nombre de la clase que desea");
    Console.WriteLine("1-Fuego");
    Console.WriteLine("2-Agua");
    Console.WriteLine("3-Planta");
    clase = Convert.ToInt16(Console.ReadLine());

    return (clase);

}



}
using System;

class Combate
{
    Objetos objeto;
    Turno turno;
    Personaje personaje1;
    Personaje personaje2;
    int jugador_aleatorio;
    Personaje primero; //Nos permiten guardar cual de los dos personajes es el primero
    Personaje segundo;


public Combate(Turno t, Personaje p, Personaje s,Objetos o,int aleatorio) //TENEMOS QUE METERLE EL OBJETO TURNO Y LOS DOS PERSONAJES
{
    turno = t;
    personaje1 = p;
    personaje2 = s;
    objeto = o;
    jugador_aleatorio = aleatorio;

}

//METODOS



public void realizar_combate() 
{
    //EMPEZAMOS CON LOS JUGADORES
    if (jugador_aleatorio == 1)
    {
        primero = personaje1;
        segundo = personaje2;
    }
    else
    {
        primero = personaje2;
        segundo = personaje1;
    }

        //BUCLE DE PARTIDA

    do
    {


        //VEMOS SI EL TURNO ES DIVISIBLE ENTRE 5 SI ES ASI ASIGNAMOS UN OBJETO ALEATORIO AL JUGADOR
        if (turno.CONTADOR % 5 == 0)
        {
            objeto.asignar_objeto(primero);

        }

        //SWITCH PARA EL JUGADOR I
        Console.WriteLine(" \nTUNRO DE " + primero.GetNombre());

        switch (turno.eleccion())
        {
            case 1:

                if (turno.CONTADOR % 5 == 0)//si el turno es divisible entre 5 es decir cada 4 turnos se lanza un ataque potenciado
                {
                    segundo.pv = segundo.pv - primero.ataque_potenciado(); //restamos los puntos de vida al otro jugador
                    segundo.datos_personaje();
                }

                else //En los demas turnos lanza un atque normal
                {
                    segundo.pv = segundo.pv - primero.atacar();
                    segundo.datos_personaje();

                }
                break;

            case 2:

                objeto.accion_objeto(primero,segundo);
                

                break;

            case 3:
                Console.WriteLine("Has pasado el turno");
                break;
        }


        //DAMOS OBJETO AL SEGUNDO
        if (turno.CONTADOR % 5 == 0)
        {
            objeto.asignar_objeto(segundo);

        }


        //SWITCH PARA LA ELECCIÓN DEL JUGADOR II
        Console.WriteLine(" \nTUNRO DE " + segundo.GetNombre());
        switch (turno.eleccion())
        {
            case 1:

                if (turno.CONTADOR % 5 == 0)//si el turno es divisible entre 5 es decir cada 4 turnos se lanza un ataque potenciado
                {

                    primero.pv = primero.pv - segundo.ataque_potenciado(); //restamos los puntos de vida al otro jugador
                    primero.datos_personaje();
                }

                else //En los demas turnos lanza un atque normal
                {
                    primero.pv = personaje1.pv - segundo.atacar();
                    primero.datos_personaje();

                }
                break;

            case 2:
                objeto.accion_objeto(segundo,primero);
                segundo.Objeto = 0; //Le quitamos el objeto al personaje
                break;

            case 3:
                Console.WriteLine("Has pasado el turno");
                break;
        }


        turno.CONTADOR++;

    } while (primero.pv > 0 && segundo.pv > 0);

    //MENSAJE DE VICTORIA

    if (primero.pv == 0)
    {
        Console.WriteLine("EL GANADOR ES: " + segundo.GetNombre());
    }
    if(segundo.pv == 0)
    {
        Console.WriteLine("EL GANADOR ES: " + primero.GetNombre());
    }

}



}

Creo que el error se encuentra en la clase combate.

gonya707

quiza mejor me quedo callado, pero si nos pones aqui todo tu codigo y esperas que alguien lo lea, lo asimile y encima te detecte donde esta el error de diseño vas dao.

Intenta reducir tus candidatos a errores algo mas e intenta pegar pedazos de codigo esenciales, no todo el programa.

5 1 respuesta
Fyn4r

Sin mirar el codigo ni nada me da que es la semilla con la que generas el número aleatorio (si es que lo generas)

Spacelord

#2 En mi caso desde luego, leerme trescientas y pico líneas de código ajeno para entender lo que hacen y encontrar un bug se me hace muy cuesta arriba. XDDD

Scottie

Dificil esta que la gente se lea tanto, aun asi, te doy la solucion a tu problema:

1 respuesta
cerverus94

#5 Y como funciona el control de errores? es que empece a programar hace poco.

1 respuesta
Scottie

#6 Lo que debes de hacer ahora: vas pasando lineas y comprendiendo lo que debe de hacer la linea, y piensas lo que hara la siguiente linea antes de que se ejecute. Si no hace lo que suponias, revisas. Las variables y objetos las puedes visualizar en que estado estan en las inspecciones.

Meliak

SOLUCIÓN: Puntos de ejecución y vas aislando el problema.

1 respuesta
E

no tengo claro que sea la solución pero veo algo raro en la linea

                        primero.pv = personaje1.pv - segundo.atacar();

con respecto al mismo código del otro jugador

                        segundo.pv = segundo.pv - primero.atacar();

y digo que veo algo raro porque creo que esto haría ganar al primero siempre puesto que su contador de vida parte del original en cada ataque y no como al segundo que si se van restando los puntos de los ataques...

1 respuesta
IAF

Cambia

primero.pv = personaje1.pv - segundo.atacar();

por:

primero.pv = primero.pv - segundo.atacar();
cerverus94

Ya lo arregle#10 #9 #8

a solución era poner dos if dentro de la clase combate.

using System;

class Combate
{
    Objetos objeto;
    Turno turno;
    Personaje personaje1;
    Personaje personaje2;
    int jugador_aleatorio;
    Personaje primero; //Nos permiten guardar cual de los dos personajes es el primero
    Personaje segundo;


public Combate(Turno t, Personaje p, Personaje s, Objetos o, int aleatorio) //TENEMOS QUE METERLE EL OBJETO TURNO Y LOS DOS PERSONAJES
{
    turno = t;
    personaje1 = p;
    personaje2 = s;
    objeto = o;
    jugador_aleatorio = aleatorio;

}

//METODOS



public void realizar_combate()
{
    //EMPEZAMOS CON LOS JUGADORES
    if (jugador_aleatorio == 1)
    {
        primero = personaje1;
        segundo = personaje2;
    }
    else
    {
        primero = personaje2;
        segundo = personaje1;
    }

    //BUCLE DE PARTIDA

    while (primero.pv > 0 && segundo.pv > 0)
    {

        if (primero.pv > 0)
        {

            //VEMOS SI EL TURNO ES DIVISIBLE ENTRE 5 SI ES ASI ASIGNAMOS UN OBJETO ALEATORIO AL JUGADOR
            if (turno.CONTADOR % 5 == 0)
            {
                objeto.asignar_objeto(primero);

            }

            //SWITCH PARA EL JUGADOR I
            Console.WriteLine(" \nTURNO DE " + primero.GetNombre());


            switch (turno.eleccion())
            {
                case 1:

                    if (turno.CONTADOR % 5 == 0)//si el turno es divisible entre 5 es decir cada 4 turnos se lanza un ataque potenciado
                    {
                        segundo.pv = segundo.pv - primero.ataque_potenciado(); //restamos los puntos de vida al otro jugador
                        segundo.datos_personaje();
                    }

                    else //En los demas turnos lanza un atque normal
                    {
                        segundo.pv = segundo.pv - primero.atacar();
                        segundo.datos_personaje();

                    }
                    break;

                case 2:

                    objeto.accion_objeto(primero, segundo);


                    break;

                case 3:
                    Console.WriteLine("Has pasado el turno");

                    break;
            }




            if (segundo.pv > 0)
            {

                //DAMOS OBJETO AL SEGUNDO
                if (turno.CONTADOR % 5 == 0)
                {
                    objeto.asignar_objeto(segundo);

                }


                //SWITCH PARA LA ELECCIÓN DEL JUGADOR II
                Console.WriteLine(" \nTURNO DE " + segundo.GetNombre());
                switch (turno.eleccion())
                {
                    case 1:

                        if (turno.CONTADOR % 5 == 0)//si el turno es divisible entre 5 es decir cada 4 turnos se lanza un ataque potenciado
                        {

                            primero.pv = primero.pv - segundo.ataque_potenciado(); //restamos los puntos de vida al otro jugador
                            primero.datos_personaje();
                        }

                        else //En los demas turnos lanza un atque normal
                        {
                            primero.pv = primero.pv - segundo.atacar();
                            primero.datos_personaje();

                        }
                        break;

                    case 2:
                        objeto.accion_objeto(segundo, primero);
                        segundo.Objeto = 0; //Le quitamos el objeto al personaje
                        break;

                    case 3:
                        Console.WriteLine("Has pasado el turno");
                        break;
                }
            }

            turno.CONTADOR++;

        }

        //MENSAJE DE VICTORIA

        if (primero.pv == 0)
        {
            Console.WriteLine("EL GANADOR ES: " + segundo.GetNombre());
        }
        else
        {
            Console.WriteLine("EL GANADOR ES: " + primero.GetNombre());
        }

    }



}
}

Usuarios habituales