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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python编程判断这天是这一年第几天的方法示例
Apr 18 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
Python中一行和多行import模块问题
Apr 01 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
python实现大文本文件分割
Jul 22 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
python求解水仙花数的方法
2015/05/11 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python字典的核心底层原理讲解
2019/01/24 Python
Python with标签使用方法解析
2020/01/17 Python
python def 定义函数,调用函数方式
2020/06/02 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
Java基础类库面试题
2013/09/04 面试题
关于群众路线的心得体会
2014/11/05 职场文书
个人党性分析材料
2014/12/19 职场文书
事业单位考察材料范文
2014/12/25 职场文书
公司开业主持词
2015/07/02 职场文书
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技