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中的自定义函数学习笔记
Sep 23 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
Python yield 使用方法浅析
May 20 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
numpy数组之存取文件的实现示例
May 24 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
python 实现简单的FTP程序
Dec 27 Python
NumPy排序的实现
Jan 21 Python
Python实现打包成库供别的模块调用
Jul 13 Python
django跳转页面传参的实现
Sep 17 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
Python读取pdf表格写入excel的方法
Jan 22 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中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
php中__toString()方法用法示例
2016/12/07 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
基于python代码批量处理图片resize
2020/06/04 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
保安公司服务承诺书
2014/05/28 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python