我的python之路三:井字棋
from random import choice
X="X"
O="O"
EM=" "
TIE="平局"
def 程序初始界面():
? ?"""初始界面介紹"""
? ?print("歡迎使用井字棋,你將與電腦對(duì)戰(zhàn),九個(gè)格子的位置依次用1~9代替\n"
? ? ? ? ?"每走一步,請(qǐng)輸入1~9的數(shù)字")
? ?print("""
? ? ? ? ? ? ? ?1 | 2 | 3
? ? ? ? ? ? ? ?4 | 5 | 6
? ? ? ? ? ? ? ?7 | 8 | 9""")
def 請(qǐng)用戶輸入yn(提示):
? ?"""返回”y“或”n“"""
? ?key=None
? ?print(提示)
? ?while key not in("y","n"):
? ? ? ?key=input("請(qǐng)輸入y/n:").lower()
? ?return key
def 接收用戶走法():
? ?"""返回用戶指定走哪一步:1~9數(shù)字,返回0~8"""
? ?key = None
? ?while key not in ("1","2","3","4","5","6","7","8","9"):
? ? ? ?key = input("請(qǐng)輸入(1~9):")
? ?return int(key)-1
def 決定誰用啥():
? ?"""返回兩個(gè)值,第一個(gè)是用戶,第二個(gè)是電腦,取值為X或者O"""
? ?go_first=請(qǐng)用戶輸入yn("你是否要先走?先走輸入y,否則按n")
? ?if go_first =="y":
? ? ? ?print("你選擇了先走,你執(zhí)X,電腦執(zhí)O")
? ? ? ?human=X
? ? ? ?computer=O
? ?else:
? ? ? ?print("你選擇了不先走,你執(zhí)O,電腦執(zhí)X")
? ? ? ?human = O
? ? ? ?computer = X
? ?return human,computer
def 定義新棋盤():
? ?"""是一個(gè)長(zhǎng)度為9的列表,每個(gè)格都為空格"""
? ?棋盤=[]
? ?for i in range(9):
? ? ? ?棋盤.append(EM)
? ?return 棋盤
def 刷新棋盤(棋盤):
? ?"""只管輸出棋盤列表[]"""
? ?print("\n\t", 棋盤[0], "|", 棋盤[1], "|", 棋盤[2]," ? ? ? 1", "|","2", "|","3")
? ?print("\t", 棋盤[3], "|", 棋盤[4], "|", 棋盤[5]," ? ? ? 4", "|","5", "|","6")
? ?print("\t", 棋盤[6], "|", 棋盤[7], "|", 棋盤[8]," ? ? ? 7", "|","8", "|","9")
def 可以下子的列表(棋盤):
? ?"""位置用0~8表示,返回列表元素為0~8"""
? ?可下=[]
? ?for i in range(9):
? ? ? ?if 棋盤[i] == EM:
? ? ? ? ? ?可下.append(i)
? ?return 可下
def 局面(棋盤):
? ?"""掃描棋盤,返回四種狀態(tài):X,O,平局,None"""
? ?win=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
? ?for i in win:
? ? ? ?if 棋盤[i[0]]==棋盤[i[1]]==棋盤[i[2]]!=EM:
? ? ? ? ? ?return 棋盤[i[0]]
? ?if EM not in 棋盤:
? ? ? ?return TIE
? ?else:
? ? ? ?return None
def 用戶下子(棋盤):#返回一個(gè)0~8的數(shù)字位置
? ?print("該你下了")
? ?while True:
? ? ? ?key=接收用戶走法()
? ? ? ?if 棋盤[key] !=EM:
? ? ? ? ? ?print("該位置有棋子了")
? ? ? ?else:
? ? ? ? ? ?break
? ?return key
def 電腦決定(棋子,棋盤):
? ?"""
? ?傳入電腦使用的棋子,返回一個(gè)0~8的數(shù)字位置,如果都滿了就返回None
? ?策略:
? ?生成一個(gè)合法下子位置列表
? ?先遍歷合法下子列表,依次下一子,判斷能不能贏,能贏就返回該位置
? ?再次遍歷合法下子列表,替玩家下一子,判斷能不能贏,能贏就返回該位置
? ?最后先確定一個(gè)最優(yōu)格順序表,中心最優(yōu),四角最差,
? ?在最優(yōu)順序表中依次找一個(gè)合法下子點(diǎn),返回該位置
? ?"""
? ?print("電腦思考中……")
? ?合法=可以下子的列表(棋盤)#合法為一個(gè)數(shù)字1~9列表
? ?棋盤副本=棋盤[:]
? ?for i in 合法:
? ? ? ?棋盤副本[i]=棋子#在合法處下自己的棋子
? ? ? ?j=局面(棋盤副本)#返回四種狀態(tài)字符串
? ? ? ?if j==棋子:#電腦贏了
? ? ? ? ? ?print("你輸了")
? ? ? ? ? ?return i
? ? ? ?棋盤副本[i] =EM
? ?if 棋子==X:
? ? ? ?對(duì)手棋子=O
? ?else:
? ? ? ?對(duì)手棋子=X
? ?棋盤副本 = 棋盤[:]
? ?for i in 合法:
? ? ? ?棋盤副本[i] = 對(duì)手棋子 ?# 在合法處下用戶的棋子
? ? ? ?j = 局面(棋盤副本)
? ? ? ?if j==對(duì)手棋子:#電腦贏了
? ? ? ? ? ?print("堵死你")
? ? ? ? ? ?return i
? ? ? ?棋盤副本[i] = EM
? ?棋盤副本 = 棋盤[:]
? ?if (棋盤副本.count(EM))>5:
? ? ? ?print("我想想……")
? ? ? ?if 棋盤副本[4]==EM:
? ? ? ? ? ?return 4
? ? ? ?elif (棋盤副本[1]==EM)or(棋盤副本[3]==EM)or(棋盤副本[5]==EM)or(棋盤副本[7]==EM):
? ? ? ? ? ?mm=[]
? ? ? ? ? ?for m in range(1,8,2):
? ? ? ? ? ? ? ?if 棋盤副本[m]==EM:
? ? ? ? ? ? ? ? ? ?mm.append(m)
? ? ? ? ? ?jg=choice(mm)
? ? ? ? ? ?return jg
? ? ? ?elif (棋盤副本[0]==EM)or(棋盤副本[2]==EM)or(棋盤副本[6]==EM)or(棋盤副本[8]==EM):
? ? ? ? ? ?mm=[]
? ? ? ? ? ?for m in [0,2,6,8]:
? ? ? ? ? ? ? ?if 棋盤副本[m] == EM:
? ? ? ? ? ? ? ? ? ?mm.append(m)
? ? ? ? ? ?jg = choice(mm)
? ? ? ? ? ?return jg
? ?else:
? ? ? ?print("我隨便下了")
? ? ? ?return choice(合法)
def 切換下棋方(t):
? ?"""將下棋方變量的內(nèi)容XO反轉(zhuǎn),傳入下棋方變量,返回XO"""
? ?if t==X:
? ? ? ?return O
? ?else:
? ? ? ?return X
def 結(jié)局處理(t,computer,human):
? ?"""t接收X,O,TIE"""
? ?if t!=TIE:
? ? ? ?print(f"{t}贏了")
? ? ? ?if t==computer:
? ? ? ? ? ?print("不好意思,贏的是我,愚蠢的人類")
? ? ? ? ? ?global sc
? ? ? ? ? ?sc+=1
? ? ? ?elif t==human:
? ? ? ? ? ?print("祝賀你,戰(zhàn)勝了一臺(tái)電腦")
? ? ? ? ? ?global sh
? ? ? ? ? ?sh+=1
? ?else:
? ? ? ?print("游戲結(jié)束,平局")
def main(誰是X):
? ?"""傳入?yún)?shù)’h'或'c',h代表本局用戶先走"""
? ?pan=定義新棋盤()
? ?刷新棋盤(pan)
? ?if 誰是X=="h":
? ? ? ?turn=human
? ?else:
? ? ? ?turn=computer
? ?while 局面(pan)==None: ?#掃描棋盤,返回四種狀態(tài):X,O,平局,None
? ? ? ?if turn == human:
? ? ? ? ? ?print("你是",human)
? ? ? ? ? ?下子=用戶下子(pan)
? ? ? ? ? ?pan[下子]=human
? ? ? ?else:
? ? ? ? ? ?下子=電腦決定(computer,pan)
? ? ? ? ? ?pan[下子] = computer
? ? ? ?刷新棋盤(pan)
? ? ? ?turn=切換下棋方(turn)
? ?結(jié)局=局面(pan)
? ?結(jié)局處理(結(jié)局, computer, human)
n=1
sc,sh=0,0
程序初始界面()
human, computer = 決定誰用啥()
if human == X:
? ?先 = "h"
else:
? ?先 = "c"
while True:
? ?main(先)
? ?key = 請(qǐng)用戶輸入yn("\n\n是否再玩一次?")
? ?if key == "y":
? ? ? ?n += 1
? ? ? ?if 先 == "h":
? ? ? ? ? ?先="c"
? ? ? ? ? ?print("這局電腦先")
? ? ? ?else:
? ? ? ? ? ?先="h"
? ? ? ? ? ?print("這局你先")
? ?else:
? ? ? ?print(f"游戲結(jié)束,共玩了{(lán)n}次","你贏了",sh,"次")
? ? ? ?break
exit()