Hãy chơi một trò chơi Meta tic-tac-toe!
Đây là một giải đấu vua của Meta tic-tac-toe. Các quy tắc của Meta tic-tac-toe như sau:
Tất cả các quy tắc thông thường của tic-tac-toe áp dụng.
Có chín bảng được sắp xếp để làm một bảng tổng thể. Thích như vậy:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
bảng 0 đề cập đến bảng trên cùng bên trái, bảng 1 đề cập đến bảng giữa trên cùng ... như thế này
0|1|2 ----- 3|4|5 ----- 6|7|8
Nếu tôi nói bảng 3, gạch 4, có nghĩa là gạch trung tâm của bảng ở giữa bên trái.
Bạn chỉ được phép di chuyển trong một trong những bảng nhỏ hơn.
Nếu bạn giành được một trong những bảng nhỏ hơn, toàn bộ bảng đó được tính là ô của bạn.
Nếu một trong các bảng trở nên đầy trước khi một trong hai bot giành được nó, nó sẽ được tính là gạch quý tộc.
Ai thắng bảng chủ sẽ thắng!
Tuy nhiên, có một bước ngoặt quan trọng. Giả sử tôi đi ở ván 7, ô 2. Điều đó có nghĩa là đến lượt của bạn, bạn chỉ có thể đi ở ván 2. Sau đó, giả sử bạn đi ở ván 2, ô 5. Bây giờ đến lượt tôi, tôi chỉ có thể đi ở ván 5. Hãy nói rằng bảng 1 đã đầy. (Không còn vị trí nào nữa, hoặc một trong số chúng tôi đã giành được bảng 1) Bây giờ nếu tôi vào bảng 5, ô 1, bạn có thể vào bất kỳ bảng nào bạn muốn.
Những quy tắc này có thể được coi là:
- Bạn phải chơi trong bảng tương ứng với vị trí mà người chơi trước đó đã chơi.
- Nếu X chơi ở bảng 2, ô 5; O phải chơi ở ván 5
- Nếu bảng mục tiêu đã đầy (hòa) hoặc đã có người chiến thắng, bước tiếp theo sẽ không bị ràng buộc.
- Một bảng với một người chiến thắng có thể không được chơi, ngay cả khi di chuyển không bị ràng buộc.
Nếu điều này hơi khó hiểu, bạn có thể thử trực tuyến tại đây. (đảm bảo chuyển từ "gạch đầu tiên thắng" sang "3 gạch liên tiếp")
Bây giờ đây là các quy tắc của thách thức.
Bạn phải viết một bot chơi trò chơi này.
Bot 1 là Xs, và nó phải đi trước. Nó sẽ được gọi với các đối số dòng lệnh này (không có nội dung trong ngoặc đơn):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Nhân vật đầu tiên đại diện cho bot là ai. Trong trường hợp này, bot 1 đóng vai trò X. 9 dòng tiếp theo đề cập đến 9 bảng. Dòng thứ 11 đề cập đến bảng tổng thể. "Xx" là bước cuối cùng. Bây giờ, bot1 phải in hai số từ 0 đến 8. Số 1 là bảng mà bot của bạn đang di chuyển và số 2 là ô trong bảng đã nói. Bộ điều khiển sẽ theo dõi di chuyển này. Giả sử bot 1 in 38. Bây giờ bảng sẽ trông như thế này:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
và bot2 sẽ được gọi với các đối số sau:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Bây giờ bot 2 phải di chuyển trong bảng 8 (vì bot1 đã đặt x trong ô 3). Giả sử bot2 in 84. Bây giờ bảng trông như thế này.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
bây giờ bot1 sẽ được gọi với các đối số sau:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Bây giờ bot1 phải di chuyển trong bảng 4. Tuy nhiên, bot1 là một bot nhỏ nghịch ngợm và quyết định chuyển sang bảng 3. Nó in '30'. Hội đồng quản trị không thay đổi gì cả. Các bot chủ theo dõi điều này. Bây giờ bot2 sẽ được gọi với các đối số sau:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Bây giờ bot 2 có thể đi bất cứ nơi nào nó muốn (tất nhiên trừ 38 và 84). Điều này tiếp tục cho đến khi ai đó giành được 3 trong số các bảng tổng thể liên tiếp. Sau đó, có một trận đấu thứ hai trong đó bot2 là X và được đi trước.
Điều này lặp lại cho đến khi mọi bot duy nhất đã chơi mọi bot khác.
Chấm điểm
Việc tính điểm như thế này:
Người chiến thắng trong mỗi trận đấu được 100 + number of open spots
điểm. Bằng cách đó, nó có giá trị hơn nếu bot của bạn thắng nhanh chóng. Mỗi khi bot của bạn thực hiện một động thái không hợp lệ, nó sẽ mất 1 điểm. Nếu sau 250 vòng, không bot nào thắng, mỗi bot mất 10 điểm và chúng ta tiếp tục vào vòng tiếp theo.
Mọi thứ sẽ được đưa vào một thư mục chứa
Bộ điều khiển bot. Đây là một chương trình C ++ mà tôi đã viết. Bạn có thể xem mã nguồn bot điều khiển ở đây. Vui lòng cho tôi biết nếu bạn thấy điều gì đó không đúng với bộ điều khiển.
Một tệp văn bản có tên
instructions.txt
Tệp này sẽ trông giống như thế này:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Một thư mục cho mỗi bot. Thư mục này sẽ giữ chương trình của bạn (Cho dù đó là tập lệnh hay tệp nhị phân) và MỘT tệp văn bản có tên
data.txt
là bot của bạn có thể đọc và viết bất cứ điều gì nó muốn.
Thông số kỹ thuật và làm rõ quy tắc
Bất kỳ bot nào cố gắng đọc / ghi một cái gì đó từ bất cứ nơi nào không có trong thư mục của nó sẽ bị đá khỏi trò chơi.
Chương trình của bạn phải có khả năng chạy trên macbook chạy Yosemite. Các ngôn ngữ hiện được hỗ trợ là python (2.7.9 và 3.4.2), C / C ++, object-C, perl, ruby, bash, PHP, Java, C #, javascript và Haskell. Còn nhiều điều nữa, nhưng đây chỉ là những thứ tôi có thể nghĩ ra ngay bây giờ. Tôi sẽ thêm nhiều hơn khi thời gian trôi qua. Nếu bạn muốn cạnh tranh bằng một ngôn ngữ cụ thể, hãy nhắn tin cho tôi hoặc nhận xét và tôi sẽ thêm nó vào danh sách nếu có thể.
Nếu một bảng được giành chiến thắng, nhưng vẫn còn không gian, bạn vẫn không thể di chuyển vào một trong những điểm mở.
Lưu ý rằng thư mục làm việc của trình của bạn sẽ là thư mục chứa bộ điều khiển và tất cả các bot khác, KHÔNG phải là thư mục chứa bot của bạn.
Vui lòng gửi cùng với mã bot điều khiển của bạn lệnh chính xác để biên dịch (nếu có) và để chạy bot của bạn. Hầu hết điều này sẽ được thực hiện từ thiết bị đầu cuối OS X, khá giống với thiết bị đầu cuối linux.
Bots phải hoàn thành trong một giây. Thật không may, tôi không đủ năng lực để thêm bộ đếm thời gian vào bot điều khiển. Tuy nhiên, tôi sẽ tự tay thời gian các bot.
Các kết quả!
Vâng, tôi đã đúng. Tôi quên làm cho bộ điều khiển bot kiểm tra xem masterBoard đã đầy chưa. Nếu masterBoard đã đầy, thì MỌI di chuyển không hợp lệ, nhưng nó vẫn tiếp tục gọi các bot, đó có thể là lý do tại sao có quá nhiều di chuyển không hợp lệ. Tôi đã sửa nó ngay bây giờ. Dưới đây là kết quả chính thức với phiên bản mới nhất của tất cả các bot.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot là nhà vô địch trị vì! Ít nhất, cho ngay bây giờ.
XXX000---
được truyền đi? hoặc là "không ai có được nó mặc dù O đã giành được nó trước"?