winforms 当我尝试调用这些函数时,Windows窗体上的应用程序会中断

t2a7ltrp  于 2023-08-07  发布在  Windows
关注(0)|答案(1)|浏览(107)

我的电脑里有一副牌里的所有牌的文件。我想做的是生成所有54个数字,并将其中7个以按钮的形式提供给用户,以便他们可以播放这些卡,另外7张卡到计算机,其余的卡存储在队列中,以便他们中的任何一个在需要时按下以获得更多。但我面临的错误是生成需要存储的7个随机数供用户获取。
这就是我所指的代码:
我相信这部分代码调用SetButtonImage开始加载编译。

public FmClassic()
        {
            InitializeComponent();

            SetButtonImage();
        }

字符串
这是SetButtonImage从我的计算机中收集图像,并调用另一个函数来生成随机数。

private void SetButtonImage()
        {
            Stack<int> ShuffleOnTime = ShuffleOneTime();
            string Cards = String.Join("\n", ShuffleOnTime);
            button1.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(0, Cards.IndexOf(Environment.NewLine))}.png");
            button2.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(1, Cards.IndexOf(Environment.NewLine))}.png");
            button3.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(2, Cards.IndexOf(Environment.NewLine))}.png");
            button4.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(3, Cards.IndexOf(Environment.NewLine))}.png");
            button5.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(4, Cards.IndexOf(Environment.NewLine))}.png");
            button6.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(5, Cards.IndexOf(Environment.NewLine))}.png");
            button7.Image = Image.FromFile($"C:\\filepath\\{Cards.Substring(6, Cards.IndexOf(Environment.NewLine))}.png");

        }


然后调用它来确保它们是随机的,而不是用哈希表调用两次,以及转换为字符串,我认为这在搜索文件时更好。

public Stack<int> ShuffleOneTime()
        {
            Random random = new Random();
            Stack<int> generatednumbers = new Stack<int>();
            Stack<int> randomNumbers = GenerateRandomNumber(random, generatednumbers);

            return randomNumbers;
        }


这有助于生成数字并将其返回给另一个函数。

Stack<int> GenerateRandomNumber(Random random, Stack<int> generatednumbers)
        {
            //Queue<int> Cards = new Queue<int>();
            //Queue<string> realNumbers = new Queue<string>();
            int randomNumber;
            do
            {
                randomNumber = random.Next(1, 54);
                generatednumbers.Push(randomNumber);
                if (generatednumbers.Count >= 2)
                {
                    int Compare1 = generatednumbers.Pop();
                    int Compare2 = generatednumbers.Pop();
                    if (Compare1 == Compare2)
                    {
                        generatednumbers.Push(Compare1);
                    }
                }

            } while (generatednumbers.Count != 53);
            //string number = generatednumbers.ToString();
            //realNumbers.Enqueue(number);
            return generatednumbers;
        }


我试着把它变成一个字符串而不是一个整数来帮助找到它,但它不起作用。卡的文件名都是1.jpg,2.jpg等,所以我不知道为什么会有错误。一切编译,但然后我的屏幕冻结60秒,他们输入这个错误:
第一个月

nue99wik

nue99wik1#

所以,你在某个文件夹中有53张图像,你想 Shuffle 和挑选。您可以简化此任务,因为文件名是您要生成和混洗的数字范围。
创建一个生成给定范围的随机数字的方法。

private readonly Random rnd = new Random();

// https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
private int[] GenerateShuffledNumbers(int start, int count)
{
    var numbers = Enumerable.Range(start, count).ToArray();

    for (int i = 0; i < numbers.Length; i++)
    {
        var j = i + (int)(rnd.NextDouble() * (numbers.Length - i));
        (numbers[i], numbers[j]) = (numbers[j], numbers[i]);
    }

    return numbers;
}

字符串
SetButtonImage方法中需要的所有内容是:

private void SetButtonImage()
{
    var dir = @"The Images Directory Path";
    var buttons = new[]
    {
        button1, button2, button3, button4,
        button5, button6, button7
    };
    var numbers = GenerateShuffledNumbers(1, 53);

    for (int i = 0; i < buttons.Length; i++)
    {
        // jpg or png? Append the right extension.
        var imgFile = Path.Combine(dir, $"{numbers[i]}.jpg");
        buttons[i].Image?.Dispose();
        buttons[i].Image = Image.FromStream(new MemoryStream(File.ReadAllBytes(imgFile)), true, false);
    }
}


注意,numbers数组包含所有53个数字,你可以取一个范围:

var someNumbers = numbers.Take(7);


……你可以跳过并采取:

// Take the first 7...
var set1 = numbers.Take(7);
// Take the next 7...
var set2 = numbers.Skip(7).Take(7);
// Skip the first 14 and take the rest...
var set3 = numbers.Skip(14);


所有这些都返回IEnumerable<int>。如果需要,请调用.ToList().ToArray()
如果需要创建Stack<int>Queue<int>,则两者都有一个接受IEnumerable<T>的构造函数重载。

var stack = new Stack<int>(numbers);
var queue = new Queue<int>(numbers);

相关问题