首页 > 解决方案 > 数组不会输出任何东西

问题描述

做学校活动,但我遇到了障碍。我似乎无法让程序输出我输入的数组。当 PlayerCharacter() 和 Mage() 中的变量都是常规变量时,输出有效。然后我把它们变成了数组,因为这是我们所需要的,但是在输出过程中它开始没有显示任何东西。

using System;

namespace Summative
{

class PlayerCharacter
{
    string[] name = new string[10];
    int[] life = new int[10];
    char[] gender = new char[10];
    public int i = 0;
    public int x = 0;

    public PlayerCharacter()
    {
        Console.Write("Enter character name: ");
        this.Name = Console.ReadLine();
        Console.Write("Enter Life: ");
        this.Life = int.Parse(Console.ReadLine());
        Console.Write("Enter Gender (M/F): ");
        this.Gender = char.Parse(Console.ReadLine());
        i++;

    }

    public string Name
    {
        get
        {
            return name[i];
        }
        set
        {
            name[i] = value;
        }
    }

    public int Life
    {
        get
        {
            return life[i];
        }
        set
        {
            life[i] = value;
        }
    }


    public char Gender
    {
        get
        {
            return gender[i];
        }
        set
        {
            if (value == 'M' || value == 'F')
            {
                gender[i] = value;
            }
            else
            {
                Console.WriteLine("Invalid Gender!");
            }
        }
    }

    public virtual void Output()
    {
        Console.WriteLine("Name: " + string.Join(",", Name));
        Console.WriteLine("Life: " + string.Join(",", Life));
        Console.WriteLine("Gender: " + string.Join(",", Gender));
    }
}
class Mage : PlayerCharacter
{
    string[] element = new string[10];
    int[] mana = new int[10];
    public Mage() : base()
    {
        Console.Write("Enter element: ");
        this.Elements = Console.ReadLine();
        Console.Write("Enter mana: ");
        this.Mana = int.Parse(Console.ReadLine());
    }

    public string Elements
    {
        get
        {
            return element[x];
        }
        set
        {
            element[x] = value;
        }
    }

    public int Mana
    {
        get
        {
            return mana[x];
        }
        set
        {
            mana[x] = value;
        }
    }

    public override void Output()
    {
        base.Output();
        Console.WriteLine("Element: " + string.Join(",", Elements));
        Console.WriteLine("Mana: " + string.Join(",", Mana));
        x++;
    }
}

class Rogue : PlayerCharacter
{
    string faction;
    float energy;

    public Rogue() : base()
    {
        Console.Write("Enter faction name: ");
        this.Faction = Console.ReadLine();
        Console.Write("Enter energy: ");
        this.Energy = float.Parse(Console.ReadLine());
    }

    public string Faction
    {
        get
        {
            return faction;
        }
        set
        {
            faction = value;
        }
    }

    public float Energy
    {
        get
        {
            return energy;
        }
        set
        {
            energy = value;
        }
    }

    public override void Output()
    {
        base.Output();
        Console.WriteLine("Faction: " + Faction);
        Console.WriteLine("Energy: " + Energy);
    }
}

class Fighter : PlayerCharacter
{
    string weapon;
    double strength;

    public Fighter() : base()
    {
        Console.Write("Enter weapon name: ");
        this.Weapon = Console.ReadLine();
        Console.Write("Enter strength: ");
        this.Strength = double.Parse(Console.ReadLine());
    }

    public string Weapon
    {
        get
        {
            return weapon;
        }
        set
        {
            weapon = value;
        }
    }

    public double Strength
    {
        get
        {
            return strength;
        }
        set
        {
            strength = value;
        }
    }

    public override void Output()
    {
        base.Output();
        Console.WriteLine("Weapon: " + Weapon);
        Console.WriteLine("Strength: " + Strength);
    }
}

class TestPlayer
{
    static void Main(string[] args)
    {
        PlayerCharacter character;



    CharacterCreator:



        int switchchoice = 0;

            Console.WriteLine("Select a class");
            Console.WriteLine("1. Mage");
            Console.WriteLine("2. Rogue");
            Console.WriteLine("3. Fighter");
            Console.WriteLine("0. Exit");
            Console.Write("Enter Choice: ");

            start:

            try
            {
                switchchoice = int.Parse(Console.ReadLine());
            }
            catch
            {
                Console.Clear();
                Console.WriteLine("Invalid Input! Please Try Again.");
                goto CharacterCreator;
            }

            switch (switchchoice)
            {
                case 1:
                    Console.Clear();
                    character = new Mage();
                    character.Output();
                    break;

                case 2:
                    Console.Clear();
                    character = new Rogue();
                    character.Output();
                    break;

                case 3:
                    Console.Clear();
                    character = new Fighter();
                    character.Output();
                    break;

                case 0:
                    Console.Clear();
                    goto start;

                default:
                    Console.Clear();
                    Console.WriteLine("Invalid Input! Please Try Again.");
                    goto CharacterCreator;
            }

        int choice;
        int y = 0;
        int z;
        int i = character.i;
        int x = character.x;

        Console.Clear();
        Console.WriteLine("Player Character Designer");
        Console.WriteLine("1. Create");
        Console.WriteLine("2. View");
        Console.Write("Enter Choice: ");
        choice = int.Parse(Console.ReadLine());



        if (choice == 1)
        {
            goto CharacterCreator;
        }
        else if (choice == 2)
        {
            z = i;
            i = 0;
            x = 0;
            do
            {

                character.Output();
                Console.WriteLine(" ");
                y++;
                i++;
                x++;
            } while (y != z);
        }
    }
}
}

标签: c#

解决方案


答案:使用列表

主要问题是您应该将创建的字符添加到列表中,而不是将属性数组保留字符中。这使您可以遍历每个字符并依次打印所有信息。IE

var myCharacters = new List<PlayerCharacter>();
...
myCharacters.Add(myCharacter);

其他问题

构造函数和对象设计

尽可能在构造函数中注入参数,并在适用时使用自动属性。这有助于避免构造函数中的复杂逻辑,并减少类的大小。让角色的创建者负责读取必要的参数。我还希望将信息字符串的构造和输出分开,这样您就可以将相同的信息输出到日志文件或其他任何东西,而不仅仅是控制台。IE:

    class PlayerCharacter
    {
        public string Name { get; }
        public int Life { get; }
        public string Gender { get; }

        public PlayerCharacter(string name, int life, string gender)
        {
            Name = name;
            Life = life;
            Gender = gender;
        }
        public override string ToString()
        {
            return $"Name: {Name}, Life {Life}, Gender: {Gender}";
        }
    }

控制流

使用循环而不是 goto。虽然我认为在某些情况下 goto 是最好的解决方案,但它们很少见,一般建议是对控制流使用循环,即类似这个伪代码的东西

MyOptions option;
var myCharacters = new List<PlayerCharacter>();
do{
   myCharacters.Add(ReadCharacter());
   option = ReadOption();
}
while(option != MyOptions.ViewCharacters);
PrintCharacters(myCharacters);

将代码拆分为方法

将代码移动到逻辑函数中,尤其是重复代码。这有助于更容易获得程序的概述。例如,对于读取数字,最好使用该TryParse函数而不是尝试捕获异常,并将其放在一个方法中以允许它被重用:

int ReadInteger()
{
    int value;
    while (!int.TryParse(Console.ReadLine(), out value))
    {
        Console.WriteLine("Invalid Input! Please Try Again.");
    }
    return value;
}

推荐阅读