Camel Up Cup: Một giải đấu trò chơi bảng AI


11

Lạc đà Cup 2k18

Trong thử thách này, chúng tôi sẽ chơi trò chơi cờ bán phổ biến Camel Up.

Lạc đà lên! là một trò chơi cờ có người chơi đặt cược vào lạc đà để giành chiến thắng, thắng trò chơi hoặc thua trò chơi, đặt bẫy để ảnh hưởng đến chuyển động hoặc di chuyển một con lạc đà. Mỗi quyết định này thưởng cho bạn cơ hội nhận được một số tiền, đó là điều quyết định người chiến thắng. Người chơi nên sử dụng xác suất, cân nhắc trạng thái trò chơi và thuê nhà của đối thủ để đưa ra quyết định. Dưới đây là một đoạn video ngắn chỉ cho người chơi cách chơi .

Cách chơi

Đây là một ý tưởng sơ bộ về cách chơi. Xem một trong những video có thể hữu ích hơn vì chúng có hình ảnh :)

Đến lượt bạn, bạn có 4 lựa chọn.

  1. Di chuyển một con lạc đà. Điều này chọn một con lạc đà từ những người không di chuyển và di chuyển nó giữa 1-3 không gian. Bạn nhận được 1 xu. Vòng kết thúc khi tất cả năm con lạc đà đã di chuyển, sau đó tất cả chúng có thể di chuyển
  2. Đặt một cái bẫy. Điều này đi trên bảng cho đến khi kết thúc vòng. Bạn chọn bẫy + 1 / -1. Nếu một con lạc đà hoặc con lạc đà đậu trên nó, chúng di chuyển + 1 / -1 và bạn nhận được một đồng xu. Bạn không thể đặt bẫy trên ô vuông 0. Bạn có thể đặt bẫy ở nơi có lạc đà, mặc dù nó sẽ chỉ ảnh hưởng đến lạc đà đậu trên nó sau đó.
  3. Đặt cược thắng vòng. Bạn đặt cược vào một người chiến thắng vòng. Họ thắng bạn nhận được 5/3/2/1 tùy thuộc vào việc bạn có phải là 1/2 / 3 để đặt cược vào con lạc đà đó hay không.
  4. Người chiến thắng trò chơi / kẻ thua cuộc. Bạn đặt cược vào người sẽ ở vị trí đầu tiên hoặc cuối cùng vào cuối trò chơi. bạn nhận được 8/5/3/1/1 (tôi nghĩ) dựa trên việc bạn là 1/2 / 3/3 / etc để đặt cược vào con lạc đà đó

Ghi chú:

  • Có 5 con lạc đà. Họ bắt đầu vào một vị trí ngẫu nhiên từ 0-2.
  • Khi một con lạc đà được di chuyển (xem ở trên để biết điều gì kích hoạt điều này) chúng di chuyển 1-3 hình vuông. Nếu chúng được đặt trên một hình vuông với một con lạc đà khác, chúng sẽ được đặt "trên đỉnh" của con kia, tạo ra một chồng lạc đà. Nếu một con lạc đà là để di chuyển nó sẽ di chuyển tất cả các con lạc đà trên nó trên chồng lạc đà. Lạc đà ở đầu ngăn xếp được coi là dẫn đầu
  • Nếu bạn rơi vào bẫy +1 (xem bên trên để biết điều gì kích hoạt điều này), bạn sẽ di chuyển một hình vuông về phía trước. Quy tắc xếp chồng tiêu chuẩn được áp dụng.
  • Tuy nhiên, nếu bạn nhấn bẫy -1, bạn di chuyển một hình vuông về phía sau. Bạn đi dưới đống lạc đà trên hình vuông đó, nếu có.
  • Trò chơi kết thúc khi một con lạc đà chạm vào quảng trường 16. Điều này ngay lập tức gọi kết thúc vòng và kích hoạt kết thúc trò chơi
  • Đặt cược người thắng / thua người chơi chỉ có thể được thực hiện một lần cho mỗi con lạc đà. Tức là bạn không thể đặt cược vào một con lạc đà để thắng thua trò chơi

Thử thách

Trong thử thách này, bạn sẽ viết chương trình Python 3 để chơi bốn người chơi, người chiến thắng sẽ chơi tất cả trò chơi vinh quang của Camel Up

Chương trình của bạn sẽ nhận được gamestate, bao gồm:

  • camel_track : với vị trí của lạc đà
  • bẫy_track : với vị trí của bẫy (mục nhập của biểu mẫu [bẫy_type (-1,1), người chơi])
  • player_has_places_trap : một mảng cho bạn biết nếu người chơi đã đặt bẫy vòng này
  • round_bets : một loạt các cược được đặt vòng này. Có dạng [lạc đà, người chơi]
  • game_winner_bets / game_loser_bets : mảng các cược mà người chơi đặt cho lạc đà để thắng hoặc thua trò chơi. Bạn sẽ chỉ có thể thấy giá trị của những người chơi đã đặt cược chứ không phải người mà họ đặt cược. Bạn có thể biết bạn đặt cược vào ai. #of mẫu [lạc đà, người chơi]
  • player_game_bets : một đại diện khác của game_winner_bets / game_loser_bets. Một lần nữa, chỉ nhìn vào các cược mà bot của bạn thực hiện.
  • player_money_values : một mảng hiển thị số tiền mỗi người chơi có.
  • camel_yet_to_move : Một mảng hiển thị nếu một con lạc đà đã di chuyển vòng này.

Trên đầu trò chơi, bạn cũng nhận được:

  • người chơi : một số nguyên cho bạn biết bạn là số người chơi nào (0-3).

Cú pháp cho những gì người chơi nên trả lại là:

  • [0]: Di chuyển lạc đà
  • [1, bẫy_type, bẫy_location]: Đặt bẫy
  • [2, projected_round_winner]: Đặt cược cho người chiến thắng vòng
  • [3, projected_game_winner]: Đặt cược cho người chiến thắng trò chơi
  • [4, projected_game_loser]: Đặt cược cho người thua trò chơi

Điều này nên được gói trong một phương thức di chuyển (người chơi, gamestate)

Chẳng hạn, đây là một người chơi sẽ đặt cược cho người chiến thắng vòng nếu họ ở vị trí cuối cùng. Nếu họ không thì họ sẽ đặt một cái bẫy trên một hình vuông ngẫu nhiên.

class Player1(PlayerInterface):
     def move(player,g):
         if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

Trò chơi được chọn vì nhiều lý do: nó có một nhóm tùy chọn tương đối nhỏ để chọn (khoảng 20 lựa chọn mỗi lượt, dễ dàng thu hẹp xuống còn khoảng 3-4), các trò chơi ngắn và có yếu tố may mắn (làm cho nó vì vậy ngay cả các bot "xấu" cũng có thể giành chiến thắng).

Trò chơi

Người chạy giải đấu có thể được tìm thấy ở đây: lạc đà-cup . Chạy camelup.pyđể chạy một giải đấu hoặc chức năng PlayGame để chạy trò chơi. Tôi sẽ giữ cho kho lưu trữ được cập nhật với các bài nộp mới. Chương trình ví dụ có thể được tìm thấy trong players.py.

Một giải đấu bao gồm 100 trò chơi trên 10 người chơi (làm tròn số, vì vậy 14 người chơi có nghĩa là 200 trò chơi). Mỗi trò chơi sẽ có bốn người chơi ngẫu nhiên được chọn từ nhóm người chơi để điền vào bốn vị trí. Người chơi sẽ không thể tham gia trò chơi hai lần.

Chấm điểm

Người chiến thắng trong mỗi trò chơi là người chơi có nhiều tiền nhất vào cuối trò chơi. Trong trường hợp hòa vào cuối trò chơi, tất cả người chơi có số tiền tối đa sẽ được thưởng một điểm. Người chơi có nhiều điểm nhất khi kết thúc giải đấu sẽ thắng. Tôi sẽ đăng điểm khi tôi chạy các trò chơi.

Các cầu thủ được gửi sẽ được thêm vào hồ bơi. Tôi đã thêm ba bot thực sự ngu ngốc và một bot mà tôi đã thực hiện để bắt đầu.

Hãy cẩn thận

Không sửa đổi các đầu vào. Không cố gắng ảnh hưởng đến việc thực hiện bất kỳ chương trình nào khác, ngoại trừ thông qua hợp tác hoặc đào thoát. Không thực hiện một đệ trình hy sinh mà cố gắng nhận ra một đệ trình khác và mang lại lợi ích cho đối thủ bằng chi phí riêng của mình. Sơ hở tiêu chuẩn bị cấm.

Giới hạn thời gian thực hiện bởi bot của bạn là ~ 10 giây mỗi lượt.

Đệ trình không được lặp lại đệ trình trước đó.

Vui lòng không xem đặt cược game_winner hoặc game_loser từ những người chơi khác. Nó khá dễ làm nhưng vẫn gian lận.

Nếu bạn có bất kỳ câu hỏi, hãy hỏi.

Chiến thắng

Cuộc thi sẽ mở vô thời hạn, vì các bài nộp mới được đăng. Tuy nhiên, tôi sẽ tuyên bố một người chiến thắng (chấp nhận câu trả lời) dựa trên kết quả một tháng sau khi câu hỏi này được đăng (ngày 20 tháng 7).

Các kết quả

Player0: 12
Player1: 0
Player2: 1
Sir_Humpfree_Bogart: 87

Có lẽ tôi đã đọc qua nó, nhưng có bao nhiêu lạc đà đang chơi? Ngoài ra, họ phải đi bao nhiêu ô vuông để sang bên kia? Dựa trên mã GitHub của bạn, tôi khá chắc chắn đó là 5 con lạc đà và 25 ô vuông, nhưng tôi không thấy điều này được đề cập trong phần mô tả thử thách. Đối với việc đặt cược, chúng ta có thể đặt cược bất kỳ số tiền nào không, hoặc nó sẽ đặt cược theo mặc định? Chúng ta có giới hạn chi tiêu, hoặc chúng ta có thể đặt cược mỗi vòng vô thời hạn không? Đối với người chơi di chuyển một con lạc đà, con lạc đà nào được di chuyển? Con lạc đà với người chơi phù hợp của bạn-nr? Nếu có, tại sao có 4 người chơi nhưng 5 con lạc đà?
Kevin Cruijssen

1
Sẽ thật hoàn hảo khi có câu trả lời của Perl
chàng ngẫu nhiên

Chào mừng đến với PPCG!
admBorkBork

100 trò chơi trên 10 người chơi có vẻ IMO khá thấp, đặc biệt là với một trò chơi có quá nhiều sự ngẫu nhiên
Nathan Merrill

1
@AdmBorkBork Cảm ơn bạn! Tôi mới làm điều này vì vậy chào mừng tất cả các con trỏ. Điều này hoạt động tốt trong cuộc sống thực - đã sẵn sàng để xem cách nó diễn ra ở đây
Tyler Barron

Câu trả lời:


1

Sir_Humpfree_Bogart.py

Đây là một bot tôi đã làm cho Giải đấu Camel Up Cup .

Đầu tiên, họ xem xét tất cả các cấu hình có thể có mà lạc đà có thể kết thúc vào cuối vòng. Sau đó, họ xác định giá trị dự kiến ​​của việc đặt cược vào một con lạc đà chiến thắng vòng đấu bằng cách sử dụng

EV_roundwin = (chance_1st)*(payout) + (chance_2nd)*(payout) - (chance_3rd_or_worse)*(cost)

Sau đó, họ di chuyển lạc đà ngẫu nhiên cho đến khi một con lạc đà chiến thắng. Sau khi làm điều này vài nghìn lần, bạn có thể ước tính cơ hội mỗi con lạc đà sẽ thắng và thua. Một lần nữa, chúng tôi nhận được giá trị mong đợi của việc sử dụng

EV_gamewin = (chance_1st)*(payout) - (chance_2nd_or_worse)*(cost)

Các lựa chọn duy nhất khác là di chuyển một con lạc đà (luôn mang lại một đồng xu, vì vậy giá trị mong đợi của nó là một) và đặt bẫy. Cả hai đội cảm thấy đặt bẫy là một lựa chọn đủ yếu để bỏ qua hoàn toàn. Với thông tin này, các bot đã chọn tùy chọn có giá trị mong đợi cao nhất.

Vì giải đấu đã xem vị trí thứ hai kết thúc giống như kết thúc ở vị trí cuối cùng nên sẽ rất hợp lý nếu bạn ở phía sau để có cơ hội vào vị trí thứ nhất. SBH đã sử dụng distance_from_first_place và nearness_to_end để xác định mức độ rủi ro của bot, nếu bạn ở xa đầu và gần cuối thì rủi ro sẽ cao và nếu bạn ở đầu hoặc xa cuối trò chơi thì rủi ro sẽ thấp . Với mức độ rủi ro thấp, bot sẽ quyết định một hành động với tùy chọn có giá trị kỳ vọng cao và mức độ rủi ro cao mang lại tùy chọn có độ giật cao. Phương trình chính xác là

Functional_EV = EV + (upshot-EV) * riskiness

trong đó upshot là khoản thanh toán cao nhất bạn có thể nhận được từ một quyết định và rủi ro nằm trong khoảng từ 0 đến 1.


0

players.py

Đây là những bot cực kỳ ngu ngốc để đưa giải đấu đi. Chúng gần như không có logic nhưng hoạt động như các khung để mọi người sử dụng

import random
import math
from playerinterface import PlayerInterface

class Player0(PlayerInterface):
    def move(player,g):
        #This dumb player always moves a camel
        return [0]

class Player1(PlayerInterface):
    def move(player,g):
        #This player is less dumb. If they have the least amount of money they'll make a round winner bet
        #If they aren't in last then they'll place a trap on a random square. Still p dumb though
        if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

class Player2(PlayerInterface):
    def move(player,g):
        #This dumb player always makes a round winner bet
        return [2,random.randint(0,len(g.camels)-1)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.