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编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
收集的几个Python小技巧分享
Nov 22 Python
python随机生成指定长度密码的方法
Apr 04 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
详解Python中的四种队列
May 21 Python
python三引号输出方法
Feb 27 Python
python向字符串中添加元素的实例方法
Jun 28 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
Python中最好用的命令行参数解析工具(argparse)
Aug 23 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
Python函数中的不定长参数相关知识总结
Jun 24 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
Javascript的一种模块模式
2008/03/22 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
python八皇后问题的解决方法
2018/09/27 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
windows下python安装pip方法详解
2020/02/10 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
班级德育工作实施方案
2014/02/21 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
Promise静态四兄弟实现示例详解
2022/07/07 Javascript