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使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
python实现手机通讯录搜索功能
Feb 22 Python
python try except 捕获所有异常的实例
Oct 18 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
浅谈pycharm使用及设置方法
Sep 09 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
零基础学python应该从哪里入手
Aug 11 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
python中数组和列表的简单实例
Mar 25 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遍历数组的方法汇总分析
2013/06/08 PHP
php抽象类用法实例分析
2015/07/07 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
元宵节主持词
2014/03/25 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
企业宣传语大全
2015/07/13 职场文书
2016公司新年问候语
2015/11/11 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
导游词之江南周庄
2019/12/06 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs