python实现简单井字棋小游戏
作者:蒟蒻熊 发布时间:2023-01-15 05:14:57
标签:python,井字棋
用python实现的一个井字棋游戏,供大家参考,具体内容如下
#Tic-Tac-Toe 井字棋游戏
#全局常量
X="X"
O="O"
EMPTY=" "
#询问是否继续
def ask_yes_no(question):
response=None;
while response not in("y","n"):
response=input(question).lower()
return response
#输入位置数字
def ask_number(question ,low,high):
response=None
while response not in range(low,high):
response=int(input(question))
return response
#询问谁先走,先走方为X,后走方为O
#函数返回计算机方,玩家的角色代号
def pieces():
go_first=ask_yes_no("玩家你是否先走(y/n):")
if go_first=="y":
print("\n玩家你先走.")
human=X
computer=O
else:
print("\n计算机先走.")
computer=X
human=O
return computer,human
#产生新的棋盘
def new_board():
board=[]
for square in range(9):
board.append(EMPTY)
return board
#显示棋盘
def display_board(board):
board2=board[:]
for i in range(len(board)):
if board[i]==EMPTY:
board2[i]=i
print("\t",board2[0],"|",board2[1],"|",board2[2])
print("\t","----------")
print("\t",board2[3],"|",board2[4],"|",board2[5])
print("\t", "----------")
print("\t",board2[6],"|",board2[7],"|",board2[8],"\n")
#产生可以合法走棋位置序列(也就是还未下过子位置)
def legal_moves(board):
moves=[]
for square in range(9):
if board[square]==EMPTY:
moves.append(square)
return moves
#判断输赢
def winner(board):
# 所有赢得可能情况,例如(0,1,2)就是第一行,(0,4,8,),(2,4,6)就是对角线
WAYS_TO_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 row in WAYS_TO_WIN:
if board[row[0]]==board[row[1]]==board[row[2]]!=EMPTY:
winner=board[row[0]]
return winner
#棋盘没有空位置
if EMPTY not in board:
return "TIE"
return False
#人走棋
def human_move (board,human):
legal =legal_moves(board)
move =None
while move not in legal:
move=ask_number("你走那个位置?(0-8):",0,9)
if move not in legal:
print("\n此位置已经落过子了")
#print("Fine...")
return move
#计算机走棋
def computer_move(board,computer ,human):
board=board[:]
#按优劣顺序排序的下棋走子
BEST_MOVES=(4,0,2,6,8,1,3,5,7) #最佳下棋位置顺序表
#如果计算机能赢,就走那个位置
for move in legal_moves(board):
board[move]=computer
if winner(board)==computer:
print("计算机下棋位置...",move)
return move
#取消走棋方案
board[move]=EMPTY
#如果玩家能赢就堵住那个位置
for move in legal_moves(board):
board[move]=human
if winner(board)==human:
print("计算机下棋位置...",move)
return move
#取消走棋方案
board[move]=EMPTY
#如果不是上面情况,也就是这一轮赢不了
#则是从最佳下棋位置表中挑出第一个合法位置
for move in BEST_MOVES:
if move in legal_moves(board):
print("计算机下棋位置....",move)
return move
#转换角色
def next_turn(turn):
if turn ==X:
return O
else:
return X
#主函数
def main():
computer,human=pieces()
turn =X
board=new_board()
display_board(board)
while not winner(board):
if turn ==human:
move=human_move(board,human)
board[move]=human
else:
move=computer_move(board,computer,human)
board[move]=computer
display_board(board)
turn=next_turn(turn) #转换角色
#游戏结束输出输赢或和棋信息
the_winner=winner(board)
if the_winner==computer:
print("计算机赢!\n")
elif the_winner==human:
print("玩家赢!\n")
elif the_winner=="TIE":
print("平局,游戏结束\n")
main()
input("按任意键退出游戏")
来源:https://blog.csdn.net/qq_37774171/article/details/85078080


猜你喜欢
- PowerDesigner简介 工具的用途 :这里我只介绍他在SqlServer数据库的应用,其它的我也不懂。工具的好处 : 个人
- 现像如下:站点无法打开,或者打开很慢.HTML可以打开.重新启动或者回收应用程序池可恢复.但过一段时间又会出现日志里会有:ISAPI
- 本文实例讲述了go语言操作redis连接池的方法。分享给大家供大家参考。具体实现方法如下:func newPool(server, pass
- 一、SQLAlchemy 介绍1.1 ORM 的概念ORM全称Object Relational Mapping(对象关系映射),通过 OR
- 大概来介绍一下 Django Allauth 改造的期间遇到的一些问题和改造方法,在此之前我只想说——Django Allauth 是屑。为
- jquery作为一款高质量的框架被大多web开发者所推崇。jquery也的确是一款伟大的产品,在实际开发中明显提高了效率。但是任何产品并不是
- ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程
- 上文:栅格:从混乱到秩序Jacci Howard Bear 的英文原文:http://desktoppub.about.com/od/gri
- 一、获取安装包:Pycharm 官网 下载页面 :点击打开Anconda 官网 下载页面 :点击打开选择对应的系统和需要的版本进行下载,py
- 目前定时的操作有:一、Html页面的定时刷新(Refresh--刷新 ) 1,Refresh (刷新) 代码使用说明 说明:让网页多长时间(
- 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后。就需要检
- Web Accessibility Initiative Accessible Rich Internet Applications认识AR
- 当浏览者进入你的网站首页时或提交某些表单时,会弹出网站声明或提交说明等文本信息框,引导浏览者使用你的网站。实现这个功能我们是用Dreamwe
- 一般情况下,当数据表中,莫一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置SET IDENTITY_
- 本文实例讲述了Python学习笔记之Break和Continue用法。分享给大家供大家参考,具体如下:Python 中的Break 和 Co
- 最近没事,写了个在项目经常要取城市或省份名的方法,所以改成了一个类.方便以后调用//****************************
- 一、引言属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算
- 前段时间做一个小项目碰到了一个导航制作的方式然后突然想到曾经很久以前看到的梯形状的不规则导航,就尝试做了一下。结果碰到了几个问题,后来在同事
- 先来看查看效果:在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的
- 1.获取当前时间var myDate = new Date();2.获取时间中的年月日时分秒myDate.getYear();