Tic-tac-toe'de kaybetmek


18

Bir Misère tic-tac-toe oyunu oynayacak bir program yazın. Yani, hedef rakibinizi arka arkaya üç tane almaya zorlamak.

Programın hangi tarafta oynayacağını belirlemek için standart girişte 'X' veya 'O' (sıfır değil, harf) kabul edin. Daha sonra sıradaki hamleniz için tek bir rakam girin ve oyun bitene kadar rakiplerinizin dönüşünde tek bir rakam okuyun (X her zaman önce gelir). Bir kazanan belirlendiğinde, kazanan için X veya O veya beraberlik için D çıktı. Örneğin, O arka arkaya 3 alırsa, X kazanır.

Kartın şöyle numaralandığını varsayın:

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

İdeal olarak bir çözüm optimal olacaktır ve asla kaybetmeyecektir. Tic-Toe gibi, mükemmel oyun her zaman berabere sonuçlanmalıdır. Yukarıdaki protokole uyulursa, gönderimleri çeşitli olası stratejilere karşı otomatik olarak test edebilirim.

Kazanan en kısa kod. biraz daha tahmin edilemez hale getirmek için eşit derecede iyi hareketlerden rastgele seçerse bonus puanlar.

Yanıtlar:


10

Python, 383 karakter

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

Tahta B, kare başına iki bit kullanılarak bir tamsayı olarak temsil edilir 00ve 01boş temsil 10O temsil eden 11X temsil Msahip bir bit maskesi bir dizi olan 01bir kaybetme üçlü (arasında noktalar 21= 0b010101vb = üst sıra) Xbir kaybetme halinde Hesaplamalar ktahta için üçlü mevcuttur. Sminimax, X için en uygun hareketi arar, bir çift skor (1 = galibiyet, -1 = kaybet, 0 = berabere) ve bir kare endeksi döndürür. ^87381(= ^0b010101010101010101) boş kareleri değiştirmeden X ve O'yu çevirir.

Bilgisayar asla kaybetmez, bu yüzden bu kontrolü dahil etmeye gerek yoktu :).

Muhtemelen daha kolay / daha kısa kural tabanlı bir algoritma var, ama bu işe yarıyor.


Sinsi sinsi bitsel büyücülük +1
Rohan Jhunjhunwala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.