使用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数据结构之二叉树的建立实例
Apr 29 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
python实现名片管理系统
Nov 29 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
详解Python 中的容器 collections
Aug 17 Python
python安装第三方库如xlrd的方法
Oct 31 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
桌面中心(二)数据库写入
2006/10/09 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
如何实现JS函数的重载
2006/09/22 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
PHP中如何创建和修改数组
2012/05/02 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
汽车专业学生自我评价
2014/01/19 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
语文教学随笔感言
2014/02/18 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
明信片寄语大全
2014/04/08 职场文书
双方协议书
2014/04/22 职场文书
cf战队收人口号
2014/06/21 职场文书
房屋出租委托书格式
2014/09/23 职场文书
婚前协议书标准版
2014/10/19 职场文书
学雷锋感言
2015/08/03 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python