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中函数的多种格式和使用实例及小技巧
Apr 13 Python
Python算法应用实战之队列详解
Feb 04 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
Python的时间模块datetime详解
Apr 17 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
python elasticsearch环境搭建详解
Sep 02 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
django中related_name的用法说明
May 20 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
python 实现图片批量压缩的示例
Dec 18 Python
一文搞懂python异常处理、模块与包
Jun 26 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中实现简单的ACL 完结篇
2011/09/07 PHP
PHP制作万年历
2015/01/07 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP.vs.JAVA
2016/04/29 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
jquery实现心算练习代码
2010/12/06 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
python模拟实现分发扑克牌
2020/04/22 Python
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
自我评价是什么
2014/01/04 职场文书
个人对照检查材料
2014/02/12 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
办公设备采购方案
2014/03/16 职场文书
租赁意向书范本
2014/04/01 职场文书
工作推荐信范文
2014/05/10 职场文书
公司承诺书格式
2014/05/21 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python