Chơi một trò chơi hoàn hảo của Mu Torere


14

Lý lịch

Mu Torere là một trò chơi là một trong hai trò chơi duy nhất được người Maori ở New Zealand chơi trước khi có ảnh hưởng của châu Âu. Điều này làm cho nó trở thành một trò chơi rất độc đáo ở chỗ nó có "tiêu chí chiến thắng khách quan" và luật chơi khác với hầu hết các trò chơi khác đang tồn tại.

Trò chơi:

Bảng là một hình bát giác. Có các kết nối giữa mỗi đỉnh liền kề và có một nút trung tâm được kết nối với tất cả các đỉnh. Tại bất kỳ thời điểm nào, tám trong số chín nút bị chiếm đóng bởi đá. Khi bắt đầu, có bốn viên đá trắng và bốn viên đá màu đen, mỗi viên đá chiếm một nửa hình bát giác, với nút trung tâm trống. Đen di chuyển trước.

Mỗi lượt, người chơi có thể di chuyển một trong những viên đá của mình dọc theo một trong 16 cạnh từ một nút đến nút trống. Một hòn đá chỉ có thể được di chuyển từ một nút bên ngoài đến nút trung tâm nếu hòn đá nằm cạnh hòn đá của đối thủ.

Một người chơi thua khi anh ta không thể thực hiện một động thái hợp pháp, điều này xảy ra khi không có cạnh nào nối một hòn đá với nút trống.

Một sơ đồ và giải thích các quy tắc

Đây là một trang web giải thích các quy tắc (với một sơ đồ) và cung cấp một số phân tích.

Các thách thức

Thử thách của bạn là viết chương trình ngắn nhất có thể chơi một trò chơi hoàn hảo của Mu Torere trước một đối thủ người. Chương trình của bạn sẽ có thể hiển thị và cập nhật bảng trò chơi, thực hiện di chuyển và nhận di chuyển từ một đối thủ của con người. Quan trọng nhất, nó nên chơi một trò chơi hoàn hảo.

Trò chơi hoàn hảo?

Vâng, trò chơi hoàn hảo. Tôi đã thực hiện một số phân tích trò chơi và tôi thấy rằng trò chơi kéo dài trong một khoảng thời gian vô hạn nếu được chơi hoàn hảo bởi cả hai bên. Điều này có nghĩa là chương trình của bạn sẽ không bao giờ mất. Ngoài ra, chương trình của bạn sẽ có thể buộc một chiến thắng bất cứ khi nào đối thủ của con người phạm sai lầm cho phép chương trình buộc một chiến thắng. Đối với cách chương trình của bạn tìm thấy bước đi hoàn hảo, điều này tùy thuộc vào bạn.

Chi tiết

Sau mỗi lần di chuyển (và khi bắt đầu trò chơi), chương trình của bạn sẽ in bảng trò chơi. Tuy nhiên, bạn chọn hiển thị bảng, nó phải hiển thị tất cả các nút và được kết nối đầy đủ (tất cả 16 đường kết nối phải được vẽ không có đường chéo). Khi bắt đầu, bảng nên có vị trí bắt đầu chính xác. Một cách để thực hiện điều này là bằng cách làm cho bảng trò chơi thành một hình vuông.

w-w-w
|\|/|
b-o-w
|/|\|
b-b-b

Hai màu đen và trắng, hoặc tối / sáng. Bảng phải cho biết các nút nào bị chiếm bởi các mảnh của người chơi, chẳng hạn như đánh dấu chúng bằng "b" hoặc "w" và nút nào bị bỏ trống. Những người tham gia được khuyến khích (nhưng không bắt buộc) để làm cho bảng trò chơi có nhiều đồ họa hơn là văn bản thuần túy.

Bảng trò chơi của bạn nên có một hệ thống đánh số cung cấp cho mỗi nút một số duy nhất. Bạn có thể chọn đánh số bảng theo bất kỳ cách nào bạn thích, nhưng nó sẽ được giải thích trong câu trả lời của bạn hoặc bởi chương trình. Bảng vuông có thể được đánh số như sau:

1-2-3
|\|/|
4-5-6
|/|\|
7-8-9

Con người là người đầu tiên di chuyển. Đầu vào của anh ấy sẽ là một số duy nhất. Đây sẽ là số nút nơi đá di chuyển hiện tại. Nếu tôi muốn di chuyển một hòn đá từ nút 4 sang nút 5 trống, tôi sẽ gõ a 4. 5 được ngụ ý vì nó là nút trống duy nhất.

Giả sử rằng con người sẽ luôn luôn thực hiện một động thái hợp pháp.

Sau khi con người thực hiện di chuyển của mình, một bảng cập nhật nên được in. Sau khi chương trình của bạn quyết định di chuyển hợp pháp, nó sẽ in một bảng cập nhật khác, và sau đó đợi con người bước vào một động thái khác.

Chương trình của bạn nên chấm dứt một khi nó đã thắng.

Ghi chú

Áp dụng quy tắc golf tiêu chuẩn, không truy cập các tệp bên ngoài, v.v. Ngoài ra, tôi sẽ áp dụng giới hạn thời gian linh hoạt là 15 giây (trên một máy hợp lý) để chương trình của bạn thực hiện từng bước di chuyển. Như đã nói, trò chơi này có khả năng hình thành các vòng lặp vô hạn và tôi không muốn một tìm kiếm đầu tiên đi sâu vào một vòng lặp vô hạn.


2
Thử thách lớn. Chỉ "Nếu con người nhập vào một động thái bất hợp pháp, thì chương trình của bạn sẽ chờ và cho phép anh ta nhập một động thái khác." đối với tôi có vẻ hơi phi golf: chúng ta không thể để hành vi không xác định trong trường hợp đầu vào bất hợp pháp?
đã ngừng quay ngược chiều

1
Tôi đã đưa ra yêu cầu đó vào phút cuối và tôi đoán sẽ ổn nếu chúng ta loại bỏ nó. Điều đó chỉ làm cho con người trở nên khó khăn hơn, người đã cam chịu không chiến thắng. :)
PhiNotPi

1
Nó không phải khó để luôn nhập một động thái pháp lý ... Bằng cách này, sau khi phân tích khá chi tiết Tôi nghĩ đó là không cần thiết để tìm kiếm hơn 1,5 di chuyển về phía trước. Cho dù cách tiếp cận đó là ngắn nhất là một câu hỏi khác.
Peter Taylor

3
Trang web được liên kết không còn khả dụng nữa, tốt hơn là thay đổi nó thành liên kết thành phiên bản lưu trữ.
Kiểm đếm

Câu trả lời:


6

Ruby, 390 ký tự

o=->s,c{f=s=~/o/;[*0..8].select{|t|s[t]==c&&(t<1||(t+6)%8+1==f||t%8+1==f||f<1&&(s[(t+6)%8+1]!=c||s[t%8+1]!=c))}.map{|t|k=s*1;k[f]=c;k[t]=?o;k}}
v=->s,c,h{f=o[s,c];f==[]?0:h<1?1:2-f.map{|t|v[t,c>?b??b:?w,h-1]}.min}
q=->g{puts"1-2-3\n|\\|/|\n8-0-4\n|/|\\|\n7-6-5\n".tr"0-8",g;$>.flush}
q[g="obbbbwwww"]
(g.tr!?o,?b;g[gets.to_i]=?o;q[g];q[g=o[g,?w].sort_by{|q|v[q,?w,5]}[-1]])while v[g,?b,5]>0

Một triển khai trong ruby ​​trực tiếp tính toán cây trò chơi (cần khá nhiều mã) và do đó luôn chơi tối ưu. Các vị trí bảng đang xoắn ốc ra bên ngoài như thể hiện trong hình sau:

1 - 2 - 3
| \ | / |
8 - 0 - 4
| / | \ |
7 - 6 - 5

5

bash và bạn bè ( 463 447 ký tự)

t(){ tr 0-8a-i $b$b
}
p(){ t<<E
0-1-2
|\|/|
3-4-5
|/|\|
6-7-8

E
}
g(){ b=`tr $x$e $e$x<<<012345678|t`
p
e=$x
}
b=bbbbowwww
e=4
m=0
p
while [ $m != 5 ]&&read x;do
g
m=0
for y in {0..8};do
s=0
S=05011234
grep -E "w.*($y$e|$e$y)"<<<${b:$y:1}30125876340142548746>/dev/null&&for p in wow.\*/ww wow.\*/w bbo.\*/b obb.\*/b www wbw .
do
((s++))
tr $y$e $e$y<<<3012587630/4e|t|grep $p>/dev/null&&break
done
s=${S:$s:1}
[ $s -gt $m ]&&m=$s x=$y
done
g
done

Con người chơi như b, máy tính như w. Vị trí bảng được đánh số như trong tài liệu ở đây ở trên cùng. Nó chỉ ra rằng các heuristic để chơi một trò chơi hoàn hảo là đơn giản đáng ngạc nhiên.

Mặt khác, đi xuống con đường thú vị là khá khó khăn. http://ideone.com/sXJPy chứng minh sự tự tử ngắn nhất có thể chống lại bot này. Lưu ý rằng thêm 0 ở cuối là để kiểm tra xem nó có thoát ra khỏi vòng lặp một cách chính xác không.


NB Tôi có thể lưu một ký tự bằng cách read xbắt buộc, nhưng điều đó sẽ khiến việc kiểm tra khá bực bội. Tôi cũng có thể cứu một nhân vật bằng cách xóa dòng trống sau bảng, nhưng ...
Peter Taylor
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.