如何让多个机器人跟随玩家?

时间:2019-08-12 13:24:33

标签: c# winforms

我正在学习C#,并且正在创建一个假设的游戏供我理解该语言。我想让几个机器人跟随正在移动矩形的播放器,但是我只能移动播放器,而自动机器人则不能移动。

我真的研究了如何移动这些机器人。我得出的结论是,我必须了解线程,这只会导致程序不崩溃。

我把我正在尝试的完整代码留在这里。

-T host=x64

如您所见,我只能移动播放器,但机器人却不移动,我该怎么办才能移动机器人?

2 个答案:

答案 0 :(得分:0)

我认为Timer在这里会更好,并消除了此时您完全了解线程的要求,因为它将为您处理详细信息。我假设您实际上是希望机器人“跟随”,而不是仅在for (row = 0; row < numbers.length; row++){ for (c = 0; c < numbers[row].length; c++){ return numbers[row][c] % 2 ? "even" : "odd"; } } console.log(numbers); 移动时移动,并且如果玩家快速移动,机器人将落后。

因此,要使用Player,我将按以下方式调整您的Timer类,以删除线程的使用情况,只允许它向{{1} }方法,每100毫秒将调用一次。注意Bot是一个结构,因此它是不可变的-这就是为什么您的机器人不移动的原因-如果您执行以下操作:

Follow

您可能会认为Rectangle现在是5;但事实并非如此。因此,我们使用新位置创建了一个新矩形。

Point bot = Rectangle.Location;
bot.X = 5;

并添加以下代码来替换您现有的构造函数,并添加另一个方法来处理Rectangle.Location.X滴答声。

public class Bot
{
    private Player player;
    public Rectangle Rectangle { get; set; }

    public Bot(Player player, Size size)
    {
        this.player = player;
        this.Rectangle = new Rectangle() { Size = size };
    }

    public void Follow()
    {
        Point p = player.Rectangle.Location;
        Point bot = Rectangle.Location;

        for (int i = bot.X + 2; i < p.X;)
        {
            bot.X = i;
            break;
        }

        for (int i = bot.X - 2; i > p.X;)
        {
            bot.X = i;
            break;
        }

        for (int i = bot.Y + 2; i < p.Y;)
        {
            bot.Y = i;
            break;
        }

        for (int i = bot.Y - 2; i > p.Y;)
        {
            bot.Y = i;
            break;
        }

        Rectangle = new Rectangle(bot, player.Rectangle.Size);
    }
}

答案 1 :(得分:0)

Point是一个值类型(struct)。 (有关详细信息,请访问What's the difference between struct and class in .NET?

执行此操作时:

Point bot = Rectangle.Location;
bot.X = i;

...您创建并修改了本地Point。这不会更改Bot矩形的位置。另外,矩形也是结构,因此您必须修改原始Bot的Rectangle或为Bot分配新的Rectangle。

要修复,您可以替换:

bot.X = i;

...与...

this.rectangle.X = i;

并对.Y(在您的所有 for循环位置中)进行类似的更改

全力以赴:

        public void Follow()
        {
            Task.Run(() =>
            {
                while (true) {
                    Point p = player.Rectangle.Location;
                    Point bot = rectangle.Location;

                    for (int i = bot.X; i < p.X; i += 2) {
                        Thread.Sleep(100);
                        this.rectangle.X = i;
                    }

                    for (int i = bot.X; i > p.X; i -= 2) {
                        Thread.Sleep(100);
                        this.rectangle.X = i;
                    }

                    for (int i = bot.Y; i < p.Y; i += 2) {
                        Thread.Sleep(100);
                        this.rectangle.Y = i;
                    }

                    for (int i = bot.Y; i > p.Y; i -= 2) {
                        Thread.Sleep(100);
                        this.rectangle.Y = i;
                    }
                }
            });
        }