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命令行参数sys.argv使用示例
Jan 28 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python2中文处理纪要的实现方法
Mar 10 Python
python中reader的next用法
Jul 24 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
浅析php原型模式
2014/11/25 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
js 幻灯片的实现
2011/12/06 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
医疗纠纷协议书
2014/04/16 职场文书
节约能源标语
2014/06/17 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
法院个人总结
2015/03/03 职场文书
运动会开幕式主持词
2015/07/01 职场文书
董事长年会致辞
2015/07/29 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python