使用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实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
详解Python的Django框架中的通用视图
May 04 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
windows下python安装小白入门教程
Sep 18 Python
python实现kmp算法的实例代码
Apr 03 Python
python numpy数组复制使用实例解析
Jan 10 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
python实现126邮箱发送邮件
May 20 Python
python 19个值得学习的编程技巧
Aug 15 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/10/26 PHP
PHP实现小偷程序实例
2016/10/31 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
offsetParent 算法分析
2010/04/05 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
小程序实现分类页
2019/07/12 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python用requests实现http请求代码实例
2019/10/31 Python
python实现扫雷小游戏
2020/04/24 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
初入社会应届生求职信
2013/11/18 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
政治表现评语
2014/05/04 职场文书
新手上路标语
2014/06/20 职场文书
先进个人材料怎么写
2014/12/30 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers