投 稿 類 別 : 工 程 技 術 類 篇 名 : 井 字 生 死 戰 攻 略 作 者 : 陳 威 宇 國 立 臺 南 高 級 海 事 水 產 職 業 學 校 電 子 科 二 年 甲 班 邱 富 群 國 立 臺 南 高 級 海 事 水 產 職 業 學 校 電 子 科 二 年 甲 班 指 導 老 師 : 林 育 助 老 師 王 彥 盛 老 師
壹 前 言 家 喻 戶 曉 的 井 字 遊 戲 (Tic-Tac-Toe) 是 一 種 在 3x3 的 九 宮 格 內 所 進 行 的 連 珠 遊 戲, 和 五 子 棋 十 分 相 似, 有 別 於 一 般 五 子 棋 不 畫 邊 框, 且 格 線 排 列 成 井 字 形 而 得 名 遊 戲 進 行 時, 需 要 兩 位 玩 家 分 別 代 表 O 和 X 的 玩 家 輪 流 在 格 子 裡 留 下 各 自 的 標 記, 最 先 讓 自 己 的 標 記 在 井 字 符 號 內 連 成 一 條 直 線 的 玩 家 便 是 此 遊 戲 的 獲 勝 者 一 研 究 動 機 過 去 我 們 和 兄 弟 姊 妹 們 嬉 鬧 時, 常 以 井 字 遊 戲 來 延 伸 出 許 多 活 動, 但 光 陰 似 箭, 轉 瞬 之 間 我 們 擁 有 各 自 的 生 活 圈, 彼 此 的 距 離 也 漸 行 漸 遠 直 到 我 們 接 觸 了 Visual Basic 這 套 軟 體, 思 緒 就 像 是 陷 入 了 泥 沼 一 樣, 腦 海 不 斷 地 浮 現 出 過 往 的 點 點 滴 滴, 於 是 我 們 兩 個 就 決 定 將 這 個 井 字 遊 戲 的 程 式 作 為 時 光 寶 盒, 以 紀 念 我 們 那 一 去 不 返 的 童 年 時 光 二 研 究 方 法 使 用 兩 個 InputerBox 函 數 作 為 選 擇 玩 家 和 位 置 的 輸 入 介 面, 再 利 用 條 件 結 構 判 斷 是 否 有 輸 入 錯 誤 的 情 況 發 生, 並 用 MsgBox 函 數 顯 示 重 新 輸 入 的 訊 息 也 運 用 了 三 種 巢 狀 結 構 式 ( If~Then~Else~ ( 註 一 註 二 ) 和 If~Then~ElseIf~Then~Else ~ ( 註 一 註 二 ) 以 及 Select Case ( 註 一 註 二 ) 來 判 斷 玩 家 所 選 取 的 位 置 跟 獲 勝 的 玩 家, 再 用 MsgBox 函 數 輸 出 該 訊 息 三 論 文 大 綱 ( 一 ) 勝 利 與 失 敗 的 分 析 ( 二 ) 流 程 圖 ( 三 ) 程 式 碼 片 段 ( 四 ) 主 程 式 畫 面 ( 五 ) 結 論 ( 六 ) 引 註 資 料 貳 正 文 井 字 遊 戲 本 身 並 沒 有 什 麼 必 勝 方 法, 但 只 要 適 當 的 對 應, 就 可 以 保 持 不 敗, 換 句 話 說, 如 果 玩 家 雙 方 都 做 出 最 好 的 選 擇, 那 這 場 遊 戲 為 和 局 的 機 率 必 定 是 100% ( 註 三 ) 1
一 勝 利 與 失 敗 的 解 析 ( 一 ) 第 一 手 ( 在 此 以 O 為 例 ) 雖 然 有 九 種 選 擇, 但 如 果 將 整 個 遊 戲 旋 轉 翻 轉 之 後, 只 剩 下 三 種 選 擇, 如 下 圖 所 示, 即 選 取 1 2 5 這 三 種 位 置 編 號 此 遊 戲 總 共 有 數 十 億 種 結 果, 但 如 果 用 第 一 手 的 下 法 和 上 述 的 旋 轉 翻 轉 來 做 歸 納, 大 約 可 分 為 三 大 類 1 第 一 類 : 圖 一 : 位 置 編 號 1 圖 二 : 位 置 編 號 3 圖 三 : 位 置 編 號 7 圖 四 : 位 置 編 號 9 2 第 二 類 : 圖 五 : 位 置 編 號 8 圖 六 : 位 置 編 號 4 圖 七 : 位 置 編 號 2 圖 八 : 位 置 編 號 6 3 第 三 類 : 2
圖 九 : 位 置 編 號 5 ( 二 ) 當 第 一 手 開 局 時 下 在 角 落, 即 選 取 位 置 編 號 1 3 7 9, 第 二 手 大 致 上 有 三 種 選 擇 1 這 時 第 二 手 再 選 擇 位 置 編 號 2 3 6 9 時, 第 二 手 玩 家 必 定 為 輸 家 2 若 第 二 手 選 擇 位 置 編 號 5, 結 果 複 雜, 大 多 為 平 手 ( 1 ) 第 一 手 再 選 取 位 置 編 號 2, 結 果 為 平 局 ( 2 ) 第 一 手 再 選 取 位 置 編 號 3, 結 果 為 平 局 ( 3 ) 第 一 手 再 選 取 位 置 編 號 6, 有 六 種 結 果 第 一 種 : 第 二 手 選 擇 位 置 編 號 2, 結 果 為 平 局 第 二 種 : 第 二 手 選 擇 位 置 編 號 3, 結 果 為 平 局 第 三 種 : 第 二 手 選 擇 位 置 編 號 4, 第 二 手 玩 家 必 敗 第 四 種 : 第 二 手 選 擇 位 置 編 號 7, 第 二 手 玩 家 必 敗 第 五 種 : 第 二 手 選 擇 位 置 編 號 8, 結 果 為 平 局 第 六 種 : 第 二 手 選 擇 位 置 編 號 9, 結 果 為 平 局 ( 4 ) 第 一 手 再 選 取 位 置 編 號 9, 有 兩 種 結 果 第 一 種 : 第 二 手 選 擇 位 置 編 號 2, 結 果 為 平 局 第 二 種 : 第 二 手 選 擇 位 置 編 號 3, 第 二 手 玩 家 必 敗 ( 三 ) 當 第 一 手 開 局 時 下 在 邊 緣, 即 選 取 位 置 編 號 2 4 6 8, 第 二 手 可 分 為 五 種 選 擇 1 第 二 手 選 擇 位 置 編 號 1, 結 果 大 多 為 平 局 2 第 二 手 選 擇 位 置 編 號 4, 第 二 手 玩 家 必 敗 3 第 二 手 選 擇 位 置 編 號 5, 結 果 大 多 為 平 局 4 第 二 手 選 擇 位 置 編 號 7, 第 二 手 玩 家 必 敗 3
5 第 二 手 選 擇 位 置 編 號 8, 結 果 大 多 為 平 局 ( 四 ) 當 第 一 手 開 局 時 下 在 中 央, 即 選 取 位 置 編 號 5, 第 二 手 可 分 為 兩 種 選 擇 1 第 二 手 再 選 取 位 置 編 號 1, 大 概 有 四 種 結 果 ( 1 ) 第 一 手 再 選 取 位 置 編 號 2, 結 果 為 平 局 ( 2 ) 第 一 手 再 選 取 位 置 編 號 3, 結 果 為 平 局 ( 3 ) 第 一 手 再 選 取 位 置 編 號 6, 結 果 為 平 局 ( 4 ) 第 一 手 再 選 取 位 置 編 號 9, 第 二 手 有 三 種 選 擇 第 一 種 : 第 二 手 選 擇 位 置 編 號 2, 第 二 手 玩 家 必 敗 第 二 種 : 第 二 手 選 擇 位 置 編 號 3, 結 果 為 平 局 第 三 種 : 第 二 手 選 擇 位 置 編 號 6, 第 二 手 玩 家 必 敗 2 第 二 手 選 擇 位 置 編 號 2, 第 二 手 玩 家 必 敗 二 流 程 圖 開 始 Q2 輸 入 玩 家 代 號 a 輸 入 位 置 編 號 b 如 果 a 不 等 於 1 也 不 等 於 2 False Q2 如 果 b 小 於 1 或 b 大 於 9 False Q3 True True 顯 示 玩 家 代 號 輸 入 錯 誤, 請 重 新 輸 入 顯 示 位 置 編 號 輸 入 錯 誤, 請 重 新 輸 入 圖 十 : 輸 入 玩 家 代 號 圖 十 一 : 輸 入 位 置 編 號 4
Q3 該 位 置 編 號 b 是 否 為 空 白? False 顯 示 該 位 置 編 號 已 被 選 取 請 重 新 輸 入 Q2 True 該 位 置 顯 示 a 所 對 應 的 標 記 是 還 有 空 白 的 位 置 編 號 b? False 顯 示 平 手! 再 加 把 勁 是 否 有 三 個 標 記 連 成 一 條 線? False Q1 True 結 束 True 顯 示 恭 喜 玩 家 a 獲 勝! 圖 十 二 : 判 斷 是 否 獲 勝 三 程 式 碼 片 段 ( 一 ) Q1 程 式 碼 : Q1: a = Val(InputBox(" 請 輸 入 玩 家 代 號 ( 如 果 是 玩 家 一, 請 輸 入 1; 如 果 是 玩 家 二, 請 輸 入 2) "," 選 擇 玩 家 ")) If a = 0 Then GoTo Q7 ElseIf a < > 1 And a < > 2 Then MsgBox " 玩 家 代 號 輸 入 錯 誤, 請 重 新 輸 入 ", vbcritical + vbokonly, " 錯 誤 " GoTo Q1 Q1 標 籤 說 明 : 我 們 用 InputBox 來 接 收 玩 家 的 代 號, 如 果 a= 0 就 回 到 主 畫 面, 若 a 不 等 於 1 或 2, 便 顯 示 玩 家 代 號 輸 入 錯 誤, 請 重 新 輸 入 的 訊 息 方 塊 並 跳 到 Q1 再 次 輸 入 玩 家 代 號, 反 之 則 跳 到 Q2 標 籤 ( 二 ) Q2 程 式 碼 : Q2: b = InputBox(" 玩 家 " & a & " 請 輸 入 1~9 的 位 置 編 號 ", " 選 擇 位 置 ") 5
If b = 0 Then GoTo Q7 ElseIf b < 1 Or b > 9 Then GoTo Q5 Select Case b Case 1 If Image1.Picture = Spaces Then Image1.Picture = LoadPicture("D:\ 井 字 遊 戲 \ 圖 片 \O.jpg") d1 = 1: a = 2 If d1 = d2 And d2 = d3 Then GoTo L1 ElseIf d1 = d4 And d4 = d7 Then GoTo L4 ElseIf d1 = d5 And d5 = d9 Then GoTo L7 Else GoTo Q4 Else GoTo Q5 End Select Q2 標 籤 說 明 : 我 們 也 用 另 外 一 個 InputBox 來 接 收 玩 家 輸 入 的 位 置 編 號, 如 果 輸 入 小 於 1 或 大 於 9 的 數 字, 就 會 顯 示 位 置 編 號 輸 入 錯 誤, 請 重 新 輸 入 的 信 息 方 塊, 而 輸 入 0 則 會 回 到 主 程 式 畫 面, 假 設 我 們 選 擇 位 置 編 號 1, 且 該 位 置 已 被 選 取, 就 跳 至 Q5 的 標 籤 程 式 碼, 反 之 位 置 編 號 1 便 顯 示 該 玩 家 的 圖 形 ( 三 ) Q4 程 式 碼 : Q4: c = c + 1 If c = 9 Then MsgBox " 平 手! 請 再 加 把 勁 ", vbinformation + vbokonly, " 平 6
手!" GoTo Q5 Else GoTo Q2 Q4 標 籤 說 明 : 如 果 c=9 代 表 所 有 的 位 置 都 被 選 取 完 畢, 會 顯 示 " 平 手! 請 再 加 把 勁 " 的 訊 息 方 塊, 然 後 再 跳 至 Q5 標 籤, 否 則 跳 至 Q2 標 籤 ( 四 ) Q5 程 式 碼 : Q5: MsgBox " 該 位 置 已 被 選 取, 請 重 新 輸 入 ", vbcritical + vbokonly, " 錯 誤 " GoTo Q2 Q5 標 籤 說 明 : 顯 示 " 該 位 置 已 被 選 取, 請 重 新 輸 入 " 的 訊 息 方 塊, 欄 後 跳 至 Q2 標 籤 ( 五 ) L1 L4 和 L7 程 式 碼 : L1: Line5.Visible = True GoTo Q6 L4: Line8.Visible = True GoTo Q6 L7: Line11.Visible = True GoTo Q6 L1 L4 和 L7 標 籤 說 明 : 這 三 個 標 籤 分 別 顯 示 出 Line5 物 件 線 條 Line8 物 件 線 條 Line11 物 件 線 條, 並 跳 到 Q6 標 籤 7
( 六 ) Q6 程 式 碼 : Q6: If a = 1 Then a = 2 Else a = 1 MsgBox " 恭 喜 玩 家 " & a & " 獲 勝!", vbinformation + vbokonly, " 勝 利 " Q6 標 籤 說 明 : 因 為 a 變 數 所 接 收 到 的 玩 家 代 號 和 實 際 的 玩 家 代 號 相 反, 所 以 我 們 再 把 兩 個 a 變 數 的 資 料 做 交 換, 再 用 訊 息 方 塊 顯 示 恭 喜 玩 家 a 獲 勝! 四 主 程 式 畫 面 圖 十 三 : 井 字 遊 戲 規 則 與 舉 例 圖 十 四 : 井 字 遊 戲 主 程 式 畫 面 8
參 結 論 井 字 遊 戲 的 勝 敗 結 果 大 致 上 就 如 表 一 所 示 表 一 : 總 結 所 選 擇 的 位 置 編 號 第 一 手 開 局 第 二 手 回 應 結 果 1 3 7 9 2 3 6 9 第 二 手 戰 敗 5 多 為 和 局 2 4 6 8 1 和 局 4 第 二 手 戰 敗 5 和 局 7 第 二 手 戰 敗 8 和 局 5 1 多 為 和 局 2 第 二 手 戰 敗 建 議 先 手 玩 家 在 開 局 時, 先 選 取 四 個 邊 緣, 這 樣 後 手 玩 家 除 了 選 取 位 在 中 心 點 的 位 置 編 號 5 以 外, 其 他 位 置 注 定 會 失 敗, 既 使 對 手 已 選 取 了 該 位 置, 只 要 使 用 對 角 線 佈 局, 也 可 以 有 50% 的 獲 勝 機 率 開 局 時 先 手 也 可 以 選 擇 位 置 編 號 5, 因 為 後 手 玩 家 選 取 四 個 角 落 一 定 會 大 敗, 就 算 對 手 選 取 該 位 置, 只 還 要 再 選 取 對 手 的 另 一 個 對 角 也 可 以 創 造 出 2/3 的 勝 算 但 如 果 位 置 編 號 5 是 空 的, 且 後 手 玩 家 也 想 扳 回 一 城, 那 後 手 的 第 一 步 就 選 擇 位 置 編 號 5, 否 則 選 取 四 個 角 落 比 較 不 會 成 為 輸 家, 以 下 是 一 些 可 以 用 來 參 考 的 訣 竅 一 阻 擋 : 如 果 對 手 有 兩 個 標 記, 需 阻 止 對 手 把 它 們 變 成 三 個 連 在 一 起 的 標 記 二 分 枝 : 製 造 可 讓 自 己 透 過 兩 條 路 徑 勝 利 的 局 面 ( 註 四 ), 如 圖 十 五 的 O 標 記 所 示 圖 十 五 : 分 枝 圖 9
三 阻 止 對 方 形 成 分 枝 ( 一 ) 佔 據 對 方 用 來 製 造 分 枝 的 共 接 點 ( 二 ) 再 開 發 另 一 條 分 枝, 迫 使 對 手 阻 擋, 但 對 手 的 阻 撓 不 能 造 成 對 手 獲 勝 四 如 果 對 手 選 取 角 落 的 位 置 編 號, 就 選 擇 與 對 手 相 對 的 角 落 原 本 認 為 井 字 遊 戲 非 常 容 易 製 作, 但 在 本 次 實 作 中, 卻 遇 到 許 多 數 不 清 的 難 題, 其 中 一 項 便 是 程 式 執 行 途 中 不 能 停 止, 必 須 讓 兩 位 玩 家 分 出 勝 負 後 才 能 結 束 程 式, 為 了 改 善 這 種 困 境, 我 們 讓 兩 個 InputBox 輸 入 0 就 會 回 到 主 畫 面, 但 因 為 再 繼 續 進 行 遊 戲 會 有 作 弊 的 嫌 疑, 所 以 要 繼 續 玩 的 話, 就 只 能 重 新 開 始 了 還 有, 每 輪 流 一 次 玩 家, 就 必 須 重 新 輸 入 玩 家 代 號, 但 後 來 發 現 這 樣 會 帶 來 使 用 者 的 不 便, 所 以 我 們 改 成 由 程 式 來 協 助 使 用 者 交 替 玩 家 代 號, 藉 此 增 加 遊 戲 進 行 的 流 暢 度 撰 寫 程 式 碼 時, 也 常 因 為 使 用 太 多 的 條 件 結 構, 讓 腦 袋 陷 入 了 混 亂, 完 全 不 知 道 自 己 編 寫 到 哪 一 段, 甚 至 還 因 此 寫 錯 了 程 式 碼, 籌 下 了 無 窮 迴 圈 的 大 錯, 雖 然 最 後 都 順 利 解 決 了, 但 程 式 完 成 後 才 知 道 即 使 用 最 簡 便 的 素 材, 也 必 須 要 擁 有 超 脫 世 俗 的 邏 輯 思 考 才 能 掌 握 住 程 序 性 語 言 的 活 性 雖 然 井 字 遊 戲 只 有 九 個 格 子, 但 只 要 再 努 力 鑽 研 一 下, 就 可 以 開 創 出 五 子 棋 圍 棋 等 遊 戲, 假 設 臺 灣 朝 這 個 方 向 邁 進, 說 不 定 能 創 造 出 一 邊 培 養 智 力 一 邊 消 磨 時 間 的 遊 戲, 讓 社 會 大 眾 可 以 在 無 形 之 中 激 發 大 腦 的 潛 在 力 量, 提 升 臺 灣 的 人 文 素 養 並 增 進 生 活 的 巧 思 與 智 慧 肆 參 考 文 獻 註 一 : 吳 文 立 李 亮 生 陳 源 宏 (2005) 程 式 語 言 I 台 北 市 : 旗 立 資 訊 註 二 : 阿 惟 (2003) Visual Basic. NET 進 銷 存 程 式 設 計 實 作 台 北 市 : 文 魁 資 訊 註 三 : 井 字 遊 戲 不 敗 秘 訣 2011 年 11 月 27 日, 取 自 http://oddest.nc.hcc.edu.tw/math142.htm 註 四 : 井 字 棋 _ 百 度 百 科 2011 年 12 月 10 日, 取 自 http://baike.baidu.com/view/1744778.htm 10