井字棋盘看起来像一个大的井字符号(#),有 9 个空格,可以包含 X、O 或空要用字典表示棋盘,可以为每个空格分配一个字符串键,如图 5-2 所示。

可以用字符串值来表示,棋盘上每个空格有什么:'X'、'O'或' '(空格字符)。因此,需要存储 9 
个字符串。可以用一个字典来做这事。带有键'top-R'的字符串表示右上角,带有键'low-L'的字符串表示左下角,带有键'mid-M'的字符串表示中间,以此类推。
这个字典就是表示井字棋盘的数据结构。将这个字典表示的棋盘保存在名为 theBoard  的变量中。打开一个文件编辑器窗口, 输入以下代码, 并保存为 ticTacToe.py:
theBoard   =   {'top-L':   '   ',   'top-M':   '   ',   'top-R':   '   ',
'mid-L':   '   ',   'mid-M':   '   ',   'mid-R':   '   ',
'low-L':   '   ',   'low-M':   '   ',   'low-R':   '   '}
保存在 theBoard 变量中的数据结构,表示了图 5-3 中的井字棋盘。

因为 theBoard 变量中每个键的值都是单个空格字符,所以这个字典表示一个完全干净的棋盘。如果玩家 X 选择了中间的空格,就可以用下面这个字典来表示棋盘:

theBoard   =   {'top-L':   '   ',   'top-M':   '   ',   'top-R':   '   ',
'mid-L':   '   ',   'mid-M':   'X',   'mid-R':   '   ',
'low-L':   '   ',   'low-M':   '   ',   'low-R':   '   '}
theBoard 变量中的数据结构现在表示图 5-4 中的井字棋盘。

一个玩家O 获胜的棋盘上,他将 O 横贯棋盘的顶部,看起来像这样:
theBoard   =   {'top-L':   'O',   'top-M':   'O',   'top-R':   'O',
'mid-L':   'X',   'mid-M':   'X',   'mid-R':   '   ',
'low-L':   '   ',   'low-M':   '   ',   'low-R':   'X'}
theBoard 变量中的数据结构现在表示图 5-5 中的井字棋盘。

当然,玩家只看到打印在屏幕上的内容,而不是变量的内容。让我们创建一个

函数,将棋盘字典打印到屏幕上。将下面代码添加到 ticTacToe.p(y
theBoard   =   {'top-L':   '   ',   'top-M':   '   ',   'top-R':   '   ',
'mid-L':   '   ',   'mid-M':   '   ',   'mid-R':   '   ',
'low-L':   '   ',   'low-M':   '   ',   'low-R':   '   '}
def  printBoard(board):

新代码是黑体的):

print(board['top-L']  +  '|'  +  board['top-M']  +  '|'  +  board['top-R']) print('-+-+-')
print(board['mid-L']  +  '|'  +  board['mid-M']  +  '|'  +  board['mid-R']) print('-+-+-')
print(board['low-L']  +  '|'  +  board['low-M']  +  '|'  +  board['low-R']) printBoard(theBoard)
运行这个程序时,printBoard()将打印出空白井字棋盘。

|  |
-+-+-
|  |
-+-+-
|  |

printBoard()函数可以处理传入的任何井字棋数据结构。尝试将代码改成以下的样子:
theBoard  =  {'top-L':  'O',  'top-M':  'O',  'top-R':  'O',  'mid-L':  'X',  'mid-M':
'X',  'mid-R':  '  ',  'low-L':  '  ',  'low-M':  '  ',  'low-R':  'X'}

def  printBoard(board):
print(board['top-L']  +  '|'  +  board['top-M']  +  '|'  +  board['top-R']) print('-+-+-')
print(board['mid-L']  +  '|'  +  board['mid-M']  +  '|'  +  board['mid-R']) print('-+-+-')
print(board['low-L']  +  '|'  +  board['low-M']  +  '|'  +  board['low-R']) printBoard(theBoard)
现在运行该程序,新棋盘将打印在屏幕上。
O|O|O
-+-+-
X|X|
-+-+-
|  |X

因为你创建了一个数据结构来表示井字棋盘,编写了 
printBoard()中的代码来解释该数据结构,所以就有了一个程序,对井字棋盘进行了“建模”。也可以用不同的方式组织数据结构(例如,使用'TOP-LEFT'这样的键来代替'top-L'),但只要代码
能处理你的数据结构,就有了正确工作的程序。
例如,printBoard()函数预期井字棋数据结构是一个字典,包含所有 9 个空格的键。假如传入的字典缺少'mid-L'键,程序就不能工作了。
O|O|O
-+-+-
Traceback  (most  recent  call  last):
File  "ticTacToe.py",  line  10,  in  <module> printBoard(theBoard)
File  "ticTacToe.py",  line  6,  in  printBoard
print(board['mid-L']  +  '|'  +  board['mid-M']  +  '|'  +  board['mid-R']) KeyError:  'mid-L'
现在让我们添加代码,允许玩家输入他们的着法。修改 ticTacToe.py 程序如下所示:

theBoard  =  {'top-L':  '  ',  'top-M':  '  ',  'top-R':  '  ',  'mid-L':  '  ',  'mid-M':  '
',  'mid-R':  '  ',  'low-L':  '  ',  'low-M':  '  ',  'low-R':  '  '}

def  printBoard(board):
print(board['top-L']  +  '|'  +  board['top-M']  +  '|'  +  board['top-R']) print('-+-+-')
print(board['mid-L']  +  '|'  +  board['mid-M']  +  '|'  +  board['mid-R']) print('-+-+-')
print(board['low-L']  +  '|'  +  board['low-M']  +  '|'  +  board['low-R'])
turn  =  'X'
for  i  in  range(9):
➊            printBoard(theBoard)

print('Turn  for  '  +  turn  +  '.  Move  on  which  space?')
➋            move  =  input()
➌            theBoard[move]  =  turn
➍            if  turn  ==  'X': turn  =  'O'
else:
turn  =  'X'
printBoard(theBoard)

新的代码在每一步新的着法之前,打印出棋盘➊,获取当前棋手的着法➋,相应地更新棋盘➌,然后改变当前棋手➍,
进入到下一着。
运行该程序,它看起来像这样:

|  |
-+-+-
|  |
-+-+-
|  |
Turn  for  X.  Move  on  which  space?
mid-M
|  |
-+-+-
|X|
-+-+-
|  |
Turn  for  O.  Move  on  which  space?
low-L
|  |
-+-+-
|X|
-+-+-
O|  |
--snip-- O|O|X
-+-+-
X|X|O
-+-+-
O|  |X
Turn  for  X.  Move  on  which  space?
low-M
O|O|X
-+-+-
X|X|O
-+-+-
O|X|X
这不是一个完整的井字棋游戏(例如,它并不检查玩家是否获胜),但这已足够展示如何在程序中使用数据结构。
注意       如果你很好奇, 完整的井字棋程序的源代码在网上有介绍, 网址是
http://nostarch.com/automatestuff/。

5.3.1 井字棋盘相关推荐

  1. 用Unity3D实现简单的井字棋小游戏

    用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...

  2. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  3. python小游戏井字棋(人机对战)

    游戏简介:在九宫格内进行,如果一方抢先于另一方向(横.竖.斜)连成3子,则获得胜利.游戏中输入方格位置代号的形式如下: 设计前的思路: 游戏中,board棋盘存储玩家.计算机的落子信息,未落子处未EM ...

  4. c语言井字棋程序设计报告,井字棋游戏(课程设计)总结报告.doc

    井字棋游戏(课程设计)总结报告 C语言贪吃蛇游戏设计总结报告 PAGE PAGE 5 丽水学院 计算机信息学院 <C语言课程设计(短一)> 指 导 书 二 ○ 一一 年 三 附件二 封面格 ...

  5. python井字棋_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  6. python井字棋代码_python井字棋算法及代码

    井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X.O 或 关于落子问题 由于只能采用键盘输入,所以需要对棋盘进行坐标表示: 即直接用1-9个9个数字来表示位置, 7|8|9 -+-+- ...

  7. python井字棋最大最小算法_python井字棋算法及代码

    井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X.O 或 关于落子问题 由于只能采用键盘输入,所以需要对棋盘进行坐标表示: 即直接用1-9个9个数字来表示位置, 7|8|9 -+-+- ...

  8. 使用Java实现alpha-beta剪枝算法(井字棋小游戏)

    1.初始化游戏界面: /*** 初始化游戏界面:*/public void StartGream() {for (int i = 1; i < 4; i++)for (int j = 1; j ...

  9. 还在动手画棋盘 ?20分钟带你用Java写一个井字棋!

    还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 文章目录 还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 前言 设计过程 1.创建窗体类MyGameWindow 2.创建窗体的构造器 ...

最新文章

  1. css布局中的居中问题
  2. MongoDB主从复制介绍(转)
  3. CentOS 6.x 使用安装光盘作为yum源
  4. mvc设计模式现在过时了吗_尚学堂115——设计模式、源码分析以及SpringData
  5. 如何查看java对象的大小
  6. [error] OpenEvent(Global\ngx_stop_25184) failed (2: The system cannot find the file specified)
  7. 我听到了一个熟息的GuanDan声音
  8. 在集合中根据条件来筛选数据
  9. Delphi IOS (二)
  10. git提交远程报错[rejected] master - master (fetch first)
  11. 使用可自定义的定期计划自动执行数据库备份
  12. sql server 多条记录数据合并为一条_面试必备sql知识点——MySQL基础
  13. 面向对象(Python):学习笔记之私有属性和私有方法
  14. java_获得用户显示器大小
  15. 用 Python 玩视频剪辑 让生活简易化
  16. seaborn调色板 color, hls, cubehelix, dark, diverging_palette
  17. 2012年中国285个地级市名单、各地级市对应车牌号代码
  18. 憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台
  19. 手把手Selenium安装使用及实战爬取前程无忧招聘网站(一)
  20. 【PHM】PHM算法与智能分析技术——数据处理与特征提取方法2

热门文章

  1. 贫穷太容易让人失去尊严
  2. 《POPPIN滑步基本教学》--- 供初学者参考!!!
  3. java:分割字符串(指定范围分割和次数)
  4. 2018年,你一定要选对这些原型工具
  5. 很容易就放弃的摄影学习
  6. Java生成每种字符都是奇数个的字符串leetcode_1374
  7. 选择分支语句详解--(if与witch的使用)
  8. 金融信创与云化转型|期货超融合架构转型与场景探索合集
  9. 单反相机SD卡报错示例
  10. 趣图 | 这大概就是人狠话不多