Skip to content

「图形化编程」Micro:bit 井字棋游戏(二)

titu

提到井字棋,想必大家都不陌生,就是两个玩家轮流在一个井字型的 9 宫格里画 x 和 o,当某一方的棋子连成了一条线(横向,竖向和对角线),那么该方获胜,如果格子被填满也没有人成功连线,则平局。这次我们来学习如何用 micro:bit 实现一个井字棋小游戏。最终的实现效果详见 「预告」「图形化编程」Micro:bit 井字棋 小游戏

通过 上节教程 我们实现了光标移动,A B 玩家轮流下棋的逻辑,这节教程我们将会学习处理异常情况,比如当前光标位置已经有棋子了,显示一个 X,不让玩家再在当前位置下棋。先来看看效果

xo2

编程工作很多时候都是在处理异常情况,我们要应对各种可能出现的异常,为了使程序能够正常走下去。就拿这个井字棋小游戏来说,可能的异常情况有:

  1. 一方玩家连续下两颗棋子
  2. 当前位置已经有棋子,玩家试图再在当前位置下棋
  3. 所有棋盘位置上都有棋子,无法再继续游戏,需要判断游戏的输赢还是平局

其中第一种异常情况我们已经在 上节教程 里处理过了,当玩家连续下两颗棋子时,会显示一个指向对方按钮的箭头,这节教程我们来处理剩下两种情况。
先载入上节课完成的 hex 文件,如果你没有来得及看上节课的教程,可以看这个链接 上节教程,如果你想直接做这个教程,那可以在公众号回复关键字 hex,获取 hex 文件的下载地址,找到 图形化编程」Micro:bit 井字棋游戏(一)的下载地址,然后上传到 https://makecode.microbit.org/ 上就可以接着做本节课的教程了,关于 hex 文件的用法可以看看 Micro:bit 项目管理与 hex 文件的使用

判断是否可以落子

判断是否落子的原理在于当 A 或者 B 按钮按下时,判断 qiziliebiao 里已经存在的精灵的坐标是否与精灵 guangbiao 所在位置的 x 值 和 y 值相等,如果相等则证明当前位置已经有棋子了,如果没有任何一个相等,则证明没有棋子,可以下棋

  1. 创建一个 新函数,命名为 jianchashifoukeyiluozi
  2. 创建一个 新变量,命名为 keyiluozi,并设置它的值为 逻辑分类 里的 true
  3. 循环遍历 保存棋子精灵的数组 qiziliebiao,并 把取出的元素放到 一个新变量 yijingcunzaideqizi 里
  4. 判断 yijingcunzaideqizi 的 x 坐标 和 y 坐标 是否都和 当前光标精灵 guangbiao 的 x 坐标 和 y 坐标相等,如果都相等,则把 keyiluozi 设置为 false
  5. 在循环完之后判断 keyiluozi,如果可以落子,则 调用 luozi 函数
  6. 否则证明当前位置已近有棋子,显示 x

jianchashifoukeyiluozi

修改 A B 按钮响应事件

接着要修改 A B 按钮的响应事件,因为我们要先判断是否可以落子,然后再调用落子,所以改为在按钮响应事件里调用 jianchashifoukeyiluozi 函数,代替 luozi,因为 luozi 函数将会在检查是否可以落子之后调用

xiugaianniuxiangyingshijian

处理棋盘满的情况

处理棋盘是否满的情况非常简单,只要在落子之后,判断保存了所有棋子精灵的数组 qiziliebiao 的长度,如果为 9,则证明棋盘已经满了,这里没有判断输赢,所以我们直接显示 Draw Game 代表平局

  1. 创建一个新函数,命名为 jianchanshengfu
  2. 判断 数组 qiziliebiao 的长度,如果为 9,则说明 棋盘已经满了,因为一共只有 9 个位置
  3. 显示字符串 “Draw Game”
  4. 游戏结束
    jianchashengfu1 1

  5. 修改 luozi 函数,调用 jianchashengfu 函数,这样就会在落子之后判断是否棋盘满了,如果满了则游戏结束

luozi2

至此异常处理的部分就结束啦。下节教程我们会学习一个简单的算法,用来判断到底是谁赢了,敬请期待吧。

完整程序图:

xo2

Hex 文件

这节教程的完整实现 hex 文件在公众号回复关键字 hex 可以获取下载链接。

4 2 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x