python实现简单井字棋小游戏


Posted in Python onMarch 05, 2020

用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("按任意键退出游戏")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈python可视化包Bokeh
Feb 07 Python
用python与文件进行交互的方法
Mar 01 Python
python opencv实现运动检测
Jul 10 Python
python实现剪切功能
Jan 23 Python
详解Python做一个名片管理系统
Mar 14 Python
python实现维吉尼亚算法
Mar 20 Python
python读写csv文件的方法
Aug 13 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
浅谈Python中threading join和setDaemon用法及区别说明
May 02 Python
Python中socket网络通信是干嘛的
May 27 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
Python爬虫爬取微信朋友圈
Aug 06 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 #Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 #Python
关于Python Tkinter Button控件command传参问题的解决方式
Mar 04 #Python
在python tkinter界面中添加按钮的实例
Mar 04 #Python
Python tkinter布局与按钮间距设置方式
Mar 04 #Python
python 按钮点击关闭窗口的实现
Mar 04 #Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 #Python
You might like
实用函数8
2007/11/08 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
详解react-redux插件入门
2018/04/19 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
python实现大文件分割与合并
2019/07/22 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
大学生的网上创业计划书
2013/12/31 职场文书
理财投资建议书
2014/03/12 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
农村文化活动总结
2014/08/28 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
法律意见书范文
2015/06/04 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang