使用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 相关文章推荐
linux下安装easy_install的方法
Feb 10 Python
Python FTP操作类代码分享
May 13 Python
python判断windows系统是32位还是64位的方法
May 11 Python
python字典DICT类型合并详解
Aug 17 Python
python学习基础之循环import及import过程
Apr 22 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
python实现简单加密解密机制
Mar 19 Python
python求绝对值的三种方法小结
Dec 04 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
python基础之文件处理知识总结
May 23 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php通用防注入程序 推荐
2011/02/26 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python 对象和json互相转换方法
2018/03/22 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
python实现控制COM口的示例
2019/07/03 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
建设投标担保书
2014/05/13 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
个人年终总结结尾
2015/03/06 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
小学英语教师研修感悟
2015/11/18 职场文书