使用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实现的DES加密算法和3DES加密算法实例
Jun 03 Python
python常用知识梳理(必看篇)
Mar 23 Python
Python实现的字典值比较功能示例
Jan 08 Python
详解python算法之冒泡排序
Mar 05 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python字典和列表性能之间的比较
Jun 07 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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之短标签开启设置
2013/06/17 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
Python模拟登录12306的方法
2014/12/30 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
django创建超级用户过程解析
2019/09/18 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
NET程序员上机面试题
2015/05/23 面试题
门卫人员岗位职责
2013/12/24 职场文书
物理教师自荐信范文
2013/12/28 职场文书
管理信息系学生的自我评价
2014/01/11 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
加薪通知
2015/04/25 职场文书
行政介绍信范文
2015/05/04 职场文书
标枪加油稿
2015/07/22 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP