我如何使用计时器/延迟使对象或角色在控制台窗口中移动?

我正在尝试创建一个控制台游戏,其中“Martian”中的字符“M”和“SpaceCreature”中的字符“S”在 X 轴的两端保持相对,并在 Y 轴上上下移动。


我使用箭头键使“M”上下移动。但是“S”也应该移动,但只要“M”移动,它就会自己移动。我需要让“S”以较慢的速度移动以跟随“M”。


截至目前,我使用箭头键让“M”上下移动,“S”也在同时移动。


我需要让 'S'移动得更慢。我试过 thread.Sleep,但这只会让“S”消失并像故障一样重新出现。我想我需要使用一个名为“Console.keyAvailable”的东西,但我发现很难确定该功能的位置。


//X and Y get set constructors are defined in the abstract class:-SpaceObject 


public override void Draw()  //In both classes Martian and SpaceCreature

{

   Console.SetCursorPosition(X, Y);

   Console.WriteLine("S");  

   //In Martian class:- Console.WriteLine("M");

}

static void Main(string[] args)

{

   var m = new Martian(100, 10);

   var s = new SpaceShip(100, 10);


   const int MaxY = 25;


   m.Draw();  //Abstract override void method

   s.X = m.X + 100;

   s.Y = m.Y;

   s.Draw(); //Abstract override void method


   ConsoleKeyInfo keyInfo;

   while (true)

   {

      keyInfo = Console.ReadKey(true);

      Console.Clear();

      switch (keyInfo.Key)

      {

         case ConsoleKey.UpArrow:

         if (m.Y > 0)

         {

            m.Y--;

         }

         break;

         case ConsoleKey.DownArrow:

         if (m.Y < MaxY)

         {

            m.Y++;

         }

         break;

         }

         m.Draw();

         s.X = m.X + 100;

         s.Y = m.Y;

         s.Draw();

      }

   }

}


慕慕森
浏览 64回答 2
2回答

米脂

你不需要另一个线程......玩这个。按向上/向下箭头或退出退出;您不必按住箭头键继续移动。您可能还对我的Console Snake示例感兴趣。class Program{&nbsp; &nbsp; enum Directions&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Up,&nbsp; &nbsp; &nbsp; &nbsp; Down,&nbsp; &nbsp; &nbsp; &nbsp; None&nbsp; &nbsp; }&nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DateTime next;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; bool quit = false;&nbsp; &nbsp; &nbsp; &nbsp; ConsoleKeyInfo cki;&nbsp; &nbsp; &nbsp; &nbsp; Directions direction = Directions.None;&nbsp; &nbsp; &nbsp; &nbsp; Console.Clear();&nbsp; &nbsp; &nbsp; &nbsp; Console.CursorVisible = false;&nbsp; &nbsp; &nbsp; &nbsp; var m = new Martian();&nbsp; &nbsp; &nbsp; &nbsp; var s = new SpaceShip();&nbsp; &nbsp; &nbsp; &nbsp; m.Draw(true);&nbsp; &nbsp; &nbsp; &nbsp; s.Draw(true);&nbsp; &nbsp; &nbsp; &nbsp; do&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // wait for next keypress, or next movement&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; next = new DateTime(Math.Min(m.nextMovement.Ticks, s.nextMovement.Ticks));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(!Console.KeyAvailable && DateTime.Now < next)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Threading.Thread.Sleep(10);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // was a key pressed?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Console.KeyAvailable)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cki = Console.ReadKey(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch (cki.Key)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.UpArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Directions.Up;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.DownArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; direction = Directions.Down;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.Escape:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; quit = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // does anything need to move?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (DateTime.Now >= m.nextMovement)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch(direction)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case Directions.Up:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.MoveUp();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case Directions.Down:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.MoveDown();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case Directions.None:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.UpdateNextMovement();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (DateTime.Now >= s.nextMovement)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s.MoveToward(m);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; } while (!quit);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }}public abstract class SpaceObject{&nbsp; &nbsp; public int X;&nbsp; &nbsp; public int Y;&nbsp; &nbsp; public int MovementDelay;&nbsp; &nbsp; public DateTime nextMovement;&nbsp; &nbsp; abstract public void Draw(bool Visible);&nbsp; &nbsp; public void MoveUp()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (this.Y > 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Draw(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Y--;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Draw(true);&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; this.UpdateNextMovement();&nbsp; &nbsp; }&nbsp; &nbsp; public void MoveDown()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (this.Y < Console.WindowHeight - 1)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Draw(false);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Y++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.Draw(true);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; this.UpdateNextMovement();&nbsp; &nbsp; }&nbsp; &nbsp; public void MoveToward(SpaceObject so)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (so.Y < this.Y)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.MoveUp();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else if (so.Y > this.Y)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.MoveDown();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.UpdateNextMovement();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public void UpdateNextMovement()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);&nbsp; &nbsp; }}public class Martian : SpaceObject{&nbsp; &nbsp; public Martian()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.X = 1;&nbsp; &nbsp; &nbsp; &nbsp; this.Y = Console.WindowHeight / 2;&nbsp; &nbsp; &nbsp; &nbsp; this.MovementDelay = 100;&nbsp; &nbsp; &nbsp; &nbsp; this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);&nbsp; &nbsp; }&nbsp; &nbsp; public override void Draw(bool Visible)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.SetCursorPosition(this.X, this.Y);&nbsp; &nbsp; &nbsp; &nbsp; Console.Write(Visible ? "M" : " ");&nbsp; &nbsp; }}public class SpaceShip : SpaceObject{&nbsp; &nbsp; public SpaceShip()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.X = Console.WindowWidth - 2;&nbsp; &nbsp; &nbsp; &nbsp; this.Y = Console.WindowHeight / 2;&nbsp; &nbsp; &nbsp; &nbsp; this.MovementDelay = 750;&nbsp; &nbsp; &nbsp; &nbsp; this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);&nbsp; &nbsp; }&nbsp; &nbsp; public override void Draw(bool Visible)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.SetCursorPosition(this.X, this.Y);&nbsp; &nbsp; &nbsp; &nbsp; Console.Write(Visible ? "S" : " ");&nbsp; &nbsp; }}- - - 编辑 - - -如何通过点击向上/向下箭头键而不是连续移动来进行“M”移动?将“按下一个键”块更改为:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // was a key pressed?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (Console.KeyAvailable)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cki = Console.ReadKey(true);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch (cki.Key)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.UpArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.MoveUp();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.DownArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.MoveDown();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ConsoleKey.Escape:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; quit = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }然后删除该if (DateTime.Now >= m.nextMovement)块,这样您就只剩下检查下面的 SpaceShip 时间了。现在你的“M”应该只在你点击和/或按住箭头键时移动。

慕田峪7331174

你有没有试着把它放在Thread.Sleep(100);后面s.Y = m.Y;但没有用?将睡眠时间更改为更短的时间可能会奏效。还:while (true)&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; keyInfo = Console.ReadKey(true);&nbsp; &nbsp; &nbsp; Console.Clear();&nbsp; &nbsp; &nbsp; switch (keyInfo.Key)&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case ConsoleKey.UpArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (m.Y > 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.Y--;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case ConsoleKey.DownArrow:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (m.Y < MaxY)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.Y++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; m.Draw();&nbsp; &nbsp; &nbsp; s.X = m.X + 100;&nbsp; &nbsp; &nbsp; s.Y = m.Y;&nbsp; &nbsp; &nbsp; s.Draw(); //i think is better to put draw functions outside switch(key)&nbsp; &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP