Perdi a punta di tic-tac


18

Scrivi un programma per giocare a Misère tic-tac-toe. Cioè, l'obiettivo è costringere il tuo avversario a prendere tre di fila.

Accettare sull'input standard una 'X' o una 'O' (la lettera, non zero), per determinare da che parte giocherà il programma. Quindi metti una sola cifra per la tua mossa nel tuo turno e leggi una singola cifra nel tuo turno degli avversari fino alla fine del gioco (X inizia sempre per primo). Una volta deciso il vincitore, metti in uscita X o O per chi ha vinto o D per un pareggio. Ad esempio, se O ottiene 3 di fila, X vince.

Supponiamo che la scheda sia numerata in questo modo:

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

Idealmente una soluzione sarebbe ottimale e non perderà mai. Come il tic-tac-toe, il gioco perfetto dovrebbe sempre tradursi in un pareggio. Se il protocollo sopra riportato viene rispettato, posso testare automaticamente gli invii rispetto a una varietà di possibili strategie.

Il vincitore è il codice più breve. punti bonus se prende casualmente da mosse ugualmente buone per renderlo un po 'più imprevedibile.

Risposte:


10

Python, 383 caratteri

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

La scheda Bè rappresentata come un numero intero usando due bit per quadrato, con 00e che 01rappresenta vuoto, che 10rappresenta O e che 11rappresenta X. Mè un insieme di maschere di bit con 01nei punti di una tripla perdente ( 21= 0b010101= la riga superiore ecc.) XCalcola se c'è qualche perdita tripla per kè presente su una tavola. Sfa minimax a cercare una mossa ottimale per X, restituendo una coppia di punteggio (1 = vittoria, -1 = perdi, 0 = pareggio) e un indice quadrato. ^87381(= ^0b010101010101010101) inverte X e O lasciando invariati i quadrati vuoti.

Il computer non perde mai, quindi non ho dovuto includere quel controllo :).

Esiste probabilmente un algoritmo basato su regole più semplice / più breve, ma funziona.


Stregoneria subdola subdola subdola +1
Rohan Jhunjhunwala
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.