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实现简单状态框架的方法
Mar 19 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
python 实现识别图片上的数字
Jul 30 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Python 实现数组相减示例
Dec 27 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 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
php5 图片验证码实现代码
2009/12/11 PHP
Laravel5中contracts详解
2015/03/02 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
PHP实现计算器小功能
2020/08/28 PHP
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
几种响应式文字详解
2017/05/19 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
Python中类型检查的详细介绍
2017/02/13 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
Django模板语言 Tags使用详解
2019/09/09 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
献爱心标语
2014/06/21 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
审美与表现自我评价
2015/03/09 职场文书
金砖之国观后感
2015/06/11 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书