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爬虫之打包生成exe文件
Nov 06 Python
python提取内容关键词的方法
Mar 16 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
详解Python实现多进程异步事件驱动引擎
Aug 25 Python
python web基础之加载静态文件实例
Mar 20 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
在Python中使用MySQL--PyMySQL的基本使用方法
Nov 19 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
python 子类调用父类的构造函数实例
Mar 12 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
python flask框架快速入门
May 14 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中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
php的常量和变量实例详解
2017/06/27 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
2013/06/25 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
django 删除数据库表后重新同步的方法
2018/05/27 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
python实现祝福弹窗效果
2019/04/07 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Python对wav文件的重采样实例
2020/02/25 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
利用指针变量实现队列的入队操作
2012/04/07 面试题
创业女性典型材料
2014/05/02 职场文书
英文感谢信格式
2015/01/21 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL