2009-09-03 24 views
6

Trong trò chơi quản lý trực tuyến (như Hattrick), tôi muốn mô phỏng các trận đấu giữa hai đội.Mô phỏng các trận đấu thể thao trong trò chơi trực tuyến

Một nhóm gồm 11 người chơi. Mỗi người chơi có một giá trị sức mạnh từ 1 đến 100. Tôi lấy các giá trị sức mạnh của các cầu thủ phòng ngự cho mỗi đội và tính toán mức trung bình. Đó là chất lượng phòng thủ của một đội. Sau đó, tôi lấy điểm mạnh của những người chơi tấn công và tôi nhận được chất lượng tấn công.

Đối với mỗi cuộc tấn công, tôi làm như sau:

$offFactor = ($attackerTeam_offensive-$defenderTeam_defensive)/max($attackerTeam_offensive, $defenderTeam_defensive); 
$defFactor = ($defenderTeam_defensive-$attackerTeam_offensive)/max($defenderTeam_defensive, $attackerTeam_offensive); 

Tại thời điểm này, tôi không biết tại sao tôi chia nó bằng một cao hơn của cả hai giá trị. Nhưng công thức này sẽ cung cấp cho bạn một yếu tố cho chất lượng của hành vi phạm tội và quốc phòng mà là cần thiết sau này.

Sau đó, tôi có các câu lệnh có điều kiện lồng nhau cho mỗi sự kiện có thể xảy ra. Ví dụ: Đội tấn công có cơ hội ghi bàn không?

if ((mt_rand((-10+$offAdditionalFactor-$defAdditionalFactor), 10)/10)+$offFactor >= 0) 
{ ... // the attack succeeds 

Các yếu tố bổ sung này có thể là giá trị chiến thuật chẳng hạn.

Bạn có nghĩ đây là cách hay để tính toán trò chơi không? Người dùng của tôi nói rằng họ không hài lòng với chất lượng của các mô phỏng. Làm thế nào tôi có thể cải thiện chúng? Bạn có phương pháp tiếp cận khác nhau mà có thể cho kết quả tốt hơn? Hoặc bạn có nghĩ rằng cách tiếp cận của tôi là tốt và tôi chỉ cần điều chỉnh các giá trị trong các câu lệnh có điều kiện và thử nghiệm một chút?

Tôi hy vọng bạn có thể giúp tôi. Cảm ơn trước!

+0

Các tính toán 10 trong các phép tính thể hiện cụ thể trong mô phỏng này là gì? –

+0

Điều gì về chất lượng của mô phỏng là họ không hài lòng với? –

+0

@Kyle Walsh: 10s chỉ được sử dụng vì hàm mt_rand() chỉ lấy giá trị số nguyên. Tôi muốn tạo ra một giá trị ngẫu nhiên giữa -1 (hoặc cao hơn tùy thuộc vào các yếu tố bổ sung) và +1 là một giá trị dấu phẩy động. – caw

Trả lời

19

Đây là cách tôi sẽ làm.

Chất lượng Tấn công/Phòng thủ

Đầu tiên cho phép làm việc ra sức mạnh trung bình của toàn bộ đội:

Team.Strength = SUM(Players.Strength)/11 

Bây giờ chúng tôi muốn chia ra bên trong hai, và làm việc ra các trung bình cho chúng tôi người chơi phòng thủ và những người chơi tấn công của chúng tôi.]

Defense.Strength = SUM(Defensive_Players.Strength)/Defensive_Players.Count 
Offense.Strength = SUM(Offense_Players.Strength)/Offense_Players.Count 

Bây giờ, chúng tôi có ba giá trị. Đầu tiên, ra khỏi trung bình đội, sẽ được sử dụng để tính toán tỷ lệ thắng của chúng tôi. Hai người kia, sẽ tính toán khả năng phòng thủ của chúng tôi và tỷ lệ cược của chúng tôi.

Một đội có tỷ lệ trung bình tấn công cao sẽ có nhiều cơ hội hơn, một đội có khả năng phòng ngự cao sẽ có nhiều cơ hội hơn để cứu.

Bây giờ nếu chúng ta phải đội, cho phép gọi họ là A và B.

Đội A, có trung bình 80, An điểm tấn công của 85 và điểm phòng thủ của 60.

Team B, có số điểm trung bình là 70, Số điểm xúc phạm là 50 và số điểm phòng thủ là 80.

Bây giờ, dựa trên mức trung bình. Đội A, nên có cơ hội chiến thắng tốt hơn. Nhưng bằng bao nhiêu?

chấm điểm và tiết kiệm

Cho phép tìm ra đội A nên ghi bao nhiêu lần mục tiêu:

A.Goals = (A.Offensive/B.Defensive) + RAND() 
     = (85/80) + 0.8; 
     = 1.666 

tôi đã giả định các giá trị ngẫu nhiên cho biết thêm bất cứ điều gì giữa -1 và +1, mặc dù bạn có thể điều chỉnh điều này.

Như chúng ta có thể thấy, công thức cho biết đội A nên ghi được 1,6 bàn thắng. chúng ta có thể làm tròn lên/xuống. Hoặc cho đội A 1, và tính toán nếu người khác được phép (ngẫu nhiên).

Bây giờ cho Team B

B.Goals = (B.Offensive/A.Defensive) + RAND() 
     = (50/60) + 0.2; 
     = 1.03 

Vì vậy, chúng ta có A ghi bàn 1 và B ghi 1. Nhưng hãy nhớ, chúng tôi muốn trọng lượng này ủng hộ A, bởi vì, nhìn chung, họ là những đội bóng tốt hơn.

Vậy cơ hội A sẽ giành chiến thắng là gì?

Chance A Will Win = (A.Average/B.Average) 
        = 80/70 
        = 1.14 

Vì vậy, chúng tôi có thể thấy tỷ lệ cược là 14% (.14) có lợi cho A thắng trận đấu. Chúng tôi có thể sử dụng giá trị này để xem liệu có bất kỳ thay đổi nào trong điểm số cuối cùng không:

if Rand() <= 0.14 then Final Score = A 2 - 1 B Otherwise A 1 - 1 B 

Nếu số ngẫu nhiên của chúng tôi là 0,8, thì trận đấu là hòa.

làm tròn lên và suy nghĩ sâu hơn

Bạn chắc chắn sẽ muốn chơi xung quanh với các giá trị. Hãy nhớ rằng, cơ chế trò chơi là rất khó để có được quyền. Nói chuyện với người chơi của bạn, hỏi họ tại sao họ không hài lòng. Có đội nào luôn thua? Các mô phỏng luôn luôn trì trệ? v.v.

Đường viền ở trên bị ảnh hưởng sâu sắc bởi sự lựa chọn ngẫu nhiên. Bạn sẽ muốn bình thường hóa nó để cơ hội của một đội ghi thêm 5 bàn thắng là rất rất hiếm. Nhưng một chút ngẫu nhiên là một cách tuyệt vời để thêm một số loại cho trò chơi.

Có nhiều cách để chỉnh sửa phương pháp này. Ví dụ thay vì số bàn thắng, bạn có thể sử dụng số Mục tiêu làm số cơ hội ghi bàn và sau đó có một chức năng khác để tính số mục tiêu dựa trên các yếu tố khác (tức là chọn một tiền đạo ngẫu nhiên và sử dụng người chơi đó số liệu thống kê và mục tiêu, để tìm ra nếu có mục tiêu)

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn rất nhiều! :) Xin hãy xem nhận xét của tôi về câu trả lời của Kylotan liên quan đến sự phân chia. Bạn có nghĩ rằng sự phân chia là đầy đủ hơn sự khác biệt? – caw

+0

Tại sao B.Goals = (B.Offensive/A.Defensive) + RAND()? – Mathias

+0

@Mathias Cũng giống như cách chúng ta lấy A.Goals = (A.Offensive/B.Defensive) + RAND() chúng ta hoán đổi biến xung quanh cho B.Goals.Chúng ta so sánh sự tấn công của mỗi đội đối với các đội phòng thủ đối lập. Điều ngẫu nhiên là có một số phương sai. – AAA

0

trung bình nên có số lượng người chơi ... bằng cách sử dụng tối đa có nghĩa là nếu bạn có 3 đội chơi:

[4 4 4]

[7 4 1]

Thứ hai người ta sẽ được coi là yếu hơn. Đó là điều bạn muốn? Tôi nghĩ bạn thích làm điều gì đó như:

(Tổng số điểm/Tổng số người chơi) + (Điểm tối đa/Tổng số người chơi), vì vậy trong ví dụ trên, điều đó sẽ làm cho đội thứ hai tốt hơn một chút.

Tôi đoán nó phụ thuộc vào cách bạn cảm thấy các đội nên được cân bằng.

+0

Cảm ơn câu trả lời của bạn. Tôi biết cách tính các giá trị trung bình và tôi đã thực hiện điều này. $ attackerTeam_offensive là mức trung bình của hành vi phạm tội của kẻ tấn công và $ defenderTeam_defensive là mức trung bình của hàng phòng ngự của hậu vệ. Nhưng tôi không biết tại sao tôi phân chia sự khác biệt của họ bằng giá trị cao hơn cả hai giá trị. Và tôi không biết liệu kỹ thuật/phương pháp của tôi có tốt không. – caw

3

Sự phân chia trong ví dụ của bạn có lẽ là một ý tưởng tồi, bởi vì nó thay đổi quy mô của biến đầu ra tùy thuộc vào bên nào tốt hơn. Nói chung khi so sánh hai đại lượng, bạn hoặc muốn dữ liệu khoảng cách (trừ một số từ dữ liệu khác) hoặc dữ liệu tỷ lệ (chia cho nhau) nhưng không phải cả hai.

Cách tiếp cận tốt hơn trong trường hợp này là chỉ cần chia số điểm tấn công bằng số điểm phòng thủ. Nếu cả hai đều bằng nhau, kết quả sẽ là 1. Nếu kẻ tấn công là tốt hơn so với hậu vệ, nó sẽ lớn hơn 1, và nếu hậu vệ mạnh hơn, nó sẽ ít hơn một. Đây là những con số dễ làm việc.

Ngoài ra, thay vì tính trung bình toàn bộ nhóm, các phần trung bình của đội tùy thuộc vào hình dạng hoặc chiến thuật được sử dụng. Điều này sẽ cho phép các đội lựa chọn để chơi tấn công hoặc phòng thủ và xem những ưu và khuyết điểm của việc này.

Và tự viết cho mình một số hàm tạo số ngẫu nhiên tốt hơn. Một trả về các giá trị dấu phảy động nằm giữa -1 và 1 và một giá trị hoạt động từ 0 đến 1, đối với người mới bắt đầu. Sử dụng các tính năng này trong các phép tính của bạn và bạn có thể tránh được tất cả 10 điều khó hiểu ở khắp mọi nơi!

+0

Cảm ơn bạn rất nhiều! Tôi không nghĩ rằng việc chia hai giá trị sức mạnh là một ý tưởng hay. Các yếu tố sẽ thay đổi một cách không cân bằng và bạn sẽ nhận được một parabola: 6/1 = 6, 6/2 = 3, 6/3 = 2 Đây không phải là trường hợp, phải không? Sự khác biệt là một cách khá tốt hơn tôi nghĩ. – caw

+0

Một đối số khác về phân chia: Các giá trị từ 4/2 đến 4/3 đang giảm trong khi các giá trị từ 2/4 đến 3/4 đang tăng lên. Đó là hoàn toàn không mong muốn, phải không? Điều này có nghĩa là: Là một đội chủ nhà, sẽ tốt hơn nếu được mạnh hơn. Với tư cách là một đội khách, điều tốt là yếu hơn. ;) – caw

+0

Tôi đã lấy trung bình các phần của đội. Tôi có $ attackTeam_offensive và $ attackTeam_defensive. Hay bạn có nghĩa là tôi thậm chí nên chia cuộc tấn công thành nhiều phần như bên phải và bên trái? – caw

3

Bạn cũng có thể muốn hỏi người dùng những gì về mô phỏng họ không thích. Có thể, thay vì nhìn thấy kết quả cuối cùng của trò chơi, họ muốn biết số lần đội của họ có cơ hội tấn công nhưng phòng thủ giành lại quyền kiểm soát. Vì vậy, thay vì

"Your team wins 2-1"

Họ muốn xem trận đấu nổi bật:

 
"Your team wins 2-1: 
- scored at minute 15, 
- other team took control and went for tried for a goal at minute 30, 
    but the shoot was intercepted, 
- we took control again and $PLAYER1 scored a beautiful goal! 
... etc 

