C#如何在多个类中使用变量?

时间:2017-12-03 23:18:17

标签: c#

我决定尝试制作一个基于文本的游戏,此时我正试图找到一种方法,在使用Console.Clear后将屏幕上的角色统计数据保留在屏幕上。

我尝试这样做的方法是创建一个函数:

    static void Stats()

我遇到的问题是我必须使用位于代码主要部分的变量:

     static void Main(string[] args)

但是我不知道如何做到这一点,我在查找时找到的一种方法是在函数之外创建一个字符串:

     public static string Player_Gender;

据我所知,虽然这令人不悦。如果我错误地相信这一点,请告诉我,我可以继续这样做,但是如果这是正确的,那么请你给我一个替代方案吗?

我还没有完成这个功能,因为我想在更改我的代码之前解决这个问题,但这就是添加其他统计信息等大致的结果。

    static void Stats()
    {
        Console.Clear();
        Console.WriteLine("| |================================| |");
        Console.WriteLine("| | Character description + stats: | |");
        Console.WriteLine("| | Gender: {0}                    | |", Player_Gender);
    }

目前,变量存储在此处:

    static void Main(string[] args)
    {
        //Ints:
        int correct = 0;
        int Player_One_Handed = 0;
        int Player_Two_Handed = 0;
        int Player_Ranged_Weapon = 0;
        int Player_Magic = 0;
        int Arraycount = 0;
        int Player_Attack_Type = 0;
        int Player_One_Weapon_Damage = 2;
        int Player_Two_Weapon_Damage = 2;
        int Player_Ranged_Weapon_Damage = 2;
        int Player_Magic_Damage = 2;
        int Player_Health_Points = 20;
        int Player_Mana_Points = 12;
        int Enemy_Health_Points;
        int Enemy_Maximum_Damage;
        int Player_Inventory_Money = 0;
        int Player_Inventory_Experience = 0;
        int Player_Quest_Progress = 0;
        int Player_Quest_Goal;
        int Player_EXP = 0;
        int Player_Checked_For_Item = 0;
        int Player_Quest_Objective_Complete = 0;

        //Strings:
        string Player_Gender_Confirm;
        string Player_Race;
        string Player_Race_Confirm;
        string Player_Class;
        string Player_Class_Confirm;
        string[] Inventory = new string[20];
        string Enemy_Name;
        string Player_Quest = " ";
        string Quest_Accepted;
        string Player_Quest_Enemy;

1 个答案:

答案 0 :(得分:5)

最简单的方法是将值作为参数传递:

static void Stats(string gender)
{
    Console.Clear();
    Console.WriteLine("| |================================| |");
    Console.WriteLine("| | Character description + stats: | |");
    Console.WriteLine("| | Gender: {0}                    | |", gender);
}

像这样使用:

Stats(Player_Gender);

但毕竟这不是一个好主意,因为你不想传递25个不同的参数。

相反,写一个包含所有播放器变量的新类。包括描述玩家的每个变量,并且不包括不描述玩家的变量。

public class Player
{
    public int OneHanded { get; set; }

    public string Name { get; set; }
    public string Race { get; set; }
    public string Gender { get; set; }
    public string Class { get; set; }

    //  ...etc. etc. -- include EVERYTHING that is a property of a player. 

    //  Now your Stats() method has direct access to all the player's properties
    //  Print stats for THIS player
    public void PrintStats()
    {
        Console.Clear();
        Console.WriteLine("| |================================| |");
        Console.WriteLine("| | Character description + stats: | |");
        Console.WriteLine("| | Gender: {0}                    | |", Gender);
        Console.WriteLine("| | Race: {0}                    | |", Race);
    }
}

Console.WriteLine()次调用中,您将无法进行对齐。 Console.WriteLine()的工作方式与String.Format()的工作方式相同,因此您拥有some options to control alignment

在Main ...

static void Main(string[] args)
{
    var player = new Player();

    //  Whatever
    player.Name = "Bob";
    player.Gender = "Male";

    //  print stats for Bob
    player.PrintStats();

    var otherPlayer = new Player();
    otherPlayer.Name = "Fred";

    //  print stats for Fred
    otherPlayer.PrintStats();

我们开始看到写一个类的价值:几乎没有额外的努力和几乎零额外的代码混乱,你可以有两个具有相同属性集的玩家,而不是一个。您可以在一行中重新初始化播放器:

player = new Player();

你可以非常简单地将关于给定玩家的所有内容传递给另一种方法:

player.Assault(otherPlayer);

等等。