#c# #winforms
#c# #winforms
Вопрос:
Я создал игру, похожую на mine sweeper. Я использую Windows forms и создал класс mine, в котором есть заданное количество шахт, размещенных при загрузке формы.
У меня есть пользователь-игрок, который, очевидно, перемещается, и игрок, и мины имеют одинаковый размер, 20,20, в настоящее время мины устанавливаются для случайного размещения на панели, x (0,400) и y (0,360).
Игрок начинает каждый раз с фиксированной точки, 200,380 и имеет движение 20, что мне нравится, так это иметь возможность гарантировать, что мины размещаются с кратностью 20, так что 20,20 40,40 и т. Д., Чтобы, когда игрок перемещается, я не получаю позицию, в которой игрок оказываетсяна полпути в шахту (если это имеет смысл).
Я хочу, чтобы игрок либо полностью пропустил мину, либо полностью попал в нее.
class Mines
{
// variables for movign the enemy ships
public PictureBox m;
public int xPos, yPos;
public Boolean isDisposed = false;
Random random = new Random();
public Mines(Panel f)
{
m = new PictureBox();
m.Width = 20;
m.Height = 20;
m.Image = Minefield.Properties.Resources.mine;
m.SizeMode = PictureBoxSizeMode.AutoSize;
m.BackColor = Color.Transparent;
m.Visible = true;
xPos = random.Next(0, 400);
yPos = random.Next(0,360);
m.Location = new Point(xPos, yPos); // x and y position of the enemy for starting
f.Controls.Add(m); // needed to add the control to the panel
}
public void placeMines(Panel f)
{
m.Location = new Point(xPos, yPos);
}
}
Это код, который у меня есть для класса mine, я могу предоставить больше, если это необходимо, заранее спасибо
Ответ №1:
Вам нужно будет рассчитать возможные дискретные шаги с учетом ширины шага 20
. И случайным образом выберите количество шагов, которые вы хотите сделать. Вот небольшой пример, показывающий работу:
Random random = new Random();
for (int i = 0; i < 10; i )
{
int stepWidth = 20; //
int maxStep = 400 / stepWidth; // here calculate the maximum number of step that can be made
int stepAmount = random.Next(1, maxStep);
Console.WriteLine(stepAmount * stepWidth);
}
Вывод:
160
140
180
380
120
200
80
100
80
200
Комментарии:
1. спасибо, я попробовал, и, похоже, теперь он отлично работает
2. и последнее, что мне нужно добавить, чтобы избежать дубликатов?
3. @AdrianRowlands вам нужно будет их запомнить. Сохраните его в списке и проверьте с помощью contains, если список уже содержит новое случайное число. Если это так, продолжайте генерировать.
4. Чтобы избежать дублирования, вы также можете сначала создать список возможных значений. Затем выберите случайный индекс из этого списка, используйте его значение и удалите из этого списка. Возможно, воссоздать список, когда он станет пустым