Bạn có thể sử dụng một cái gì đó giống như những gì Jamie gợi ý cho một điểm khởi đầu, chọn thời gian một cách ngẫu nhiên, và có thể chọn người ghi được mục tiêu dựa trên việc lấy mẫu trọng số của các cầu thủ tấn công (nghĩa là một người chơi có điểm số cao hơn sẽ có cơ hội cao hơn là người đã ghi bàn). Bạn có thể vui chơi và thêm các sự kiện xác suất ngẫu nhiên thấp giống như thẻ đỏ trên máy nghe nhạc, một người nào đó đang tự làm tổn thương bản thân, vệt trên ...

4

Quyết định chiến thuật cơ bản nhất trong bóng đá là chọn formation, một bộ ba số chỉ định 10 cầu thủ ngoài sân phòng thủ, tiền vệ và tấn công, tương ứng, ví dụ 4/4/2.

Nếu bạn sử dụng sức mạnh trung bình của người chơi, bạn không chỉ mất chiến thuật đó, bạn sẽ lùi lại: phòng thủ mạnh nhất là một cầu thủ duy nhất, giúp anh ấy giúp đỡ nhiều hơn. ghi bàn. Nếu bạn có một người chơi có xếp hạng là 10, trung bình là 10. Thêm người chơi khác có xếp hạng 8 và số người bỏ trung bình (đến 9). Nhưng chỉ định nhiều người hơn để phòng thủ nên làm cho nó mạnh hơn, không yếu hơn.

Điều đầu tiên, bạn muốn làm mọi thứ dựa trên tổng số, không phải là trung bình. Tỷ lệ giữa tổng số là một cách độc lập quy mô tốt để xác định đội nào là mạnh hơn và bao nhiêu. Tỷ lệ có xu hướng tốt hơn so với sự khác biệt, bởi vì chúng hoạt động theo cách có thể dự đoán được với các nhóm của bất kỳ phạm vi điểm mạnh nào. Bạn có thể thiết lập một combat results table cho biết có bao nhiêu mục tiêu được ghi (mỗi trò chơi, mỗi nửa, mỗi lần di chuyển hoặc bất kỳ thứ gì).

Lựa chọn chiến thuật tiếp theo là liệu tốt hơn là nên có một trình phát đặc biệt hay một số trình phát hay. Bạn có thể làm cho vấn đề đó bằng cách thiết lập các kịch bản đại diện cho những điều xảy ra trong trò chơi, ví dụ: 1 trên 1, một góc, hoặc một quả bóng dài. Các cầu thủ tham gia vào một kịch bản đầu tiên được chọn ngẫu nhiên, sau đó kết quả của kịch bản được cuộn lại. Một kết quả có thể là một kịch bản khác bắt đầu (tiền vệ vượt qua dẫn đến vượt qua dẫn đến cơ hội tiêu đề).

Bước cuối cùng, điều này mang lại cho bạn nhiều mức độ của trò chơi quản lý bóng đá thực sự, là cung cấp cho người chơi nhiều hơn một loại xếp hạng sức mạnh, ví dụ: tiêu đề, đi qua, bắn súng, v.v. Sau đó, bạn sử dụng xếp hạng độ mạnh phù hợp với kịch bản mà họ đang sử dụng.

+0

Cảm ơn bạn! "bạn có nó đi ngược lại: phòng ngự mạnh nhất là một cầu thủ có một cầu thủ rất tốt, giúp anh ấy bất kỳ sự giúp đỡ nào sẽ làm cho nó có nhiều khả năng là điểm số của đội khác." Bạn có thể giải thích chi tiết hơn không? Vì vậy, bạn sẽ có tỷ lệ thay vì sự khác biệt? – caw

+2

Nếu bạn có một người chơi có xếp hạng là 10, trung bình là 10. Thêm người khác có xếp hạng 8 và số người bỏ trung bình (đến 9). Nhưng chỉ định nhiều người hơn để phòng thủ nên làm cho nó mạnh hơn, không yếu hơn. Tỷ lệ có xu hướng tốt hơn so với sự khác biệt, bởi vì chúng hoạt động theo cách có thể dự đoán được với các nhóm có nhiều điểm mạnh khác nhau. – soru

Các vấn đề liên quan