【问题标题】:Randomize index without repeating随机化索引而不重复
【发布时间】:2021-10-31 10:23:20
【问题描述】:

我想创建一个程序,它会在图片框中显示标志,用户必须猜测它是什么标志。我有一个问题,标志重复,我完全不知道如何解决它。

这是我的一些代码:

private void button1_Click(object sender, EventArgs e)
{
    Random random = new Random();
    randomized = random.Next(0, 9);
    //0 = Poland
    //1 = France
    //2 = Sweden
    //3 = Germany
    //4 = Portugal
    //5 = Spain
    //6 = Finland
    //7 = Norway
    //8 = Russia
    //9 = Ukraine
    
    if (randomized == 0)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Poland.png");
    }

    if (randomized == 1)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/France.png");
    }

    if (randomized == 2)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Sweden.jpg");
    }

    if (randomized == 3)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Germany.png");
    }

    if (randomized == 4)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Portugal.png");
    }

    if (randomized == 5)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Spain.png");
    }

    if (randomized == 6)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Finland.png");
    }

    if (randomized == 7)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Norway.png");
    }

    if (randomized == 8)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Russia.png");
    }

    if (randomized == 9)
    {
        ptbFlag.Image = Image.FromFile("C:/Users/Kacper/Desktop/FlagiDoGeo/Ukraine.png");
    }
}

【问题讨论】:

  • stackoverflow.com/questions/2019417/… 接受的答案可能对您有所帮助。
  • 您是否尝试过将Random random = new Random(); 设为“全局”变量?如果按钮被快速连续点击,那么随机数很有可能是相同的。将random 设为全局应该可以解决这个问题。
  • 您是否尝试过将生成的数字放入列表中?
  • 您的意思是说如果曾经向用户显示过德国,那么随后的点击在选择下一个国家/地区时不应考虑德国?
  • 尝试以下操作:在您的表单中创建一个变量 List 并用您拥有的标志的所有文件名填充它。将您的变量 Random random 从列表附近移出 button1_Click 并仅对其进行一次初始化。然后在button1_Click 中生成一个从零到列表计数的随机数 - 1. 从列表中选择该文件名,然后将其从列表中删除。如果列表中没有更多元素,您就完成了,禁用button1 并显示一条消息,说没有更多国家可以猜测。

标签: c# random


【解决方案1】:

如果您想每次都显示不同的图像,您可能需要跟踪已显示的图像。

private readonly Random _random = new();
private const string PathPrefix = "C:/Users/Kacper/Desktop/FlagiDoGeo/";
private static List<string> _flags = Reinitialize();
       
private void button1_Click(object sender, EventArgs e)
{
    var randomized = _random.Next(0, _flags.Count);
    var image = _flags[randomized];

    // delete the image that will be displayed.
    _flags.Remove(image);

    // if all images are displayed, the game restarts from the beginning.
    if (_flags.Count == 0)
    {
        _flags = Reinitialize();
    }
            
    ptbFlag.Image = PathPrefix + image;
}

private static List<string> Reinitialize()
{
    return new List<string>
        {
            "Poland.png",
            "France.png",
            "Sweden.jpg",
            "Germany.png",
            // ...
        };
}

【讨论】:

  • 也许您可以使用List&lt;string&gt;,它还允许索引Flags[randomized]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2021-06-05
  • 2015-02-20
  • 2014-05-01
  • 2014-01-11
相关资源
最近更新 更多