Хотите иметь случайное движение для каждого тика таймера
У меня есть метод в классе, который вызывает графические коробки для перемещения, я пытаюсь заставить графические коробки двигаться индивидуально на произвольные длины вперед. Я бы подумал, что этот код будет работать, но коробки с картинками движутся как группа на одинаковую длину вперед. Когда я нажимаю кнопку "Пуск", моя единственная догадка заключается в том, что я использую рандомизацию неправильно.
Вот код класса, который имеет метод перемещения:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace dogsrace { public class Greyhound { public int StartingPosition; // Where my PictureBox starts public int RacetrackLength; // How long the racetrack is public PictureBox MyPicurebox = null; // My PictureBox object public int Location = 0; // My Location on the racetrack public Random Randomizer; // And instance of Random public void TakeStartingPosition() { // Reset my location to 0 and my PictureBox to starting position } public bool Run() { if (MyPicurebox.Left <= RacetrackLength) { Randomizer = new Random(); Location = Randomizer.Next(0, 20); MyPicurebox.Left = StartingPosition + Location; return true; } else { return false; } } // Move forward either 1, 2, 3 or 4 spaces at random // Update the position of my PictureBox on the form like this: // MyPictureBox.Left = StartingPosition + Location; // Return true if I won the race }
Вот код для этой формы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace dogsrace { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Greyhound[] Dog = new Greyhound[4]; private void Start_Click(object sender, EventArgs e) { timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { Dog[0] = new Greyhound { MyPicurebox = Dog1, StartingPosition = Dog1.Left, RacetrackLength = RaceTrack.Width - Dog1.Width, }; Dog[1] = new Greyhound { MyPicurebox = Dog2, StartingPosition = Dog2.Left, RacetrackLength = RaceTrack.Width - Dog2.Width, }; Dog[2] = new Greyhound { MyPicurebox = Dog3, StartingPosition = Dog3.Left, RacetrackLength = RaceTrack.Width - Dog3.Width, }; Dog[3] = new Greyhound { MyPicurebox = Dog4, StartingPosition = Dog4.Left, RacetrackLength = RaceTrack.Width - Dog4.Width, }; if (Dog[0].Location < Dog[0].RacetrackLength) { Dog[0].Run(); } if (Dog[1].Location < Dog[1].RacetrackLength) { Dog[1].Run(); } if (Dog[2].Location < Dog[2].RacetrackLength) { Dog[2].Run(); } if (Dog[3].Location < Dog[3].RacetrackLength) { Dog[3].Run(); } } }
Что я уже пробовал:
Я попытался просто сделать так, чтобы каждый раз, когда я нажимал кнопку с одним и тем же кодом, чтобы увидеть, перемещаются ли pictureboxes вперед на произвольные длины и по отдельности, и это работает, если код установлен для кнопки, я просто должен продолжать нажимать кнопку, но когда я использую один и тот же код для события timer_tick, они перемещаются как группа на одинаковые длины вперед.
TABiSH777
Пробовали ли вы дать новое семя при инициализации Random(seed)? пожалуйста, попробуйте дать новое семя нет. в каждом интервале. вы можете сделать это, получив численный из идентификатора GUID. я.е семя= регулярное выражение.Матч(Guid.NewGuid(), @"\d+").Значение; затем случайная(конвертировать.ToInt32(seed)); это даст ручное семя случайному, а не Новому семени в каждом временном срезе.