使用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判断IP地址合法性的方法实例
Mar 13 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Django的信号机制详解
May 05 Python
Python hashlib模块用法实例分析
Jun 12 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
django用户登录验证的完整示例代码
Jul 21 Python
Python3离线安装Requests模块问题
Oct 13 Python
Python3 读取Word文件方式
Feb 13 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
Python pandas如何向excel添加数据
May 22 Python
Python xpath表达式如何实现数据处理
Jun 13 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
php时区转换转换函数
2014/01/07 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python实现识别手写数字大纲
2018/01/29 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android