记忆游戏中的单词重复



我在内存游戏中遇到了重复单词的问题。

我有一个代码(下面(和我想复制的标签,并将其(每次打开应用程序时在随机位置(传递到下面的行,例如

首次打开应用程序


|label1|label2|label3|<=第一行


|label3|label2|label1|<=第二排


第二次打开应用程序


|label1|label2|label3|<=第一行


|label1|label3|label2|<=第二排



private void AssingWordsToSquares()
{
Label label;
int randomNumber;
string path = $"{_currentPath}\Resources\Words.txt";
_loadWordsList = File.ReadAllLines(path).ToList();
for (int i = 0; i < tableLayoutPanel1.Controls.Count; i++)
{

if (tableLayoutPanel1.Controls[i] is Label)
{
label = (Label)tableLayoutPanel1.Controls[i];                  
}
else
continue;

randomNumber = random.Next(0, _loadWordsList.Count);
label.Text = _loadWordsList[randomNumber];
_loadWordsList.RemoveAt(randomNumber);
}
``

因此,目前,您共享的函数正在做两件事。

  • 1是从文件中的字典中查找random单词
  • 2是将单词按random的顺序放在屏幕上

所以有两个随机操作正在发生。记住黄金法则,即一个函数应该尝试只做一件事。它应该只有一个目的。

因此,您可以将该功能分离出来,使其更加清晰。

我们可以从创建一个函数开始,该函数将从您的词典文件中生成一个随机单词列表。类似这样的东西:

List<string> GenerateRandomWords(int numWords)
{
var randomWordList = new List<string>();
var wordList = System.IO.File.ReadAllLines("RandomWords.txt").ToList();
for (int nLoopCnt = 0; nLoopCnt < numWords; nLoopCnt++)
{
var randomNumber = random.Next(0, wordList.Count);
randomWordList.Add(wordList[randomNumber]);
}
return randomWordList;
}

现在您已经从文件中提取了随机单词,我们需要将它们按随机顺序放在屏幕上。因此,我们可以创建另一个函数GenerateRandomPosOrder,它采用TableLayoutPanel并以随机顺序生成列列表。因此,每次运行此函数时都可能返回1,2,31,3,23,2,1

private HashSet<int> GenerateRandomPosOrder(TableLayoutPanel table)
{
Thread.Sleep(500);
Random rnd = new Random();
var result = new HashSet<int>();
while (result.Count < table.ColumnCount)
{
var randomNumber = rnd.Next(0, table.ColumnCount);
result.Add(randomNumber);
}
return result;
}

现在我们可以把这两个函数放在你的AssignWordsToSquares中了

private void AssignWordsToSquares(TableLayoutPanel table)
{
var wordList = GenerateRandomWords(table.ColumnCount);
// loop around every row in the table
for (int rowCount = 0; rowCount < table.RowCount; rowCount++)
{
// this could return 0,2,1 or 1,0,2 or 1,2,0
var order = GenerateRandomPosOrder(table);
int pos = 0;
foreach (var randomPosition in order)
{
var tableCell = (Label)table.GetControlFromPosition(column: randomPosition, row: rowCount);
tableCell.Text = wordList[pos++];
}
}
}

上面的函数首先从字典中获取一个随机单词列表,然后对于TableLayoutPanel的每一行,它都将单词按随机顺序排列。

最新更新