我最近开始在大学学习C#并挑战自己我决定在控制台应用程序中编写Snake游戏。 当我编码时,我最终遇到了以下问题: 整个游戏都放在一个循环中,只有当蛇撞到墙壁或自身时才会停止。但是,我在循环中有一个输入语句用于输入snake的方向,每当编译器到达这个输入语句时,整个程序就会停止并在继续循环之前等待用户的输入。
是否可以通过以下方式解决此问题: 使输入语句可用半秒钟。如果在那半秒内没有任何东西被输入,那么蛇就会向前移动。 如果这是可能的,可能有人向我提供了我如何编码这个。 谢谢。
编辑:我在理解答案方面遇到了一些麻烦。我将添加我的游戏循环的副本。 while (isDone == false)
{
var ch = Console.ReadKey(false).Key;
switch (ch)
{
case ConsoleKey.UpArrow:
direction = 'U';
break;
case ConsoleKey.DownArrow:
direction = 'D';
break;
case ConsoleKey.LeftArrow:
direction = 'L';
break;
case ConsoleKey.RightArrow:
direction = 'R';
break;
}
if (hasEaten == true)
{
createFood(ref fruitX, ref fruitY, ref mapSize, map);
hasEaten = false;
}
moveHead(ref HeadX, ref HeadY, ref TailX, ref TailY, ref fruitX, ref fruitY, map, ref direction, ref hasEaten, ref isDone, mapSize);
if (isDone == true)
{
Console.WriteLine("YOU LOSE!");
}
//System.Threading.Thread.Sleep(500);
}
答案 0 :(得分:0)
您可以使用Console.KeyAvailable仅在按下命令时收听命令。
do { // Your main loop
while (! Console.KeyAvailable) {
// carry on with game
}
// Handle input here
// for example, set a currentDirection varaible
} while (Console.ReadKey(true).Key != ConsoleKey.Escape); // Escape to exit game loop
另一种可能性是使用事件在按键上运行一些代码,而无需阻止检查。
编辑: 你有没有键可用(即用户没有按键)然后做游戏逻辑,否则按下一个键所以处理第一个
while (isDone == false)
{
while (! Console.KeyAvailable) {
if (hasEaten == true)
{
createFood(ref fruitX, ref fruitY, ref mapSize, map);
hasEaten = false;
}
moveHead(ref HeadX, ref HeadY, ref TailX, ref TailY, ref fruitX, ref fruitY, map, ref direction, ref hasEaten, ref isDone, mapSize);
if (isDone == true)
{
Console.WriteLine("YOU LOSE!");
}
}
var ch = Console.ReadKey(false).Key;
switch (ch)
{
case ConsoleKey.UpArrow:
direction = 'U';
break;
case ConsoleKey.DownArrow:
direction = 'D';
break;
case ConsoleKey.LeftArrow:
direction = 'L';
break;
case ConsoleKey.RightArrow:
direction = 'R';
break;
}
//System.Threading.Thread.Sleep(500);
}
答案 1 :(得分:0)
Console class中有一个简单的属性可以告诉您键盘的读缓冲区中是否有键,因此如果要更改逻辑,则可以测试此键。将KeyAvailable与您可以拥有的ConsoleKey enum结合起来:
static void Main(string[] args)
{
ConsoleKey current = ConsoleKey.Z;
Console.WriteLine("Waiting arrow key, press Q to exit");
ConsoleKeyInfo keyinfo = new ConsoleKeyInfo('Z', current, false, false, false);
do
{
if (Console.KeyAvailable)
{
keyinfo = Console.ReadKey();
switch (keyinfo.Key)
{
case ConsoleKey.LeftArrow:
case ConsoleKey.RightArrow:
case ConsoleKey.UpArrow:
case ConsoleKey.DownArrow:
current = keyinfo.Key;
break;
}
}
else
{
if (current != ConsoleKey.Z)
{
// Here goes your logic to move the snake
Console.WriteLine("Going: " + (current == ConsoleKey.LeftArrow ? "Left" :
current == ConsoleKey.RightArrow ? "Right" :
current == ConsoleKey.UpArrow ? "Up" :
"Down"));
// wait some ms before starting the next loop
System.Threading.Thread.Sleep(200);
}
}
}
while (keyinfo.Key != ConsoleKey.Q);
}