我的python之路三:井字棋
from random import choice
X="X"
O="O"
EM=" "
TIE="平局"
def 程序初始界面():
"""初始界面介绍"""
print("欢迎使用井字棋,你将与电脑对战,九个格子的位置依次用1~9代替\n"
"每走一步,请输入1~9的数字")
print("""
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9""")
def 请用户输入yn(提示):
"""返回”y“或”n“"""
key=None
print(提示)
while key not in("y","n"):
key=input("请输入y/n:").lower()
return key
def 接收用户走法():
"""返回用户指定走哪一步:1~9数字,返回0~8"""
key = None
while key not in ("1","2","3","4","5","6","7","8","9"):
key = input("请输入(1~9):")
return int(key)-1
def 决定谁用啥():
"""返回两个值,第一个是用户,第二个是电脑,取值为X或者O"""
go_first=请用户输入yn("你是否要先走?先走输入y,否则按n")
if go_first =="y":
print("你选择了先走,你执X,电脑执O")
human=X
computer=O
else:
print("你选择了不先走,你执O,电脑执X")
human = O
computer = X
return human,computer
def 定义新棋盘():
"""是一个长度为9的列表,每个格都为空格"""
棋盘=[]
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 局面(棋盘):
"""扫描棋盘,返回四种状态: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 用户下子(棋盘):#返回一个0~8的数字位置
print("该你下了")
while True:
key=接收用户走法()
if 棋盘[key] !=EM:
print("该位置有棋子了")
else:
break
return key
def 电脑决定(棋子,棋盘):
"""
传入电脑使用的棋子,返回一个0~8的数字位置,如果都满了就返回None
策略:
生成一个合法下子位置列表
先遍历合法下子列表,依次下一子,判断能不能赢,能赢就返回该位置
再次遍历合法下子列表,替玩家下一子,判断能不能赢,能赢就返回该位置
最后先确定一个最优格顺序表,中心最优,四角最差,
在最优顺序表中依次找一个合法下子点,返回该位置
"""
print("电脑思考中……")
合法=可以下子的列表(棋盘)#合法为一个数字1~9列表
棋盘副本=棋盘[:]
for i in 合法:
棋盘副本[i]=棋子#在合法处下自己的棋子
j=局面(棋盘副本)#返回四种状态字符串
if j==棋子:#电脑赢了
print("你输了")
return i
棋盘副本[i] =EM
if 棋子==X:
对手棋子=O
else:
对手棋子=X
棋盘副本 = 棋盘[:]
for i in 合法:
棋盘副本[i] = 对手棋子 # 在合法处下用户的棋子
j = 局面(棋盘副本)
if j==对手棋子:#电脑赢了
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):
"""将下棋方变量的内容XO反转,传入下棋方变量,返回XO"""
if t==X:
return O
else:
return X
def 结局处理(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("祝贺你,战胜了一台电脑")
global sh
sh+=1
else:
print("游戏结束,平局")
def main(谁是X):
"""传入参数’h'或'c',h代表本局用户先走"""
pan=定义新棋盘()
刷新棋盘(pan)
if 谁是X=="h":
turn=human
else:
turn=computer
while 局面(pan)==None: #扫描棋盘,返回四种状态:X,O,平局,None
if turn == human:
print("你是",human)
下子=用户下子(pan)
pan[下子]=human
else:
下子=电脑决定(computer,pan)
pan[下子] = computer
刷新棋盘(pan)
turn=切换下棋方(turn)
结局=局面(pan)
结局处理(结局, computer, human)
n=1
sc,sh=0,0
程序初始界面()
human, computer = 决定谁用啥()
if human == X:
先 = "h"
else:
先 = "c"
while True:
main(先)
key = 请用户输入yn("\n\n是否再玩一次?")
if key == "y":
n += 1
if 先 == "h":
先="c"
print("这局电脑先")
else:
先="h"
print("这局你先")
else:
print(f"游戏结束,共玩了{n}次","你赢了",sh,"次")
break
exit()