Python 2: 399 401 349 333 317 370 byte
2x Perbaikan Bug: kredit ke l4m2
-52 karakter: kredit ke bawah tanahmonail
-16 karakter: kredit untuk Jonathan Frech
-26 karakter: kredit ke pengguna202729
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
Cobalah secara Online!
Pada hari pertama kursus aljabar linear yang saya ambil semester lalu, instruktur mahasiswa pascasarjana yang cerdik mengusulkan bahwa jika Anda mewakili papan tic-tac-toe sebagai matriks:
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
kemudian mendapatkan tiga berturut-turut sama dengan memilih tiga angka dalam rentang [1,9] yang menambahkan hingga 15. Jawaban ini mengeksploitasi ide ini. Fungsi mengambil daftar yang berisi sembilan angka yang mewakili papan. 0 menunjukkan ruang kosong, 1 ditempati oleh lawan, dan 2 mewakili permainan sebelumnya yang dibuat oleh program. 3 baris pertama mencari tahu nomor apa yang telah diambil program (p), oposisi telah memilih (o), dan masih tersedia (a). Kemudian melihat melalui nomor yang tersedia dan melihat apakah ada dari mereka, dikombinasikan dengan dua angka yang sudah dipetiknya menambah lima belas. Jika ya, itu akan memilih kotak itu dan menang. Jika tidak ada gerakan kemenangan langsung, itu akan memeriksa untuk melihat apakah lawan dapat menang menggunakan metode yang sama. Jika mereka bisa, itu akan membawa kemenangan mereka. Jika tidak ada langkah kemenangan atau pemblokiran yang tersedia, itu akan bergerak di sudut. Ini mencegah pasangan bodoh:
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
Jika tidak ada satu pun dari situasi ini yang terjadi, ia akan memilih kotak secara sewenang-wenang. Fungsi ini menghasilkan angka [0,8] yang mewakili 0 diindeks kuadrat yang dipilih oleh algoritma.
Sunting: Algoritme sekarang memprioritaskan pusat di atas diagonal, yang akan mencegah kemungkinan pasangan bodoh lain yang ditunjukkan oleh l4m2 dan strategi terkait.
Sunting: Untuk memperjelas, fungsi mengambil papan dalam bentuk array dan output bergerak sebagai integer pada [0,8]. Karena strategi I / O ini begitu kikuk, inilah skrip wrapper yang membuatnya lebih interaktif. Dibutuhkan argumen baris perintah tunggal, yang harus menjadi 1 jika pemain pergi dulu, dan 0 jika program berjalan pertama.
import sys
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
board = [0,0,0,0,0,0,0,0,0]
rep = {0:"-",1:"X",2:"O"}
turn = int(sys.argv[1])
while True:
for i in range(3):
print rep[board[i*3]]+" "+rep[board[i*3+1]]+" "+rep[board[i*3+2]]
print
if turn:
move = int(raw_input("Enter Move [0-8]: "))
else:
move = f(board)
board[move] = turn+1
turn = (turn+1)%2
we can assume that all previous moves of the 2nd player were also played by our engine