我正在学习C#,并且正在创建一个假设的游戏供我理解该语言。我想让几个机器人跟随正在移动矩形的播放器,但是我只能移动播放器,而自动机器人则不能移动。
我真的研究了如何移动这些机器人。我得出的结论是,我必须了解线程,这只会导致程序不崩溃。
我把我正在尝试的完整代码留在这里。
-T host=x64
如您所见,我只能移动播放器,但机器人却不移动,我该怎么办才能移动机器人?
答案 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;
}
}
});
}