簡體   English   中英

在 C# 中為 Race Game 生成隨機速度字母

[英]Generate Random Speed letters for Race Game in C#

我正在創建一個簡單的任務,只是為了繼續練習。 現在我創建了一個非交互式游戲。 字母是A,B,C的字符。 現在因為我已經 position 我的“C”到 3 它總是第一個完成。 你如何隨機每個字符的速度?

static void Main()
        {
           

          Runner runnerA = new Runner('A');   
            Runner runnerB = new Runner('B');
            Runner runnerC = new Runner('C');

            runnerA.Position = 1;
            runnerB.Position = 3;
            runnerC.Position = 3;

            string course = "---......------.......";

            while (true)
            {
                runnerA.Position++;
                runnerB.Position++;
                runnerC.Position++;

                if (runnerA.Position == course.Length)
                {
                }

                for (int i = 0; i < course.Length; i++)
                {
                    if (runnerA.Position == i)
                    {
                        Console.Write(runnerA.Glyph);
                    }
                    else if (runnerB.Position == i)
                    {
                        Console.Write(runnerB.Glyph);
                    }
                    else if (runnerB.Position == i) {
                        Console.Write(runnerB.Glyph);
                    }
                    else // No runners on this tile.
                    {
                        Console.Write(course[i]);
                    }
                }

                Console.Write('|');

                Console.WriteLine();

                Thread.Sleep(100);
                Console.SetCursorPosition(0, 0);


            }

            
        }
    }

如果 runnerB position 的條件相同,您還有另外兩個條件。 我假設你的意思是他們中的第二個將是 runnerC。 我改變了這個,我改變了,所以跑步者的 position 將在最后一個 position 到課程字符串結尾的范圍內是隨機的。 每個隨機 position 與之前的位置不同。 對於許多跑步者,我們可能會考慮更有效的解決方案。

static void main()
{
    Runner runnerA = new Runner('A');
    Runner runnerB = new Runner('B');
    Runner runnerC = new Runner('C');
    Random rand = new Random();

    runnerA.Position = 1;
    runnerB.Position = 2;
    runnerC.Position = 3;

    string course = "---......------.......";

    while (true)
    {

        for (int i = 0; i < course.Length; i++)
        {
            if (runnerA.Position == i)
            {
                Console.Write(runnerA.Glyph);
            }
            else if (runnerB.Position == i)
            {
                Console.Write(runnerB.Glyph);
            }
            else if (runnerC.Position == i)
            {
                Console.Write(runnerC.Glyph);
            }
            else // No runners on this tile.
            {
                Console.Write(course[i]);
            }
        }

        Random rand = new Random();
        runnerA.Position = rand.Next(runnerA.Position, course.Length);
        do
         runnerB.Position = rand.Next(runnerB.Position, course.Length);
        while (runnerB.Position == runnerA.Position);

        do
         runnerC.Position = rand.Next(runnerC.Position, course.Length);
        while (runnerC.Position == runnerA.Position || runnerC.Position 
        == runnerB.Position);    
        Console.Write('|');

        Console.WriteLine();

        Thread.Sleep(100);
        Console.SetCursorPosition(0, 0);


    }
}

這是一個像這樣工作的解決方案:

  • Runner類使用隨機位置和速度進行實例化
  • Runners 有一個 Timer 屬性,允許根據經過的時間指示何時需要移動
  • 我根據地形顯示了一個速度因子:如果“-”為 1,如果“.”為 0.5。
  • 如果兩個跑步者有相同的position,只會出現一個

主要空白:

internal class Program
{
    static void Main()
    {
        Random random = new Random();
        string map = "-----------............------..............-----------............|";
        int interval = 50;
        List<Runner> runners = new List<Runner>
        {
            new Runner('A', random.Next(1, 10), random.Next(1, 5) * interval),
            new Runner('B', random.Next(1, 10), random.Next(1, 5) * interval),
            new Runner('C', random.Next(1, 10), random.Next(1, 5) * interval)
        };

        while (true)
        {
            foreach (Runner runner in runners)
            {
                if (runner.Position == map.Length - 1)
                {
                    Console.SetCursorPosition(0, 1);
                    Console.WriteLine($"The winner is: {runner.Glyph} !");
                    Console.ReadKey();
                }
                double mapFactor = map[runner.Position].Equals('-') ? 1 : 0.5;
                runner.Update(interval, mapFactor);
            }

            for (int i = 0; i < map.Length; i++)
            {
                Runner matchingRunner = runners.Find(x => x.Position == i);
                Console.Write(matchingRunner != null ? matchingRunner.Glyph : map[i]);
            }

            Console.WriteLine();
            Thread.Sleep(interval);
            Console.SetCursorPosition(0, 0);
        }
    }
}

以及相關的Runner class:

public class Runner
{
    public char Glyph { get; set; }
    public int Position { get; set; }
    public int Speed { get; set; }
    public int Timer { get; set; }

    public Runner(char glyph, int position, int speed)
    {
        Glyph = glyph;
        Position = position;
        Speed = speed;
        Timer = 0;
    }

    public void Update(int interval, double mapFactor)
    {
        Timer += interval;
        if (Timer / mapFactor > Speed)
        {
            Timer = 0;
            Position++;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM