Thua tại tic-tac-toe


18

Viết một chương trình mà một người sẽ chơi một trò chơi Misère tic-tac-toe. Đó là, mục tiêu là buộc đối thủ của bạn phải mất ba liên tiếp.

Chấp nhận đầu vào tiêu chuẩn là 'X' hoặc 'O' (chữ cái, không phải không), để xác định chương trình nào sẽ được phát ở bên nào. Sau đó xuất một chữ số cho lần di chuyển của bạn trong lượt của bạn và đọc một chữ số trên lượt của đối thủ cho đến khi trò chơi kết thúc (X luôn đi trước). Khi một người chiến thắng được quyết định, hãy xuất X hoặc O cho ai thắng hoặc D cho một trận hòa. Ví dụ: nếu O được 3 liên tiếp, X thắng.

Giả sử bảng được đánh số như vậy:

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

Lý tưởng nhất là một giải pháp sẽ tối ưu và không bao giờ mất. Giống như tic-tac-toe, chơi hoàn hảo sẽ luôn dẫn đến kết quả hòa. Nếu giao thức trên được tuân thủ, tôi có thể tự động kiểm tra đệ trình dựa trên nhiều chiến lược có thể.

Người chiến thắng là mã ngắn nhất. điểm thưởng nếu nó chọn ngẫu nhiên từ các động tác tốt như nhau để làm cho nó khó đoán hơn một chút.

Câu trả lời:


10

Python, 383 ký tự

M=[21,1344,86016,4161,16644,66576,65793,4368]
X=lambda B,k:any(m*k==B&m*3for m in M)
def S(B):
 if X(B,2):return 1,
 M=[i for i in range(0,18,2)if B>>i&3<2]
 return max((-S((B|3<<i)^87381)[0],i)for i in M)if M else(0,)
r='D'
c=ord(raw_input())&1
B=0
for i in range(9):
 if i&1==c:m=S(B^c*87381)[1];print m/2;B|=3-c<<m
 else:
  B|=2+c<<input()*2
  if X(B,2+c):r='XO'[c];break
print r

Bảng Bđược biểu diễn dưới dạng một số nguyên sử dụng hai bit trên mỗi ô vuông, 0001đại diện cho trống, 10đại diện cho O và 11đại diện cho X. Mlà một tập hợp các bitmas với 01các điểm của một bộ ba mất ( 21= 0b010101= hàng trên cùng, v.v.) sẽ Xtính nếu có mất gấp ba cho khiện diện trên một bảng. Sthực hiện tìm kiếm minimax cho một nước đi tối ưu cho X, trả về một cặp điểm số (1 = thắng, -1 = thua, 0 = hòa) và chỉ số vuông. ^87381(= ^0b010101010101010101) lật X và O trong khi vẫn giữ nguyên các ô vuông trống.

Máy tính không bao giờ bị mất, vì vậy tôi không cần đưa vào kiểm tra đó :).

Có lẽ có một thuật toán dựa trên quy tắc dễ dàng / ngắn hơn ngoài kia, nhưng điều này hoạt động.


Lén lút lén lút phù thủy bitwise +1
Rohan Jhunjhunwala
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.