Thuật toán random cho game winform c#

mình đang có bài tập mô phỏng lại game hứng trứng bằng winform bằng game hứng bia , mình muốn hỏi thuật toán để random ngẫu nhiên mấy cái chai bia khi văng lần đầu , ý là lúc vừa vào đầu game mình muốn cho nó rớt ngẫu nhiên 1 trong 4 cái xe thôi , mình có viết hàm random (1,5) rồi picturebox.top += (số pixel rơi ) mà nó vẫn rơi luôn 4 cái khi mới start game

ai biết chỉ hộ mình vs ạ

Bên C++ thì mình hay dùng hàm GetTickCount hoặc time để lấy thời gian.
Sau đó lấy giá trị này truyền vào hàm srand.

bên c# không có hàm này ,:>>, bạn có thuật toán nào không ns qua giúp mình mình nghiên cứu cũng được

Cái này có lẽ lỗi không chỉ nằm ở hàm random. Có khi nào bạn viết dạng như thế này:

for (var i = 0; i < 4; i += 1)
{
    int result = new Random().nextInt(1, 5);
}

thay vì

Random random = new Random();
for (var i = 0; i < 4; i += 1)
{
    int result = random.nextInt(1, 5);
}
4 Likes

Hìình như việc random này nó chỉ tác động tới lần chạy thứ 2 thôi, mình muốn ngay lần đầu tiên khi mới start game thì nó sẽ chọn rơi ngẫu nhiên 1 trong 4 cái kia trước rồi theo lần lượt rơi, bây giờ khi mới vào nó rơi 4 cái cùng 1 lúc.
Mình sử dụng timer cho mỗi 1 cái chai bia và gọi nó vào ngay timerstartGame.

    private void timerBeer1_Tick(object sender, EventArgs e)
        {
            if(picbeer1.Top > 700)
            {
                picbeer1.Top = 0;
                picbeer1.Location = new Point(ramdomxe(), 0);
            }
            else
            {
                picbeer1.Top += speed;
            }
        }

Phương thức ramdomxe()

private int ramdomxe()
        {
            int x =17;
            int[] toado = new int[4] { 17, 159, 306, 468 };
            Random r = new Random();
            int vt;
            for (var i = 0; i< 4; i += 1)
            {
                vt = r.Next(1, 5);
                switch (vt)
                {
                    case 1:
                        {
                            x = toado[0];
                            break;
                        }
                    case 2:
                        {
                            x = toado[1];
                            break;
                        }
                    case 3:
                        {
                            x = toado[2];
                            break;
                        }
                    case 4:
                        {
                            x = toado[3];
                            break;
}
                }
            }
            return x;
          
        }

Trong phương thức randomxe() dùng vòng lặp làm gì thế? Cuối cùng thì cũng trả về có 1 giá trị thôi.
Dùng switch - case dư thừa!.

// Để các trường này là toàn cục
    int[] toado = new int[4] { 17, 159, 306, 468 };
    Random r = new Random();
// Chỉ ngắn gọn
    private int ramdomxe()
        {
            return toado[r.Next(0,4)];
        }

Vấn đề là khi bắt đầu trò chơi (timerstartGame()) bạn gọi các timer cùng 1 lúc nên nó thực hiện cùng 1 lúc thôi!
Bạn dùng thêm 1 timer để làm độ trễ (khoảng cách) cho 4 timer này.

2 Likes

Thường thì trong một project, mình thường viết một cái random util nho nhỏ, chỉ gồm 1 biến static Random dùng cho tất cả mọi việc chứ ít khi dùng new Random() lắm

5 Likes

Hi Vũ Thuận.
Sao bạn không random 1 trong 4 xe xem ?

2 Likes

mình đang cố làm điều đó nhưng không được, nên đang đi xem thuật toán

Hi Vũ Thuận.

  1. Bạn có một mảng các xe cars[COUNT].
  2. Sinh ngẫu nhiên một số để xem là lấy xe nào value = random(0, COUNT - 1).
  3. cars[value].drop()
  4. Sau một khoản thời gian thì lại lấy ngẫu nhiên tiếp. Càng về sau thì càng nhanh. Sẽ đến một thời điểm cả 4 xe rơi cùng lúc.
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?