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回调函数用法实例分析
May 09 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
详解Python设计模式之策略模式
Jun 15 Python
python中24小时制转换为12小时制的方法
Jun 18 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
React实现全选功能
2020/08/25 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python中的错误处理
2016/04/10 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
python实现对变位词的判断方法
2020/04/05 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
pandas 数据类型转换的实现
2020/12/29 Python
应届生求职推荐信
2013/10/28 职场文书
班主任工作年限证明
2014/01/12 职场文书
期末自我鉴定
2014/02/02 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
旷工辞退通知书
2015/04/17 职场文书
离职告别感言
2015/08/04 职场文书
公司车辆管理制度
2015/08/04 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技