首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在c#应用程序中存储多个生成的变量值

在c#应用程序中存储多个生成的变量值
EN

Stack Overflow用户
提问于 2014-09-10 06:35:40
回答 2查看 637关注 0票数 2

第一篇文章,我对C#和编程非常陌生。

我正在制作一个足球运动员生成器应用程序,仅用于练习,其中我有一个类,它的构造函数生成一个带有两个字符串(名和姓)的对象,以及大量的int。(不同的技能属性,如射门力量、传球等)。

请原谅我,我一会儿就会把我的代码发出去。

所以我想让我制作的所有这些对象都以某种方式和它的变量一起存储。在进行了大量的搜索之后,im一直到了不同类型的数组、列表和字典。

首先,这是我的课:

代码语言:javascript
运行
复制
class player
{

    public string firstName;
    public string lastName;
    public string playPos;
    public int playerId = 999;
    public int isKeeper;
    public int level;
    public int age;
    public int dKeeper;
    public int dTackle;
    public int dMarking;
    public int mPlaymaking;
    public int mCrossing;
    public int fShooting;
    public int fShotPower;
    public int aDribbling;
    public int aHeading;
    public int aPassing;


    public void autoGenPlayer()
    {
        //new killing random that i got off of Stack Overflow
        Random rAG = new Random(Guid.NewGuid().GetHashCode());
        //PlayerId, dont mind it does not work properly yet.
        playerId = playerId + 1;
        //a level integer just to base the other stats around, to keep the stats from spreading too much
        level = rAG.Next(2, 11);
        //Generating names, calling the methods a bit lower in this class.
        firstName = firstNameGenerator();
        lastName = lastNameGenerator();
        //giving the player an age
        age = rAG.Next(16, 35);
        //a one out of seven chance to become a goal keeper.
        isKeeper = rAG.Next(1,8);
       //skills based on level. Max value is 20
        dTackle = rAG.Next(level, level * 2);
        dMarking = rAG.Next(level, level * 2);
        mPlaymaking = rAG.Next(level, level * 2);
        mCrossing = rAG.Next(level, level * 2);
        fShooting = rAG.Next(level, level * 2);
        fShotPower = rAG.Next(level, level * 2);
        aDribbling = rAG.Next(level, level * 2);
        aHeading = rAG.Next(level, level * 2);
        aPassing = rAG.Next(level, level * 2);
        //Checks if the player is a keeper. 5 is chosen at random. There are obv better ways to do this, but it doesnt matter right now.
        if (isKeeper == 5)
        {
            //This basically just makes the keeper a keeper, and a shit outfield player. 
            dKeeper = rAG.Next(level, level * 2);

            playPos = "Goal Keeper";

            dTackle = rAG.Next(1, 3);
            dMarking = rAG.Next(1, 3);
            mPlaymaking = rAG.Next(1, 3);
            mCrossing = rAG.Next(1, 3);
            fShooting = rAG.Next(1, 3);
            fShotPower = rAG.Next(1, 3);
            aDribbling = rAG.Next(1, 3);
            aHeading = rAG.Next(1, 3);
            aPassing = rAG.Next(1, 3);
        }
        else
        {
            //if not a keeper, shit keeper attributes, and random outfielder atts.
            dKeeper = 1;
        }
        //my clever way of assigning a player position to the players.
        int def = dTackle + dMarking;
        int mid = mCrossing + mPlaymaking;
        int fwd = fShooting + fShotPower;

        if (dKeeper > 1)
        {
            playPos = "Goal Keeper";
        }
        else if (def >= fwd && def >= mid)
        {
            playPos = "Defender";
        }
        else if (mid >= fwd && mid >= def)
        {
            playPos = "Midfielder";
        }
        else if (fwd >= mid && fwd >= def)
        {
            playPos = "Striker";
        }
        else
        {
            //in a rare case (if ever) the logic doesnt add ut, im spawning a star player. because. im not too got at this.

            playPos = "Utility Legend";
            dTackle = rAG.Next(16, 21);
            dMarking = rAG.Next(16, 21);
            mPlaymaking = rAG.Next(16, 21);
            mCrossing = rAG.Next(16, 21);
            fShooting = rAG.Next(16, 21);
            fShotPower = rAG.Next(16, 21);
            aDribbling = rAG.Next(16, 21);
            aHeading = rAG.Next(16, 21);
            aPassing = rAG.Next(16, 21);
        }




    }

