使用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中有趣在__call__函数
Jun 21 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
利用Python实现Windows定时关机功能
Mar 21 Python
python发送邮件实例分享
Jul 28 Python
Python学习笔记之if语句的使用示例
Oct 23 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Django权限机制实现代码详解
Feb 05 Python
windows下python安装小白入门教程
Sep 18 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Jupyter加载文件的实现方法
Apr 14 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python可以用来做什么
2020/11/23 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
招商引资工作汇报
2014/10/28 职场文书
端午节寄语2015
2015/03/23 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
MySQL注入基础练习
2021/05/30 MySQL