Member 14084793 Ответов: 1

Хотите иметь случайное движение для каждого тика таймера


У меня есть метод в классе, который вызывает графические коробки для перемещения, я пытаюсь заставить графические коробки двигаться индивидуально на произвольные длины вперед. Я бы подумал, что этот код будет работать, но коробки с картинками движутся как группа на одинаковую длину вперед. Когда я нажимаю кнопку "Пуск", моя единственная догадка заключается в том, что я использую рандомизацию неправильно.

Вот код класса, который имеет метод перемещения:

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)); это даст ручное семя случайному, а не Новому семени в каждом временном срезе.

1 Ответов

Рейтинг:
2

OriginalGriff

Прекратите создавать новый случайный вызов при каждом вызове run.
Удалите эту строку:

Randomizer = new Random();
И изменить это:
public Random Randomizer; // And instance of Random
До настоящего времени:
public Random Randomizer = new Random(); // And instance of Random

Когда вы создаете случайный экземпляр, он инициализируется из системных часов (это называется посевом): если вы создадите четыре в быстрой последовательности, есть очень хороший шанс, что все они будут созданы с одним и тем же начальным значением и, таким образом, сгенерируют одну и ту же последовательность значений - особенно на современных быстрых компьютерах.
Создайте один экземпляр и повторно используйте его каждый раз, когда вам нужно случайное число.


CPallini

5.