Перемещение Picturebox случайным образом, когда он перемещается - PullRequest
0 голосов
/ 18 марта 2020

Я хочу создать ИИ с помощью PictureBox, который может перемещаться случайным образом, не мешая его движениям, например: PictureBox должен выполнить движение до go Вправо, если таймер исчерпает его, следующее движение будет идти вниз, как, например, Случайно это будет бродить.

Я думал, я мог бы выяснить это, чтобы жестко закодировать это. Однако это может занять много времени, также, как только Таймер остановится, он не будет перезапущен снова. IDK почему.

Вот изображение моей игры, так что у вас есть некоторые идеи по этому поводу.

Вот код также

 private void Game_Load(object sender, EventArgs e)
    {
        E_Right.Start();
        if(Upcount == 0)
        {
            E_Right.Start();
        }
    }

    private void E_Right_Tick(object sender, EventArgs e)
    {
        if(Rightcount > 0)
        {
            EnemyTank.Left += 5;
            EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_RIGHT_v_2;
            Rightcount = Rightcount - 1;
        }
        if (Rightcount == 0)
        {
            E_Right.Stop();
            E_Down.Start();
        }
    }

    private void E_Up_Tick(object sender, EventArgs e)
    {
        if (Upcount > 0)
        {
            EnemyTank.Top -= 5;
            EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_TOP_v_1;
            Upcount = Upcount - 1;
        }
        if (Upcount == 0)
        {
            E_Up.Stop();
            E_Right.Start();
        }
    }

    private void E_Down_Tick(object sender, EventArgs e)
    {
        if (Downcount > 0)
        {
            EnemyTank.Top += 5;
            EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_DOWN_v_1;
            Downcount = Downcount - 1;
        }
        if (Downcount == 0)
        {
            E_Down.Stop();
            E_Left.Start();
        }
    }

    private void E_Left_Tick(object sender, EventArgs e)
    {
        if (Leftcount > 0)
        {
            EnemyTank.Left -= 5;
            EnemyTank.BackgroundImage = Properties.Resources.EnemyTank_LEFT_v_1;
            Leftcount = Leftcount - 1;
        }
        if (Leftcount == 0)
        {
            E_Left.Stop();
            E_Up.Start();
        }
    }

Ну просто предположим, что PictureBox находится в местоположении (0,0). Если вы видите PictureBox, изображение танка не имеет значения. Это касается MainTank, который будет использовать пользователь.

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете сделать это только с одним таймером:

int moveTo = 0;             // Move while this is not 0
int speed = 3;
Random rand = new Random();

// Keep track of whether the tank is moving up/down or left/right
enum MoveOrientation { Vertical, Horizontal };
MoveOrientation orientation = MoveOrientation.Vertical;

void ChooseNextPosition()
{
    // Negative numbers move left or down
    // Positive move right or up
    do {
        moveTo = rand.Next(-5, 5);
    } while (moveTo == 0);  // Avoid 0
}

private void Game_Load(object sender, EventArgs e) {
    ChooseNextPosition();
    timer1.Start();
}

private void timer1Tick(object sender, EventArgs e) {
    if (orientation == MoveOrientation.Horizontal)
    {
        EnemyTank.Left += moveTo * speed;
    }
    else
    {
        EnemyTank.Top += moveTo * speed;
    }
    moveTo -= moveTo < 0 ? -1 : 1;
    if (moveTo == 0)
    {
        // Switch orientation.
        // If currently moving horizontal, next move is vertical
        // And vice versa
        orientation = orientation == MoveOrientation.Horizontal ? MoveOrientation.Vertical : MoveOrientation.Horizontal;
        // Get new target
        ChooseNextPosition();
    }
}
...