这是我在下面的事件按钮单击处理程序中的代码。每当我点击一次它会随机化图像。是否有可能的解决方案让我的代码循环一次而不是无限次循环点击。
我正在做一个图片匹配记忆游戏,所以当我点击按钮时它会保持随机化。
shuffled01 = dict01.Shuffle();
void btn_Click(object sender, EventArgs e)
{
foreach (var a in shuffled01)
{
button.Name = "a" + a.Key.ToString();
button.MinHeight = 100;
button.MinWidth = 100;
// button.Name = "a" + a.Key.ToString();
ImageBrush brush = new ImageBrush();
BitmapImage bitmap = new BitmapImage();
button.Background = brush;
bitmap.BeginInit();
bitmap.UriSource = new Uri(@"C:\inetpub\wwwroot\istellar 22-10-13\iStellarMobile\iStellarMobile\"
+ a.Value.ToString().Substring(1), UriKind.Absolute);
bitmap.ToString();
bitmap.EndInit();
brush.ImageSource = bitmap;
}
}
提前致谢。
答案 0 :(得分:0)
您似乎需要在字典中随机播放键,然后重复它们。在这种情况下,我会按如下方式进行:
void Main()
{
var dic = new Dictionary<string, string>();
dic.Add("a", "b");
dic.Add("c", "s");
dic.Add("d", "2");
dic.Add("e", "r");
dic.Add("f", "g");
var range = Enumerable.Range(0, dic.Keys.Count()).Shuffle();
var kArr = dic.Keys.ToArray();
foreach (var num in range) {
var key = kArr[num];
Console.WriteLine("{0}, {1}", key, dic[key]);
}
}
// take shuffling from here : https://stackoverflow.com/questions/5807128/an-extension-method-on-ienumerable-needed-for-shuffling
public static class Ext {
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
{
var rng = new Random();
return source.Shuffle(rng);
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
if (source == null) throw new ArgumentNullException("source");
if (rng == null) throw new ArgumentNullException("rng");
return source.ShuffleIterator(rng);
}
private static IEnumerable<T> ShuffleIterator<T>(
this IEnumerable<T> source, Random rng)
{
var buffer = source.ToList();
for (int i = 0; i < buffer.Count; i++)
{
int j = rng.Next(i, buffer.Count);
yield return buffer[j];
buffer[j] = buffer[i];
}
}
}
示例结果: 第一次运行 d,2 / f,g / e,r / c,s / a,b
第二轮 a,b / e,r / f,g / c,s / d,2
PS我在这里使用了洗牌An extension method on IEnumerable needed for shuffling
答案 1 :(得分:0)
是否有可能的解决方案让我的代码循环一次而不是无限次循环点击。
所以你的意思是你只需要运行一次?,不是
private bool isRunned;
会解决吗?然后在运行后将其设置为true,或者您可以通过
取消订阅按钮的事件button.Click -= click_handler;
答案 2 :(得分:0)
你使用休息;找到匹配时的关键字
foreach (var a in shuffled01)
{
if(CondStatisfied == true)
{
break;
}
}