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程序运行效率的6个方法
Mar 31 Python
python实现TCP服务器端与客户端的方法详解
Apr 30 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
python监控文件并且发送告警邮件
Jun 21 Python
Atom的python插件和常用插件说明
Jul 08 Python
Python调用C语言的实现
Jul 26 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
Django websocket原理及功能实现代码
Nov 14 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python集合set()使用的方法详解
Mar 18 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php addslashes和mysql_real_escape_string
2010/01/24 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
基于php下载文件的详解
2013/06/02 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JSON相关知识汇总
2015/07/03 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
python中图像通道分离与合并实例
2020/01/17 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
python实现贪吃蛇双人大战
2020/04/18 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
怎样声明子类
2013/07/02 面试题
中式婚礼主持词
2014/03/13 职场文书
《春雨》教学反思
2014/04/24 职场文书
信息合作协议书
2014/10/09 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书