Python 2: 399 401 349 333 317 370 ไบต์
2x แก้ไขข้อผิดพลาด: เครดิตถึง l4m2
-52 ตัวอักษร: มอบเครดิตให้กับ undergroundmonorail
-16 ตัวอักษร: มอบเครดิตให้แก่ Jonathan Frech
-26 ตัวอักษร: เครดิตสำหรับผู้ใช้ 2,02729
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])
ลองออนไลน์!
ในวันแรกของหลักสูตรพีชคณิตเชิงเส้นที่ฉันเข้าเรียนภาคการศึกษาสุดท้ายอาจารย์ผู้สอนระดับบัณฑิตศึกษาที่ชาญฉลาดของฉันเสนอว่าถ้าคุณเป็นตัวแทนของคณะกรรมการโอเอกซ์เป็นตาราง:
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
จากนั้นการรับสามในแถวจะเท่ากับการเลือกตัวเลขสามตัวในช่วง [1,9] ที่รวมกันเป็น 15 คำตอบนี้ใช้ประโยชน์จากความคิดนี้ ฟังก์ชั่นใช้รายการที่มีตัวเลขเก้าตัวแทนบอร์ด 0 หมายถึงพื้นที่ว่าง 1 ถูกครอบครองโดยฝ่ายตรงข้ามและ 2 หมายถึงการเล่นครั้งก่อนโดยโปรแกรม 3 บรรทัดแรกแสดงจำนวนโปรแกรมที่เลือก (p) ฝ่ายค้านเลือก (o) และยังคงมีอยู่ (a) จากนั้นจะตรวจสอบหมายเลขที่มีอยู่และดูว่ามีหมายเลขใดบ้างรวมกับตัวเลขสองหมายเลขที่ได้เลือกเพิ่มไปสิบห้า ถ้าเป็นเช่นนั้นมันจะเลือกสี่เหลี่ยมนั้นและชนะ หากไม่มีการย้ายที่ชนะทันทีมันจะตรวจสอบเพื่อดูว่าฝ่ายตรงข้ามสามารถชนะโดยใช้วิธีการเดียวกัน หากพวกเขาทำได้มันจะต้องใช้เวลาในการชนะของพวกเขา หากไม่มีการชนะหรือการปิดกั้นการเคลื่อนไหว มันจะย้ายในมุม วิธีนี้ช่วยป้องกันคนโง่:
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
หากไม่มีสถานการณ์เหล่านี้เกิดขึ้นก็จะเลือกสแควร์โดยพลการ ฟังก์ชั่นส่งออกตัวเลข [0,8] ซึ่งเป็นตัวแทนของสี่เหลี่ยมจัตุรัสดัชนี 0 ที่เลือกโดยอัลกอริทึม
แก้ไข: อัลกอริทึมจัดลำดับความสำคัญตรงกลางเหนือเส้นทแยงมุมซึ่งจะป้องกันไม่ให้คนโง่อีกคนมีความเป็นไปได้ที่ชี้โดย l4m2 และกลยุทธ์ที่เกี่ยวข้อง
แก้ไข: เพื่อชี้แจงฟังก์ชั่นที่ใช้ในคณะกรรมการในรูปแบบของอาร์เรย์และส่งออกย้ายเป็นจำนวนเต็มใน [0,8] เนื่องจากกลยุทธ์ I / O นี้เป็น clunky ดังนั้นนี่คือสคริปต์ตัวห่อหุ้มที่ทำให้โต้ตอบได้มากขึ้น ใช้อาร์กิวเมนต์บรรทัดคำสั่งเดียวซึ่งควรเป็น 1 หากผู้เล่นไปก่อนและ 0 ถ้าโปรแกรมไปก่อน
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