c# - ¿Cómo puedo compartir valores de variables entre diferentes clases?

CorePress2024-01-24  7

Soy bastante nuevo en C#, así que comencé a crear un juego de rol simple como una forma de implementar mis habilidades de una manera divertida a medida que aprendo. Una cosa en particular con la que tengo problemas es encontrar una manera de compartir valores variables como el nombre del jugador y la salud actual en varias clases. Por ejemplo:

// below is the program class where the variables are given new values:

    class Program
    {
        public static Player thePlayer = new Player();
        static void Main(string[] args)
        {
            Console.WriteLine("What is your name?");
            thePlayer.name = Console.ReadLine();

            Console.WriteLine("Your name is " + thePlayer.name + ".");
            Console.WriteLine("Your health: " + thePlayer.health + "");

            Console.ReadLine();

            thePlayer.health--;
            Console.WriteLine("You get stung by a bee and lose 1 health.");
            Console.WriteLine("Your health is now " + thePlayer.health + ".");

            Console.ReadLine();

            Locations.Location2();
        }
    }

// below is the class that represents the initial values of the two variables:

    public class Player
    {
        public string name;
        public int health = 10;
    }

// the class below represents another in-game location the player can access. Currently, the player name and health value modified in the program class doesn't carry over to the Locations class as the locations class has its own values for the two variables.

    public class Locations
    {
        public static Player thePlayer = new Player();
        public static void Location2()
        {
            Console.WriteLine("You're in location 2 now.");
            Console.WriteLine("Your name is " + thePlayer.name + ".");
            Console.WriteLine("Your health: " + thePlayer.health +"");

            Console.ReadLine();
        }
    }

Mi pregunta es ¿cómo hago para que en la Ubicación 2, el nombre y la salud del jugador actual representen los mismos valores que tenían anteriormente en la clase del programa?

en su clase de Programa, ha configurado el Reproductor comopublic static, y sin establecer un modificador de acceso en la clase Programa, el valor predeterminado es interno, al que se debería poder acceder desde Ubicaciones. Entonces, en Ubicaciones, si elimina el campo thePayer y reemplaza las referencias a él con Program.thePlayer. Probablemente funcionará según sus necesidades. No es un gran patrón a seguir, pero a medida que vayas aprendiendo, esto te ayudará a seguir adelante.

usuario3282374

27 de marzo de 2021 a las 5:28

En general, cuando un objeto sabe algo y un segundo objeto (creado por el primer objeto) quiere saber algo, el primer objeto le dice al segundoDakota del Norte. En su ejemplo, la clase Prgram incluye el reproductor y la ubicación; Si la ubicación quiere saber el jugador, el programa tiene que dárselo. Por lo tanto, el programa hace Locations.ThePlayer = this.ThePlayer. En C# nombramos cosas públicas en PascalCase LikeThis, no CamelCaseLikeThis. En última instancia, la estática dificultará tu aprendizaje por lo que debes tener en cuenta la idea de empezar a evitarla pronto

- Caius Jard

27 de marzo de 2021 a las 5:33

¡Gracias por las respuestas, muy apreciadas!

-Ash G

27 de marzo de 2021 a las 6:23



------------------------------------

La instancia del Programa es pública y estática, por lo que puedes acceder a ella desde cualquier lugar. (Tal como están las cosas, estás creando uno nuevo solo para Ubicaciones).

public class Locations
{
    //No additional variable needed here, you already have one in Program

    public static void Location2()
    {
        Console.WriteLine("You're in location 2 now.");

        //Change these
        Console.WriteLine("Your name is " + Program.thePlayer.name + ".");
        Console.WriteLine("Your health: " + Program.thePlayer.health +"");

        Console.ReadLine();
    }
}

1

Gracias. Esta es probablemente la mejor manera de obtener el resultado que quiero por el momento.

-Ash G

27/03/2021 a las 22:48



------------------------------------

Puedes pasar el reproductor como parámetro a Ubicación2, por ejemplo:

public class Locations
{
    public static void Location2(Player thePlayer)
    {
        Console.WriteLine("You're in location 2 now.");
        Console.WriteLine("Your name is " + thePlayer.name + ".");
        Console.WriteLine("Your health: " + thePlayer.health +"");

        Console.ReadLine();
    }
}

O si estás seguro de que solo habrá un jugador, entonces puedes modificar la clase Ubicaciones para usar métodos no estáticos y usar un constructor:

public class Locations
{
    private Player thePlayer;

    public Locations(Player player)
    {
        thePlayer = player;
    }
    
    public void Location2()
    {
        Console.WriteLine("You're in location 2 now.");
        Console.WriteLine("Your name is " + thePlayer.name + ".");
        Console.WriteLine("Your health: " + thePlayer.health +"");

        Console.ReadLine();
    }
}

Uso

Locations location = new Locations(thePlayer);
location.Location2();

2

Un solo jugador, sí. Entonces, ¿cómo debería verse mi clase de programa en este caso, si no te importa que te lo pregunte? GraciasPor cierto, gracias por tu comentario, ¡agradezco la ayuda!

-Ash G

27 de marzo de 2021 a las 6:23

Simplemente reemplace Locations.Locations2() con el código en la sección Uso

- Hayden

27 de marzo de 2021 a las 6:25

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare