使用Python编写一个简单的tic-tac-toe游戏的教程


Posted in Python onApril 16, 2015

 这个教程,我们将展示如何用python创建一个井字游戏。 其中我们将使用函数、数组、if条件语句、while循环语句和错误捕获等。

首先我们需要创建两个函数,第一个函数用来显示游戏板:
 

def print_board():
  for i in range(0,3):
    for j in range(0,3):
      print map[2-i][j],
      if j != 2:
        print "|",
    print ""

这我们使用两个for循环来遍历map,该map是一个包含了位置信息的二维数组。

游戏板看起来是这样的:
 

|  | 
|  | 
|  |
 
X | X | 
O | X | O
 | O | X
 
X | X | X
X | X | X
X | X | X

 
下面我们需要一个函数check_done()来检查游戏是否结束。如果结束,则返回True并打印消息。
 

def check_done():
  for i in range(0,3):
    if map[i][0] == map[i][1] == map[i][2] != " " \
    or map[0][i] == map[1][i] == map[2][i] != " ":
      print turn, "won!!!"
      return True
     
  if map[0][0] == map[1][1] == map[2][2] != " " \
  or map[0][2] == map[1][1] == map[2][0] != " ":
    print turn, "won!!!"
    return True
 
  if " " not in map[0] and " " not in map[1] and " " not in map[2]:
    print "Draw"
    return True
     
  return False

有几个地方需要检查,首先检查水平和垂直方向,是否有一行或一列不为空且包含有三个相同的符号,然后我们再检查斜方向。如果上面有一个方向满足,游戏结束并打印“Won!!!”。请注意检查变量改变,它用来标记当前是哪一位玩家。

同时我们需要检查当前游戏板是否被填满且没有人获胜,游戏平局。

有了上面的两个函数,下面我们创建3个变量:
 

turn = "X"
map = [[" "," "," "],
    [" "," "," "],
    [" "," "," "]]
done = False

    turn : 轮到谁
    map : 游戏板
    done : 游戏是否结束

现在启动游戏:
 

while done != True:
  print_board()
   
  print turn, "'s turn"
  print
 
  moved = False
  while moved != True:

这里使用了while循环直到游戏结束并返回true.在这个循环里面,使用了另外一个while循环来检查玩家是否移动,如果玩家没有移动,则程序会跳到下一次循环。

下一步告诉玩家怎么玩:
 

print "Please select position by typing in a number between 1 and 9, see below for which number that is which position..."
    print "7|8|9"
    print "4|5|6"
    print "1|2|3"
    print
 
try:
      pos = input("Select: ")
      if pos <=9 and pos >=1:

我们期望玩家输入一个数字,检查该数字是否是在1到9之间。另外,我们这里需要一段错误处理逻辑,我们还需要需要检查玩家是否能移动到一个位置:
 

Y = pos/3
        X = pos%3
        if X != 0:
          X -=1
        else:
           X = 2
           Y -=1

以下是全部的代码:
 

def print_board():
  for i in range(0,3):
    for j in range(0,3):
      print map[2-i][j],
      if j != 2:
        print "|",
    print ""
 
 
def check_done():
  for i in range(0,3):
    if map[i][0] == map[i][1] == map[i][2] != " " \
    or map[0][i] == map[1][i] == map[2][i] != " ":
      print turn, "won!!!"
      return True
     
  if map[0][0] == map[1][1] == map[2][2] != " " \
  or map[0][2] == map[1][1] == map[2][0] != " ":
    print turn, "won!!!"
    return True
 
  if " " not in map[0] and " " not in map[1] and " " not in map[2]:
    print "Draw"
    return True
     
 
  return False
 
 
 
 
 
turn = "X"
map = [[" "," "," "],
    [" "," "," "],
    [" "," "," "]]
done = False
 
 
while done != True:
  print_board()
   
  print turn, "'s turn"
  print
 
  moved = False
  while moved != True:
    print "Please select position by typing in a number between 1 and 9,\
    see below for which number that is which position..."
    print "7|8|9"
    print "4|5|6"
    print "1|2|3"
    print
 
    try:
      pos = input("Select: ")
      if pos <=9 and pos >=1:
        Y = pos/3
        X = pos%3
        if X != 0:
          X -=1
        else:
           X = 2
           Y -=1
           
        if map[Y][X] == " ":
          map[Y][X] = turn
          moved = True
          done = check_done()
 
          if done == False:
            if turn == "X":
              turn = "O"
            else:
              turn = "X"
         
       
    except:
      print "You need to add a numeric value"
Python 相关文章推荐
带你了解python装饰器
Jun 15 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python如何求解两数的最大公约数
Sep 27 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
20行python代码的入门级小游戏的详解
May 05 Python
Django Rest framework频率原理与限制
Jul 26 Python
python线程join方法原理解析
Feb 11 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
python通配符之glob模块的使用详解
Apr 24 Python
python异步的ASGI与Fast Api实现
Jul 16 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 #Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 #Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 #Python
Python3中多线程编程的队列运作示例
Apr 16 #Python
使用Python脚本操作MongoDB的教程
Apr 16 #Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 #Python
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 #Python
You might like
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
Prototype Object对象 学习
2009/07/12 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
python实现BackPropagation算法
2017/12/14 Python
Python多线程扫描端口代码示例
2018/02/09 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Python目录和文件处理总结详解
2019/09/02 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
美国眼镜网站:LensCrafters
2020/01/19 全球购物
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
三下乡活动方案
2014/01/31 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
端午节活动总结
2014/08/26 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
争做文明公民倡议书
2019/06/24 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
解析python中的jsonpath 提取器
2022/01/18 Python