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实现的扫雷游戏实例代码
Aug 01 Python
使用python实现链表操作
Jan 26 Python
python生成ppt的方法
Jun 07 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
python常用数据重复项处理方法
Nov 22 Python
Tensorflow限制CPU个数实例
Feb 06 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
python查看矩阵的行列号以及维数方式
May 22 Python
Python必须了解的35个关键词
Jul 16 Python
Python绘制地图神器folium的新人入门指南
May 23 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
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
php使用PDO方法详解
2014/12/27 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Python之list对应元素求和的方法
2018/06/28 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python递归下载文件夹下所有文件
2019/08/31 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
详解pandas映射与数据转换
2021/01/22 Python
党员个人公开承诺书
2014/08/29 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
法院个人总结
2015/03/03 职场文书
2015年话务员工作总结
2015/04/29 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
导游词之杭州西湖
2019/09/19 职场文书
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python