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实现斐波那契(Fibonacci)函数
Mar 25 Python
Python程序中的观察者模式结构编写示例
May 27 Python
python机器学习之决策树分类详解
Dec 20 Python
Selenium定位元素操作示例
Aug 10 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
Pycharm+Python+PyQt5使用详解
Sep 25 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
python如何修改文件时间属性
Feb 05 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
php 安全过滤函数代码
2011/05/07 PHP
Array of country list in PHP with Zend Framework
2011/10/17 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Javascript 继承实现例子
2009/08/12 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
自荐信要包含哪些内容
2013/11/06 职场文书
行政专员岗位职责
2014/01/02 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
工作检讨书大全
2015/01/26 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
初中同学会致辞
2015/08/01 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
redis 查看所有的key方式
2021/05/07 Redis
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers