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中list常用操作实例详解
Jun 03 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
10个Python小技巧你值得拥有
Sep 29 Python
kafka-python批量发送数据的实例
Dec 27 Python
python3.x实现base64加密和解密
Mar 28 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
python调用webservice接口的实现
Jul 12 Python
使用Python制作一个打字训练小工具
Oct 01 Python
python构造函数init实例方法解析
Jan 19 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
Python闭包的定义和使用方法
Apr 11 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程序的国际化实现方法(利用gettext)
2011/08/14 PHP
9个比较实用的php代码片段
2016/03/15 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
javascript解析json实例详解
2014/11/05 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
社区活动策划方案
2014/08/21 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers