欢迎光临散文网 会员登陆 & 注册

我的python之路三:井字棋

2022-12-14 23:08 作者:沙砂汾不清请褚诸  | 我要投稿

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()

我的python之路三:井字棋的评论 (共 条)

分享到微博请遵守国家法律