【发布时间】:2018-06-29 23:04:39
【问题描述】:
我正在尝试为舞会做一些很酷的事情,我采用 ASCII 文本艺术设计,将每一行剪成一个列表(字符串),然后将该字符串中的每个字符保存到一个 2D 字符数组中。构建 2D 字符数组后,程序应在列和行之间随机选择以移动控制台光标并键入属于该位置的任何内容。
但是,当我运行它时,它看起来好像随机选择器在中途停止选择,或者它已经遍历了整个 char 数组。我什至将 ASCII 模板艺术换成了别的东西,但仍然遇到同样的问题。 如果我的想法是正确的,那么程序应该以随机方式正确遍历每个坐标一次,然后分别访问二维数组的值。
谁能说出问题出在哪里或为什么没有完全解决?
static void Main(string[] args)
{
AskOut();
Console.Read();
}
private static void AskOut()
{
/*
* Takes stored word art
* Breaks down each line into an individual char
* Randomly builds a 2d array of chars
*/
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.Red;
//Initilize ASCII wordart in a list
List<string> textArt = new List<string>();
textArt.Add("db d8b db d888888b db db db db .d88b. db db ");
textArt.Add("88 I8I 88 `88' 88 88 `8b d8' .8P Y8. 88 88 ");
textArt.Add("88 I8I 88 88 88 88 `8bd8' 88 88 88 88 ");
textArt.Add("Y8 I8I 88 88 88 88 88 88 88 88 88 ");
textArt.Add("`8b d8'8b d8' .88. 88booo. 88booo. 88 `8b d8' 88b d88 ");
textArt.Add(" `8b8' `8d8' Y888888P Y88888P Y88888P YP `Y88P' ~Y8888P' ");
textArt.Add(" ");
textArt.Add(" ");
textArt.Add(" d888b .d88b. d888888b .d88b. d8888b. d8888b. .d88b. .88b d88. ");
textArt.Add("88' Y8b .8P Y8. 88 .8P Y8. 88 `8D 88 `8D .8P Y8. 88'YbdP`88 ");
textArt.Add("88 88 88 88 88 88 88oodD' 88oobY' 88 88 88 88 88 ");
textArt.Add("88 ooo 88 88 88 88 88 88 88`8b 88 88 88 88 88 ");
textArt.Add("88. ~8~ `8b d8' 88 `8b d8' 88 88 `88. `8b d8' 88 88 88 ");
textArt.Add(" Y888P `Y88P' YP `Y88P' 88 88 YD `Y88P' YP YP YP ");
textArt.Add(" ");
textArt.Add(" ");
textArt.Add("db d8b db d888888b d888888b db db .88b d88. d88888b .d888b. ");
textArt.Add("88 I8I 88 `88' 88 88 88 88'YbdP`88 88' VP `8D ");
textArt.Add("88 I8I 88 88 88 88ooo88 88 88 88 88ooooo odD' ");
textArt.Add("Y8 I8I 88 88 88 88~~~88 88 88 88 88 8P' ");
textArt.Add("`8b d8'8b d8' .88. 88 88 88 88 88 88 88. oo ");
textArt.Add(" `8b8' `8d8' Y888888P YP YP YP YP YP YP Y88888P VP ");
//Test the word art
foreach (string line in textArt)
{
Console.WriteLine(line);
}
Thread.Sleep(1000);
Console.Clear();
//Store each letter in list into 2d array
char[,] letters = new char[textArt.Count, 80];
for (int x = 0; x < textArt.Count(); x++)
{
char[] let = textArt.ElementAt(x).ToCharArray();
for (int y = 0; y < let.Count(); y++)
{
letters[x, y] = (char)let.GetValue(y);
}
}
//Use the 2d array to randomly print out the hidden message
Random r = new Random();
foreach (char character in letters)
{
int row = r.Next(letters.GetLength(0));
int column = r.Next(1, letters.GetLength(1));
if (character.Equals(' ') == false)
{
Console.SetCursorPosition(column, row + 1);
Console.Write(letters[row, column]);
Thread.Sleep(5);
}
}
}
}
}
【问题讨论】:
-
您的 VS 副本带有与所有人相同的调试器。为什么不调试代码并了解问题出在哪里?您可能根本不需要任何帮助来修复它。请阅读How to Ask 并采取tour
-
鉴于您的循环仅对数组中的每个字符执行一次,您似乎误以为
Random()类不会重复自身。我强烈建议您借此机会学习如何使用调试器并使用它。当然,接下来您要尝试做的是跟踪已打印的字母,然后循环直到它们都打印完。相反,我强烈建议您研究对包含行/列对的数组进行改组的可能性,然后使用这些值遍历该数组以确定要打印的字符。 -
(还有一个“分解”算法涉及使用大素数,用于对当前行/列位置求和和取模。它完全是确定性的,但看起来是随机的。考虑到额外的 -信贷工作。:))
-
做一件事,在文本文件中获取 ascii 艺术 打开
cmd.exe并键入type file.txt如果可以的话,你可以用 C# 做同样的事情
标签: c# arrays random console char