   //Generates a first name 
    public string firstNameGenerator()
    {
        string returnfirstName;
        string[] firstnames;
        firstnames = new string[60] { "60 different strings of first names... took them out for you, becasue it looked bad in the editor." };
        Random rF = new Random(Guid.NewGuid().GetHashCode());
        returnfirstName = firstnames[rF.Next(0, 40)];

        return returnfirstName;

    }
    //generates a last name
    public string lastNameGenerator()
    {
        string returnlastName;
        string[] lastnames;
        lastnames = new string[60] { "60 different strings of lastnames........." };
        Random rL = new Random(Guid.NewGuid().GetHashCode());
        returnlastName = lastnames[rL.Next(0, 40)];
        returnlastName = lastnames[rL.Next(0, 40)];
        return returnlastName;

    }
}

现在是我的另一个代码,你知道,就是你把所有东西都放在一起的部分。

代码语言:javascript
运行
复制
namespace FormManager
{
  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();



    }

    private void button1_Click(object sender, EventArgs e)
    {
        player p = new player();
        p.autoGenPlayer();
        textBox10.Text = p.firstName + " " + p.lastName;
        textBox11.Text = p.age.ToString();
        textBox1.Text = p.aPassing.ToString();
        textBox2.Text = p.aDribbling.ToString();
        textBox3.Text = p.aHeading.ToString();
        textBox4.Text = p.dTackle.ToString();
        textBox5.Text = p.dMarking.ToString();
        textBox6.Text = p.fShooting.ToString();
        textBox7.Text = p.fShotPower.ToString();
        textBox8.Text = p.mPlaymaking.ToString();
        textBox9.Text = p.mCrossing.ToString();
        textBox12.Text = p.dKeeper.ToString();
        textBox13.Text = p.playPos;


    }

    private void button2_Click(object sender, EventArgs e)
    {
        //number of objects to generate
        int numberOfPlayersToGenerate = 10;
        string[] savePlayers = new string[numberOfPlayersToGenerate];


        //Generate many objects
        for (int i = 0; i < numberOfPlayersToGenerate; i++)
        {

                player play = new player();
                play.autoGenPlayer();



        }


    }


}


}

这基本上就是for循环,我想用它来存储所有生成的变量。autoGenPlayer()方法正在生成大量int和string的不同值,我希望将它们全部存储起来,这样我就可以制作一个好看的表来显示它。

我很喜欢这方面的任何想法,这让我现在很疯狂。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-10 06:45:20

在form1中只需添加

代码语言:javascript
运行
复制
List<Player> players = new List<Player>();

然后在button1_Click()中添加

代码语言:javascript
运行
复制
players.add(p);

在button2_Click()

代码语言:javascript
运行
复制
players.add(play);

然后,您可以添加一个网格视图到您的窗体,并使球员成为数据源-鳍。

别那么费劲-

如果您不知道如何设置数据源,请使用如何将GridView绑定到自定义对象?

  • 鱼鳍
票数 1
EN

Stack Overflow用户

发布于 2014-09-10 07:05:37

欢迎来到社区。

实际上,你有比你指定的三个更多的选择。

要正确地理解这一点,您需要了解继承

如果您想要将这个“组”绑定到一个Datagrid.Datasource,那么它需要具有那种类型。看一下文档,这是system.object类型的(帮助不大,因为所有东西都是从system.object继承的)。但是,如果进一步阅读,就会看到一个特定对象的列表(所有对象都以"Data“开头,所有这些对象都过时了)和实现IListSource或IList接口的任何组件。

使所有这些都适合的是,数组名单(T)字典(TKey,TValue)都实现了IList接口。

那你应该用哪一种?

这个问题为您提供了使用IList接口本身的充分理由。这样,您只对使用您的数据的人施加了最小的限制。具体来说,在您的示例中,它应该是一个IList( Player ) (或者更好的是一个IList( IPlayer ),并创建一个由Player实现的IPlayer接口)。

对于内部存储,请使用列表( player ),因为它是无界的(与数组不同),并且没有字典键的开销(您似乎不想在其中按名称查找播放机--如果这是您想要做的事情,那么请考虑使用名称作为字典中的键)。

此外,如果将autoGenPlayer更改为构造函数,则不需要play.autoGenPlayer();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25758807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档