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内置函数bin() oct()等实现进制转换
Dec 30 Python
python计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
django2笔记之路由path语法的实现
Jul 17 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python向图片里添加文字
Nov 26 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
如何使用python切换hosts文件
Apr 29 Python
没编程基础可以学python吗
Jun 17 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 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
PHP的中问验证码
2006/11/25 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
Less 安装及基本用法
2018/05/05 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
python实现二分查找算法
2017/09/21 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Python数组并集交集补集代码实例
2020/02/18 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
无婚姻登记记录证明
2015/06/18 职场文书
Django实现聊天机器人
2021/05/31 Python
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
SQL Server内存机制浅探
2022/04/06 SQL Server
JS setTimeout与setInterval的区别
2022/04/20 Javascript
图神经网络GNN算法
2022/05/11 Python