Đó là Giáng sinh vào tháng 7, vì vậy cách nào tốt hơn để ăn mừng hơn là trao đổi quà tặng voi trắng ảo!
Đối với thử thách King of the Hill này, bạn phải tạo một bot chơi trong mô phỏng trao đổi Voi Trắng , cố gắng có được món quà có giá trị cao nhất có thể.
Luật chơi
- Trò chơi sẽ được chơi qua nhiều vòng, mỗi vòng được tạo thành từ một số lượt khác nhau.
- Thiết lập vòng : Sẽ có nhiều quà như người chơi trong trò chơi, mỗi người được định giá ngẫu nhiên trong phạm vi [0 ... 1), với giá trị này không xác định cho đến khi hiện tại được "mở". Người chơi sẽ được sắp xếp theo thứ tự ngẫu nhiên trong hàng đợi. Người chơi đầu tiên sẽ xuất hiện từ phía trước hàng đợi.
- Khi đến lượt của người chơi, họ có thể mở một món quà hoặc ăn cắp món quà của người chơi khác, chuyển qua cho người chơi có món quà bị đánh cắp.
- Mỗi món quà có thể bị đánh cắp tới 3 lần.
- Bạn không thể đánh cắp từ người chơi vừa đánh cắp bạn.
- Mỗi người chơi chỉ có thể có một món quà tại một thời điểm.
- Sau khi một món quà được mở ra, chơi tiến tới người chơi tiếp theo xuất hiện từ phía trước hàng đợi. Đây sẽ là người chơi tiếp theo theo thứ tự lần lượt chưa có lượt.
- Kết thúc vòng : Khi tất cả các món quà đã được mở, vòng kết thúc và giá trị của món quà mà mỗi người chơi nắm giữ sẽ được thêm vào điểm của người chơi đó. Một vòng chơi mới bắt đầu, với mỗi người chơi hiện không có quà và thứ tự người chơi bị xáo trộn.
- Kết thúc trò chơi : Trò chơi sẽ kết thúc khi có ít nhất một người chơi đạt được
100500 điểm, với chiến thắng được trao cho người chơi có tổng giá trị quà tặng cao nhất.
Mã hóa
Tất cả các đệ trình phải tương thích với Python 3.7. Bạn phải viết một lớp kế thừa trực tiếp WhiteElephantBot
. Ví dụ:
class FooBot(WhiteElephantBot):
# Your implementation here
Bạn có thể cung cấp một __init__
phương thức (lấy một đối số name
) trong lớp bot của bạn, mà phải gọi super().__init__(name)
. Lớp của bạn phải có một take_turn
phương thức mong đợi các đối số sau theo thứ tự này:
players
: Danh sách tên người chơi, theo thứ tự lần lượt, của tất cả người chơi chưa có quà.presents
: Một từ điển ánh xạ tên người chơi thành 2 tuple chứa giá trị hiện tại mà người chơi đó nắm giữ và số lần hiện tại đã bị đánh cắp. Điều này sẽ chỉ bao gồm những người chơi khác hiện đang giữ quà.just_stole
: Nếu hành động cuối cùng được thực hiện là đánh cắp, đây sẽ là tên của người chơi vừa đánh cắp. Nếu không, nó sẽ đượcNone
.
Mỗi đối số sẽ là bất biến hoặc một đối tượng mới để việc biến đổi bất kỳ trong số chúng sẽ không có ảnh hưởng đến trò chơi. Bạn có thể giữ một bản sao của bất kỳ đối số nào nếu bạn mong muốn.
Một giá trị mẫu cho presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
take_turn
Phương pháp của bạn sẽ trả lại tên của người chơi mà bạn muốn đánh cắp hoặc None
để mở một món quà. Nếu nó phát sinh một ngoại lệ, trả về một cái gì đó không phải là str
hoặc None
hoặc tên của một người chơi mà bạn không thể đánh cắp, bạn sẽ mở một món quà theo mặc định.
Nhà xây dựng của bạn sẽ được gọi vào đầu mỗi vòng, vì vậy bạn không cần nhớ trạng thái từ vòng này sang vòng khác.
Bằng cách kế thừa từ WhiteElephantBot
, bạn sẽ có quyền truy cập vào một steal_targets
phương thức sẽ đưa quà ra lệnh just_stole
và trả lại danh sách tên người chơi bạn có thể đánh cắp.
Bất kỳ mô-đun nào mà kịch bản của bạn cần phải được nhập ở đầu mục nhập của bạn.
Lái thử
Trình điều khiển thử nghiệm có thể được tìm thấy ở đây . Bạn không cần đưa from white_elephant import WhiteElephantBot
vào câu trả lời đã đăng của mình, tuy nhiên một mô-đun cục bộ sẽ cần phải làm điều đó.
Đối thủ cạnh tranh cơ bản
- Ngẫu nhiên : Chọn ngẫu nhiên để mở một món quà mới hay để ăn cắp, với mục tiêu ăn cắp được chọn ngẫu nhiên.
- Tham lam : đánh cắp món quà giá trị nhất có thể bị đánh cắp. Nếu không có món quà nào có thể bị đánh cắp, hãy mở một món quà.
- Nice : Luôn mở một món quà mới. Không bao giờ đánh cắp.
Quy tắc bổ sung
- Bạn có trách nhiệm bắt tất cả các ngoại lệ. Nếu lớp của bạn không bắt được một ngoại lệ, nó sẽ bị loại. Ngoài ra, vui lòng không bắt bàn phím.
- Không sử dụng tệp hoặc phương pháp khác để bỏ qua việc không thể lưu trạng thái giữa các trò chơi. Ví dụ, bạn không thể lưu trạng thái mạng thần kinh vào một tệp giữa chừng.
- Bot của bạn phải được chứa trong mã lớp và các hằng số liên quan.
- Bạn chỉ có thể sử dụng nhập thư viện tiêu chuẩn.
- Không có yêu cầu thực hiện nghiêm ngặt. Hãy hợp lý và thận trọng. Nếu hiệu suất trở thành một vấn đề, tôi bảo lưu quyền thêm giới hạn thời gian.
Một mục nhập mỗi người.Nếu bạn gửi nhiều mục, bot của bạn có thể không hoạt động cùng nhau. Bây giờ tôi sẽ cho phép nhiều mục nhập cho mỗi người, mặc dù tôi có thể sửa lại nó sau nếu nó trở thành vấn đề.- Đây là một cuộc thi mở không có ngày kết thúc khác biệt. Nó sẽ được chạy lại bất cứ lúc nào tôi có thể khi có những thay đổi đáng kể.
EDIT1: Thay đổi điểm chiến thắng từ 100 đến 500 để thứ hạng phù hợp hơn. Trình điều khiển thử nghiệm có một lỗi mới và cũng phản ánh sự thay đổi điểm số chiến thắng.
EDIT2: Làm rõ lưu ý về nhập khẩu bắt buộc.
Bảng xếp hạng (kể từ ngày 8 tháng 8 năm 2018)
- MẫuBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- Tham lam (438.520)
- SecondPlaceBot (430.598)
- NgưỡngBot (390.480)
- Con bạc (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)