第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何使用計(jì)時器/延遲使對象或角色在控制臺窗口中移動?

我如何使用計(jì)時器/延遲使對象或角色在控制臺窗口中移動?

C#
慕慕森 2022-12-24 12:11:15
我正在嘗試創(chuàng)建一個控制臺游戲,其中“Martian”中的字符“M”和“SpaceCreature”中的字符“S”在 X 軸的兩端保持相對,并在 Y 軸上上下移動。我使用箭頭鍵使“M”上下移動。但是“S”也應(yīng)該移動,但只要“M”移動,它就會自己移動。我需要讓“S”以較慢的速度移動以跟隨“M”。截至目前,我使用箭頭鍵讓“M”上下移動,“S”也在同時移動。我需要讓 'S'移動得更慢。我試過 thread.Sleep,但這只會讓“S”消失并像故障一樣重新出現(xiàn)。我想我需要使用一個名為“Console.keyAvailable”的東西,但我發(fā)現(xiàn)很難確定該功能的位置。//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();      }   }}
查看完整描述

2 回答

?
米脂

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個贊

你不需要另一個線程......玩這個。按向上/向下箭頭或退出退出;您不必按住箭頭鍵繼續(xù)移動。您可能還對我的Console Snake示例感興趣。

class Program

{


    enum Directions

    {

        Up,

        Down,

        None

    }


    static void Main(string[] args)

    {

        DateTime next;     

        bool quit = false;

        ConsoleKeyInfo cki;

        Directions direction = Directions.None;


        Console.Clear();

        Console.CursorVisible = false;

        var m = new Martian();

        var s = new SpaceShip();

        m.Draw(true);

        s.Draw(true);

        do

        {

            // wait for next keypress, or next movement

            next = new DateTime(Math.Min(m.nextMovement.Ticks, s.nextMovement.Ticks));               

            while(!Console.KeyAvailable && DateTime.Now < next)

            {

                System.Threading.Thread.Sleep(10);

            }

            // was a key pressed?

            if (Console.KeyAvailable)

            {

                cki = Console.ReadKey(true);

                switch (cki.Key)

                {

                    case ConsoleKey.UpArrow:

                        direction = Directions.Up;

                        break;


                    case ConsoleKey.DownArrow:

                        direction = Directions.Down;

                        break;


                    case ConsoleKey.Escape:

                        quit = true;

                        break;

                }

            }

            // does anything need to move?

            if (DateTime.Now >= m.nextMovement)

            {

                switch(direction)

                {

                    case Directions.Up:

                        m.MoveUp();

                        break;


                    case Directions.Down:

                        m.MoveDown();

                        break;


                    case Directions.None:

                        m.UpdateNextMovement();

                        break;

                }

            }

            if (DateTime.Now >= s.nextMovement)

            {

                s.MoveToward(m);

            }

        } while (!quit);          

    }

}


public abstract class SpaceObject

{

    public int X;

    public int Y;

    public int MovementDelay;

    public DateTime nextMovement;


    abstract public void Draw(bool Visible);


    public void MoveUp()

    {

        if (this.Y > 0)

        {

            this.Draw(false);

            this.Y--;

            this.Draw(true);     

        }

        this.UpdateNextMovement();

    }


    public void MoveDown()

    {

        if (this.Y < Console.WindowHeight - 1)

        {

            this.Draw(false);

            this.Y++;

            this.Draw(true);       

        }

        this.UpdateNextMovement();

    }


    public void MoveToward(SpaceObject so)

    {

        if (so.Y < this.Y)

        {

            this.MoveUp();

        }

        else if (so.Y > this.Y)

        {

            this.MoveDown();

        }

        else

        {

            this.UpdateNextMovement();

        }

    }


    public void UpdateNextMovement()

    {

        this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);

    }


}


public class Martian : SpaceObject

{


    public Martian()

    {

        this.X = 1;

        this.Y = Console.WindowHeight / 2;

        this.MovementDelay = 100;

        this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);

    }


    public override void Draw(bool Visible)

    {

        Console.SetCursorPosition(this.X, this.Y);

        Console.Write(Visible ? "M" : " ");

    }


}


public class SpaceShip : SpaceObject

{


    public SpaceShip()

    {

        this.X = Console.WindowWidth - 2;

        this.Y = Console.WindowHeight / 2;

        this.MovementDelay = 750;

        this.nextMovement = DateTime.Now.AddMilliseconds(this.MovementDelay);

    }


    public override void Draw(bool Visible)

    {

        Console.SetCursorPosition(this.X, this.Y);

        Console.Write(Visible ? "S" : " ");

    }


}

- - - 編輯 - - -


如何通過點(diǎn)擊向上/向下箭頭鍵而不是連續(xù)移動來進(jìn)行“M”移動?


將“按下一個鍵”塊更改為:


            // was a key pressed?

            if (Console.KeyAvailable)

            {

                cki = Console.ReadKey(true);

                switch (cki.Key)

                {

                    case ConsoleKey.UpArrow:

                        m.MoveUp();

                        break;


                    case ConsoleKey.DownArrow:

                        m.MoveDown();

                        break;


                    case ConsoleKey.Escape:

                        quit = true;

                        break;

                }

            }

然后刪除該if (DateTime.Now >= m.nextMovement)塊,這樣您就只剩下檢查下面的 SpaceShip 時間了。現(xiàn)在你的“M”應(yīng)該只在你點(diǎn)擊和/或按住箭頭鍵時移動。


查看完整回答
反對 回復(fù) 2022-12-24
?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個贊

你有沒有試著把它放在Thread.Sleep(100);后面s.Y = m.Y;但沒有用?


將睡眠時間更改為更短的時間可能會奏效。


還:


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(); //i think is better to put draw functions outside switch(key)

   }


查看完整回答
反對 回復(fù) 2022-12-24
  • 2 回答
  • 0 關(guān)注
  • 97 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號