Johnny Go!? Computer Organization and Assembly Languages Final Project Authors: B95902018 邱 珮 甄 B95902014 陳 奕 安 B95902075 林 士 涵 B95902121 黃 詠 筑 NTU_CSIE Fall, 2007
Johnny Go!? 小 囧 下 樓 梯 前 言 期 末 考 終 於 結 束 了, 但 是 還 有 最 後 一 科 作 業 我 們 才 正 式 告 別 大 二 上 組 語 project 但 是 對 於 原 本 就 不 是 程 式 高 手 的 我 們 這 一 組 的 成 員 們 來 說, 要 用 組 語 寫 出 一 份 像 樣 的 報 告 其 實 是 頗 具 難 度 的, 但 是 身 為 一 群 台 大 資 工 的 學 生, 如 果 連 這 一 步 都 克 服 不 了, 以 後 也 沒 什 麼 好 談 的 了, 我 們 如 是 想, 也 就 更 不 願 意 草 草 了 事 圖 個 輕 鬆, 於 是, 我 們 選 擇 了 學 期 尾 聲 教 的 intel x86, 決 定 全 程 都 用 組 語 寫 出 一 個 " 小 朋 友 下 樓 梯 " 的 小 遊 戲, 希 望 能 藉 由 這 次 期 末 報 告 讓 我 們 本 身 的 程 式 能 力 獲 得 進 步 選 用 intel 的 原 因 在 於 我 們 本 身 並 不 是 很 有 經 驗 的 programmer, 而 對 於 組 語 的 經 驗 更 是 少 之 又 少, 大 概 就 僅 限 於 平 常 的 作 業 範 圍 吧! 平 常 寫 一 些 ACM 或 一 些 小 程 式 之 類 的 也 不 會 想 動 用 到 組 語, 所 以 為 了 能 夠 更 加 熟 悉 組 合 語 言, 且 為 了 儘 快 上 手, 我 們 選 擇 了 有 有 經 驗 的 學 長 ( 再 次 感 謝 B94 楊 逸 民 學 長 提 供 寶 貴 的 經 驗 ) 可 以 請 教 的 intel 當 作 我 們 的 語 言 而 會 選 小 朋 友 下 樓 梯 這 款 遊 戲, 最 主 要 是 考 慮 到 這 個 遊 戲 的 組 成 元 素 較 為 單 純 ( 兩 個, 小 朋 友 和 樓 梯 ), 有 助 於 我 們 四 人 分 工 上 的 方 便, 而 且 具 有 動 態 性, 不 是 益 智 性 的 靜 態 遊 戲, 遊 戲 性 較 高, 因 此 我 們 選 擇 了 這 款 小 遊 戲 而 經 過 了 一 個 禮 拜 幾 乎 不 眠 不 休 的 討 論 +coding+debug, 歷 經 兩 千 多 行 的 code, 程 式 功 力 薄 弱 的 我 們 也 終 於 寫 出 了 一 些 成 果, 以 下 請 看 我 們 盡 己 所 能 做 出 來 的 " 小 囧 下 樓 梯 "! 2
目 錄 小 囧 的 出 現 p. 4-7 樓 梯 的 產 生 p. 8-9 指 尖 的 動 與 靜 Keyboard p. 10-11 小 囧 下 樓 梯 初 階 版 p. 12-13 小 囧 即 將 陎 臨 的 挑 戰 關 卡 的 設 計 消 失 的 樓 梯 p.14-15 帶 刺 的 樓 梯 p.16 出 不 去 的 樓 梯 p.17-19 戳 到 必 死 無 疑 的 針 p.20-21 破 關 的 籌 碼 記 分 板 的 設 計 p. 22-23 玩 家 的 好 幫 手 進 版 畫 陎 p. 24-25 你 贏 了 嗎? 破 關 畫 陎 p. 26 結 語 p.27 3
小 囧 的 出 現 一 切 都 從 點 開 始 實 作 : 邱 珮 甄 Report: 邱 珮 甄 原 先 在 決 定 要 做 小 朋 友 下 樓 梯 時, 大 家 就 有 在 討 論 我 們 的 主 角 小 朋 友 是 要 以 什 麼 樣 的 形 態 出 現, 還 在 天 馬 行 空 的 期 間, 大 家 都 十 分 憧 憬 做 出 很 千 變 萬 化 的 小 朋 友 下 樓 梯, 紛 紛 避 重 就 輕 的 討 論 我 們 要 設 什 麼 樣 的 關 卡 有 什 麼 樣 的 死 亡 方 式 等 等, 討 論 這 些 愉 快 的 topic 時 間 總 是 一 下 就 過 去 了 直 到 有 經 驗 的 學 長 在 一 旁 給 了 我 們 當 頭 棒 喝 : 你 們 現 在 拼 命 想 這 些 夢 幻 的 關 卡, 還 不 如 先 來 思 考 要 如 何 使 一 團 點 自 動 的 往 下 移 動! 當 時 大 家 才 猛 然 發 覺, 最 基 本 但 最 必 要 的 其 實 早 在 眼 前, 只 是 我 們 都 刻 意 忽 略 了! 於 是, 這 便 成 了 我 們 著 手 project 的 起 始 點 研 究 方 式 與 遇 到 的 困 難 : 1. 一 點 自 動 直 直 向 下 掉 小 朋 友 下 樓 梯 和 一 般 遊 戲 不 太 一 樣 的 地 方 是, 它 並 不 是 單 純 接 收 按 鍵 才 會 移 動, 在 沒 按 鍵 且 不 在 樓 梯 上 的 時 候, 是 會 在 空 中 直 直 墜 落 的 因 此, 我 們 打 算 以 先 完 成 一 個 點 能 夠 直 直 墜 落 為 目 標, 再 進 行 下 一 步 驟 首 先, 要 能 夠 呈 現 一 個 點, 我 們 使 用 到 int 10h 中 的 0Ch (Write Graphics Pixel) 來 幫 我 們 實 現 範 例 code 如 下 : mov ah, 0Ch ; write graphics pixel mov al, COLOR_ball ; 要 畫 的 點 顏 色 mov bh, 0 ; video page 0 mov cx, currentx ; 要 畫 的 點 X 座 標 mov dx, currenty ; 要 畫 的 點 Y 座 標 int 10h 利 用 了 int 10h 中 的 0Ch, 便 可 在 螢 幕 上 呈 現 想 要 畫 的 圖 案 (Figure 1) 成 功 的 話 出 一 個 點 之 後, 接 下 來 就 必 頇 思 考 該 如 何 使 它 直 直 下 墜 我 們 用 的 方 式 是 先 將 上 一 個 點 擦 去 ( 意 即 以 背 景 色 圖 滿 ), 再 於 下 一 個 我 們 希 望 的 地 方 重 4
畫 一 個 點, 重 畫 的 方 式 如 同 以 上, 以 目 前 只 是 要 直 直 下 墜 的 情 況 為 例, 只 要 currenty 遞 增, 便 可 達 成 如 此 以 loop 的 方 式 不 斷 將 畫 陎 刷 新, 直 到 點 已 超 過 邊 界 判 斷 點 是 否 超 過 邊 界 的 方 式 是 以 conditional jump 的 方 式, 當 currenty 已 達 200( 即 邊 界 值 ), 便 可 exit (currentx, currenty) 2. 一 點 可 以 在 空 中 左 右 移 動 小 朋 友 下 樓 梯 這 個 遊 戲 特 別 的 地 方 就 在 於, 因 為 小 朋 友 大 部 分 的 時 間 是 不 在 樓 梯 上 的, 在 空 中 時 便 會 自 然 往 下 墜, 此 時 如 果 玩 家 按 左 鍵 或 是 右 鍵, 便 應 該 形 成 斜 下 的 情 形, 此 時 便 需 接 收 keyboard 的 訊 息 ( 詳 細 情 形 請 參 照 Keyboard 部 分 ), 當 玩 家 按 左 鍵 時, 點 便 會 往 左 下 移 動 ; 當 玩 家 按 右 鍵 時, 點 便 會 往 右 下 移 動 但 此 時 會 有 一 些 特 別 情 況 發 生, 也 就 是 當 點 現 在 位 置 位 於 左 右 邊 界 時, 點 無 法 往 左 ( 右 ) 下, 只 能 夠 往 下 移 動 因 此 必 頇 要 有 一 個 conditional jump, 去 判 斷 此 時 的 X 座 標 是 否 於 左 右 邊 界 範 例 code 如 下 : mov ah, 0Ch ; write graphics pixel mov al, COLOR_ball mov bh, 0 mov cx, currentx cmp cx, 0 ; 判 斷 此 時 的 X 座 標 是 否 在 左 邊 界 je NoKeyWaiting ; 如 果 已 在 左 邊 界 便 jump 離 開 sub cx, 1 ; 往 左 一 格 mov currentx, cx ; 移 動 之 後 重 設 X 座 標 mov dx, currenty inc dx ; 往 下 一 格 int 10h 5
如 此, 便 可 讓 點 在 空 中 左 右 移 動 (Figure 2) 3. 囧 可 以 在 空 中 左 右 移 動 成 功 的 讓 一 個 點 在 空 中 左 右 移 動 之 後, 接 下 來 的 任 務 便 是 要 讓 一 團 點 能 夠 在 空 中 左 右 移 動 這 會 是 一 個 相 當 麻 煩 的 作 業, 因 為 要 想 辦 法 讓 這 團 點 中 的 每 一 個 點 都 能 夠 成 功 移 到 正 確 的 位 置 一 開 始 我 們 想 過 許 多 種 方 法, 一 是 將 整 個 畫 陎 刷 新, 也 就 是 重 畫 每 一 個 pixel, 但 這 樣 可 能 會 遇 到 的 困 難 是 速 度 會 過 慢, 而 我 們 要 移 動 的 只 是 一 團 相 同 顏 色 且 知 道 大 小 的 點 而 已, 因 此 後 來 決 定 不 刷 新 整 個 畫 陎, 而 是 只 重 畫 整 團 點 當 我 們 還 沒 決 定 要 用 什 麼 圖 案 時, 是 以 球 的 造 型 登 場! 利 用 一 個 procedure 專 門 製 造 球 的 功 能, 先 將 現 在 位 置 的 球 擦 去, 再 利 用 invoke 傳 入 新 座 標 給 製 造 球 的 procedure, 最 後 於 新 座 標 畫 出 一 個 移 動 過 後 的 球 (Figure 3) 新 座 標 舊 座 標 6
但 由 於 由 點 構 成 的 球 實 在 不 是 很 好 看, 因 此 我 們 決 定 不 以 球 做 為 我 們 的 小 朋 友, 在 幾 番 討 論 之 下, 我 們 決 定 以 Johnny 囧 尼, 做 為 我 們 的 主 角! 因 此, 移 動 的 就 會 是 一 個 囧 字, 我 們 使 用 的 方 法 與 球 類 似, 用 一 個 procedure 專 門 製 造 囧, 之 後 在 我 們 遊 戲 的 過 程 中 不 斷 的 刷 新 畫 陎, 擦 去 原 先 的 囧, 新 增 新 位 置 的 囧 若 是 判 斷 到 使 用 者 按 左 ( 右 ) 鍵 便 更 新 一 個 新 的 座 標, 並 以 新 座 標 invoke 囧 的 procedure, 若 沒 有 接 收 到 按 鍵 便 直 直 下 墜 範 例 code 如 下 : ;------------------------------------ Jone PROC, X: WORD, Y: WORD ; Jone drawing ;------------------------------------ mov cx, currentx cmp cx, 0 je NoKeyWaiting dec currentx inc currenty invoke Jone, currentx, currenty ; 設 了 新 座 標 之 後 invoke Jone 的 procedure 去 製 作 新 座 標 的 囧 ret Jone ENDP 但 在 完 成 之 後 我 們 發 現, 左 右 移 動 時 或 許 是 因 為 要 判 斷 按 鍵, 因 此 視 覺 上 讓 人 覺 得 移 動 較 慢, 為 避 免 這 個 情 形, 我 們 採 取 的 策 略 是, 一 次 向 左 ( 右 ) 移 動 兩 格, 向 下 仍 然 維 持 移 動 一 格, 如 此 便 可 達 成 左 右 與 向 下 移 動 不 會 有 太 大 的 速 差 完 成 囧 的 移 動 只 是 我 們 Final Project 的 開 胃 菜, 接 下 來 與 樓 梯 的 合 併 才 會 是 真 正 困 難 的 主 菜, 但 是 完 成 此 項 任 務 對 我 們 來 說, 已 經 是 一 針 強 大 的 強 心 劑 了! 7
樓 梯 的 產 生 實 作 : 陳 奕 安 Report: 陳 奕 安 研 究 動 機 : 這 一 時 期 我 們 還 沒 有 任 何 樓 梯 的 雛 形, 所 以 第 一 階 段 要 做 的 是 先 畫 出 一 個 不 會 動 的 樓 梯 在 螢 幕 上, 第 二 階 段 就 是 讓 它 動 起 來, 而 第 三 階 段 就 是 同 時 讓 很 多 個 樓 梯 隨 機 出 現 並 且 動 起 來 研 究 過 程 : 第 一 階 段 : 這 一 部 分 問 題 比 較 少, 我 們 的 方 法 是 畫 三 條 水 平 線 疊 在 一 起, 這 個 部 份 用 到 了 int 10h 中 的 0Ch, 也 就 是 " 對 一 個 pixel" 著 色, 重 複 這 個 動 作 並 在 恰 當 的 時 機 換 行, 即 可 達 成 目 的, 而 這 裡 最 重 要 的 就 是 ASM 迴 圈 的 寫 法 這 裡 值 得 注 意 的 是 要 隨 時 注 意 暫 存 器 裡 存 的 究 竟 是 什 麼 東 西, 因 為 暫 存 器 cx 隨 時 都 要 當 counter 而 同 時 也 是 call 0Ch 時 儲 存 x 軸 的 位 置, 所 以 一 定 要 很 注 意 stack 中 的 情 況, 我 們 整 個 製 作 的 過 程 常 常 發 生 stack 中 的 東 西 忘 記 pop 而 使 資 料 錯 亂 的 情 形 第 二 階 段 : 我 們 讓 樓 梯 動 起 來 的 方 式 是 不 斷 的 把 樓 梯 擦 掉 再 重 畫 在 上 陎 一 格 的 位 置, 但 是 如 果 這 樣 做 的 話 會 讓 整 體 速 度 下 降, 所 以 我 們 改 成 只 擦 掉 樓 梯 最 下 陎 一 層, 然 後 在 樓 梯 上 陎 一 層 畫 一 層 新 的 樓 梯, 這 樣 就 得 到 " 往 上 一 格 " 的 效 果, 而 且 要 移 動 的 部 份 也 變 少 了, 簡 單 來 說, 就 是 比 對 移 動 前 後 差 異 的 部 份, 然 後 去 改 變 那 些 差 異 的 部 分 即 可, 速 度 有 因 此 加 快 了 不 少 8
第 三 階 段 : 這 一 部 份 相 當 困 難, 因 為 組 語 中 暫 存 器 的 數 目 有 限, 但 是 如 果 一 直 用 memory 宣 告 變 數 在 執 行 上 又 會 非 常 慢, 這 樣 就 無 法 讓 每 個 樓 梯 的 位 置 都 記 錄 下 來, 如 果 不 紀 錄 而 是 去 地 毯 式 的 讀 取 螢 幕 上 的 每 一 個 點 的 話, 則 會 發 生 運 算 過 久 的 情 形, 所 以 我 們 一 開 始 不 知 道 的 時 候, 曾 經 做 出 一 個 幾 乎 是 一 格 一 格 動 的 樓 梯 群, 所 以 我 們 發 現 爆 搜 絕 對 不 是 一 個 可 行 的 途 徑, 只 好 另 尋 他 法 解 決 方 法 : 最 後 我 決 定 從 改 良 演 算 法 方 陎 著 手, 最 後 想 出 來 的 方 法 是 把 所 有 樓 梯 彼 此 建 立 關 係, 也 就 是 固 定 住 樓 梯 與 樓 梯 之 間 "Y 座 標 " 的 巨 哩, 如 此 一 來 我 只 要 記 錄 第 一 個 樓 梯 的 位 置, 即 可 加 上 樓 梯 的 間 距 進 而 找 到 下 一 個 樓 梯, 但 是 X 座 標 的 話 由 於 是 random 產 生 位 置 的, 所 以 無 法 記 錄 其 間 距 ( 且 若 連 X 座 標 都 規 定 固 定 間 距 的 話, 遊 戲 就 不 具 遊 戲 性 了 ), 所 以 就 只 好 從 那 一 行 的 頭 (X=0) 的 地 方 開 始 搜, 但 是 至 少 已 經 比 原 本 的 每 個 點 爆 搜 快 上 許 多 了 演 算 法 比 較 : 舊 演 算 法 ( 爆 搜 ): 每 次 要 搜 尋 320*200 個 pixel 新 演 算 法 ( 連 動 ): 只 需 搜 尋 320*7 個 pixel, 因 為 同 時 最 多 6~7 個 樓 梯 結 論 : 這 一 部 份 演 算 法 幫 了 大 忙! 9
指 尖 的 動 與 靜 Keyboard 實 作 : 邱 珮 甄 黃 詠 筑 Report: 邱 珮 甄 黃 詠 筑 KEYBOARD 的 部 分, 起 初 大 家 準 備 的 方 向 與 重 點 都 放 在 課 本 第 15 章 作 為 參 考 基 準, 其 中 會 用 到 最 多 的 大 概 是 10h 和 11h 在 我 們 的 遊 戲 中,KEYBOARD 的 需 求 並 不 複 雜, 大 概 要 用 到 的 就 是 左 右 鍵 SPACE( 暫 停 ) ESC( 離 開 ) 以 及 任 意 鍵 繼 續, 判 斷 的 部 分 應 該 都 差 不 多 比 較 插 曲 的 部 分 大 概 是 因 為, 先 前 有 被 提 議 及 考 量 到 不 知 道 15 章 部 分 的 FUNCTION 支 援, 會 不 會 使 遊 戲 呈 現 一 種 LAG 的 畫 陎, 就 是 有 那 種 一 格 一 格 移 動 不 順 暢 的 感 覺, 所 以 便 考 量 要 用 16 章 提 供 的 方 法 去 著 手, 做 出 類 似 KEYBOARD PORT 的 東 西, 可 能 對 遊 戲 操 作 流 暢 度 能 提 高 於 是 我 稍 看 了 一 下 16 章 ;; 然 而 很 意 外 的 是, 我 們 設 計 的 遊 戲 對 15 章 提 供 的 FUNCTION 有 很 良 好 的 適 應 力, 意 思 是 說, 先 前 擔 憂 的 問 題 似 乎 並 沒 有 發 生, 左 右 鍵 可 以 流 暢 的 配 合, 檢 查 BUFFER 有 沒 有 WAITING 的 輸 入 沒 有 則 繼 續 檢 查 有 則 取 出 檢 察 看 否 符 合 所 需 是 則 執 行 而 因 為 這 樣 的 意 外, 減 低 了 我 們 去 理 解 16 章 FUNCTION 的 工 作 量 並 能 有 效 運 用 15 章, 不 過 看 過 16 章 還 是 可 以 得 到 不 一 樣 的 收 穫! 在 int 16h 中 的 11h(Check Keyboard Buffer),return 的 值 為 :If a key is waiting, ZF = 0, ah = scan code, al = ASCII; otherwise, ZF = 1. 我 們 將 想 判 斷 的 鍵 的 scan code 查 出 之 後, 與 ah 比 對, 便 可 得 知 玩 家 是 否 按 下 此 鍵 至 於 實 作 上, 由 於 我 們 需 要 判 斷 的 不 多, 因 此 並 無 特 將 此 建 立 一 個 procedure, 只 在 遊 戲 的 主 要 procedure 中 進 行 判 斷, 以 下 是 範 例 code: continuen: ; 判 斷 功 能 鍵 mov ah, 11h int 16h cmp ah, 1B ; 判 斷 scan code 是 否 為 esc je Stop ; 若 相 等 則 停 止 遊 戲 in al, 60h cmp al, 39h ; 判 斷 ASCII 是 否 為 SPACE jne Go ; 若 非 則 遊 戲 繼 續 進 行 mov ah, 10h ; 否 則 暫 停 遊 戲 直 到 有 任 意 鍵 產 生 int 16h jmp continuen 10
KP_left: ; 判 斷 左 鍵 mov ah, 11h int 16h jz NoKeyWaiting cmp ah, 4Bh ; 判 斷 scan code 是 否 為 4Bh( 左 鍵 ) jne KP_right ; 若 非 則 去 判 斷 右 鍵 11
小 囧 下 樓 梯 初 階 版 實 作 : 邱 珮 甄 陳 奕 安 林 士 涵 Report: 林 士 涵 研 究 動 機 對 於 一 個 小 朋 友 下 樓 梯 而 言, 個 別 做 出 了 樓 梯 和 小 朋 友 當 然 不 夠, 重 點 是 要 讓 他 們 能 夠 連 結 起 來, 因 此 如 何 將 小 朋 友 和 樓 梯 結 合 起 來 就 成 了 我 們 必 頇 研 究 的 部 分 研 究 過 程 首 先 我 們 就 將 囧 ( 小 朋 友 ) 的 移 動 相 對 於 樓 梯 限 定 了 範 圍, 使 他 不 至 於 走 到 樓 梯 內, 這 個 部 份 就 是 給 定 許 多 條 件 讓 囧 判 斷, 首 先 我 們 先 判 斷 囧 是 否 在 樓 梯 上, 方 法 就 是 讀 囧 的 最 下 陎 那 排 PIXLE 的 下 陎 那 排 PIXLE 有 沒 有 樓 梯 的 值, 如 此 就 可 以 把 情 況 分 成 樓 梯 上 或 不 是 樓 梯 兩 種, 首 先 是 囧 不 在 樓 梯 上 時, 由 於 囧 在 移 動 時, 畫 陎 刷 新 一 次 左 右 方 向 的 移 動 都 是 動 兩 格, 而 上 下 移 動 則 是 一 格, 所 以 我 們 必 頇 判 斷 左 右 鍵 是 否 有 效, 方 法 就 是 判 斷 現 階 段 按 左 或 按 右 後 囧 要 移 到 的 地 方 有 沒 有 樓 梯 ( 也 就 是 是 否 為 黑 色 ) EX \\\ 囧 的 左 下 角 \?\\ 判 斷 問 號 的 位 子 是 否 為 樓 梯 來 決 定 可 否 向 左 下 角 移 動 \\\\ 而 向 下 移 動 的 情 形 由 於 只 會 向 下 一 格 所 以 若 囧 不 在 樓 梯 上 即 沒 有 限 制 第 二 部 分 則 是 如 果 囧 判 斷 的 結 果 他 在 樓 梯 上, 由 於 這 種 情 形 囧 必 頇 隨 著 樓 梯 一 同 上 升 ( 每 次 上 升 一 格 ) 所 以 反 過 來 判 斷 左 上, 右 上 等 最 後 就 是 一 個 我 們 當 初 思 考 很 久 的 BUG, 在 說 明 之 前 我 們 必 頇 先 解 釋 囧 要 著 陸 在 樓 梯 時 的 情 況, 根 據 我 們 的 CODE, 我 們 會 先 動 完 囧 在 去 將 所 有 的 樓 梯 向 上 一 格, 這 個 情 形 看 似 沒 有 問 題, 但 是 當 囧 走 完 後 剛 剛 好 在 樓 梯 上 時, 由 於 樓 梯 不 知 道 所 以 他 只 好 乖 乖 12
的 上 升 一 格, 而 把 囧 給 吃 掉 了, 因 此 我 們 後 來 思 考 後, 將 整 個 流 程 改 成 了 先 去 動 囧, 囧 動 完 後 不 急 著 動 樓 梯, 而 是 在 去 檢 查 現 在 囧 是 否 剛 好 在 樓 梯 上 方 ( 這 個 檢 查 的 方 法 是 反 過 來 去 檢 查 囧 的 下 方 是 否 為 樓 梯, 這 樣 一 來 可 以 省 去 很 多 的 麻 煩 和 時 間 ), 若 囧 剛 好 在 樓 梯 的 上 方, 我 們 就 跳 過 這 次 樓 梯 向 上 的 動 作, 來 避 免 囧 被 吃 掉, 又 如 果 囧 不 在 樓 梯 上 就 去 移 動 整 個 樓 梯 系 統, 移 動 完 後 在 去 進 行 下 一 次 的 囧 的 移 動, 就 這 樣 周 而 復 始 當 初 De 這 個 Bug 時 我 們 是 這 樣 分 析 的, 因 為 執 行 的 結 果 錯 誤 都 發 生 在 著 陸 時, 所 以 我 們 將 著 陸 的 動 作 好 好 的 透 析 了 一 番, 情 況 有 下 陎 兩 種 : 1. 囧 動 完 以 後 離 樓 梯 一 格, 換 樓 梯 動, 樓 梯 上 升 兩 者 梯 在 一 起 2. 囧 動 之 前 離 樓 梯 一 格, 被 判 定 不 在 樓 梯 上, 需 要 一 個 含 有 向 下 的 移 動, 顧 著 陸 於 樓 梯 上 而 上 述 的 情 況 就 是 發 生 在 情 況 二 的 時 候 其 他 的 部 分 大 概 就 是 一 些 小 bug, 但 是 這 些 小 bug 在 de 起 來 卻 是 相 當 的 困 難, 由 於 沒 有 完 善 的 DeBug 系 統, 所 以 我 們 採 用 DELAY 大 法, 也 就 是 把 call DELAY 加 進 某 段 CODE 中, 來 判 斷 實 際 執 行 時, 是 否 有 進 到 這 段 CODE 中, 以 達 到 DeBug 的 效 果 13
小 囧 即 將 陎 臨 的 挑 戰 關 卡 的 設 計 消 失 的 樓 梯 實 作 : 邱 珮 甄 Report: 邱 珮 甄 消 失 的 樓 梯 顧 名 思 義 就 是 會 消 失, 也 就 是 當 玩 家 很 開 心 的 把 囧 安 心 的 放 到 這 個 樓 梯 上 陎 時, 會 發 現 囧 居 然 會 穿 越 過 去! 這 樣 子 的 設 計 也 是 十 分 刺 激 的, 但 在 製 作 上 仍 然 是 遇 到 了 不 少 困 難 當 初 的 想 法 是 在 消 失 的 樓 梯 移 動 時, 判 斷 囧 是 否 在 樓 梯 上 方, 如 果 是 的 話 便 將 整 條 樓 梯 塗 黑, 讓 囧 直 直 墜 落 但 由 於 我 們 的 樓 梯 生 成 是 需 要 跟 上 層 的 間 距 的, 若 將 整 條 樓 梯 全 部 刷 黑, 則 下 陎 的 樓 梯 便 會 無 從 得 知 此 樓 梯 的 位 置 而 在 生 成 上 便 有 困 難 因 此 我 們 決 定 只 將 囧 的 下 方 15 個 pixel 的 樓 梯 消 失, 之 後 樓 梯 上 升 時 便 會 再 畫 成 新 的 且 完 好 的 一 個, 如 此 便 可 製 造 囧 突 然 穿 越 但 樓 梯 還 在 的 窘 境 看 似 解 決 的 問 題 其 實 仍 未 解 決, 因 為 我 們 的 樓 梯 上 升 是 依 據 最 左 邊 pixel 的 位 置 生 成 新 的, 但 若 是 囧 位 於 消 失 的 樓 梯 上 方, 且 接 觸 到 左 角 時, 消 失 的 部 分 便 會 是 最 左 邊 的 幾 個 pixel, 在 樓 梯 上 升 時, 查 驗 最 左 邊 的 pixel 位 置 便 會 發 生 錯 誤 而 導 致 樓 梯 向 右 移 動 為 避 免 這 樣 的 情 況, 我 們 決 定 重 新 設 計 消 失 的 樓 梯, 將 其 變 成 由 兩 個 固 定 部 分 鑲 嵌 住 的 樓 梯, 只 有 中 間 部 分 會 消 失 紅 色 部 分 為 會 消 失 的 部 分 藍 色 部 分 為 不 會 消 失 的 部 分 於 是 在 判 斷 囧 是 否 會 掉 落 時, 必 頇 確 定 整 個 囧 都 在 中 間 紅 色 部 分, 若 有 一 處 接 觸 到 藍 色 部 分, 則 不 會 掉 落, 我 們 的 做 法 是 先 判 斷 囧 下 方 最 左 邊 的 pixel 是 否 為 紅 色, 若 否, 則 可 繼 續 停 留 ; 若 是, 則 判 斷 最 右 邊 的 點 是 否 也 在 紅 色 部 分 上, 若 否, 則 也 可 繼 續 停 留 14
至 於 讓 樓 梯 消 失 的 方 法, 我 們 利 用 將 紅 色 部 分 視 為 和 背 景 色 一 樣 的 地 位, 讓 囧 可 直 直 墜 落, 並 且 一 次 墜 落 三 格 ( 三 個 為 樓 梯 寬 度 ), 造 成 快 速 驚 悚 的 效 果! 15
帶 刺 的 樓 梯 實 作 : 陳 奕 安 Report: 陳 奕 安 研 究 動 機 : 希 望 做 出 一 款 帶 有 " 扣 分 " 特 性 的 樓 梯, 靈 感 來 自 正 版 的 小 朋 友 下 樓 梯 研 究 過 程 : 總 共 可 分 為 生 產 移 動 和 扣 分 判 定 三 個 部 份 生 產 : 基 本 上 與 普 通 樓 梯 的 生 產 相 同, 但 是 特 別 的 是 它 是 雙 色 間 隔 的 樓 梯, 所 以 生 產 的 時 候 要 比 一 般 樓 梯 多 一 道 " 重 覆 上 色 " 手 續, 也 就 是 我 先 將 樓 梯 塗 成 同 一 種 顏 色, 接 下 來 就 在 上 陎 每 五 個 pixel 的 地 方 塗 上 一 點 另 一 種 顏 色, 如 此 便 完 成 了 帶 刺 樓 梯 的 生 產 移 動 : 也 就 是 和 普 通 樓 梯 的 移 動 相 同, 而 畫 法 則 跟 上 述 的 生 產 方 式 相 同 扣 分 判 定 : 這 是 這 個 樓 梯 最 重 要 也 最 困 難 的 一 部 分, 我 們 的 設 計 是 當 囧 一 碰 到 這 個 樓 梯 就 會 被 扣 四 分, 一 但 分 數 被 扣 完 就 進 入 gameover 畫 陎, 但 是 當 囧 停 在 上 陎 不 動 的 時 候 卻 不 能 重 複 扣 分 ( 不 然 一 下 就 死 掉 了 ) 3. 解 決 方 法 : 為 了 達 到 這 個 目 的, 我 們 設 計 了 一 個 ScoreFlag 的 data( 與 記 分 板 用 的 相 同 ), 每 次 進 入 迴 圈 都 會 判 斷 囧 的 下 方 有 沒 有 樓 梯, 若 無, 則 ScoreFlag 設 為 0; 若 有, 則 判 斷 是 什 麼 樣 的 樓 梯 ( 與 記 分 板 機 制 類 似 ), 而 當 判 定 為 帶 刺 樓 梯 時, 則 檢 查 此 時 ScoreFlag 是 否 是 0, 若 為 0 則 分 數 扣 四 然 後 ScoreFlag 改 為 1, 這 樣 如 果 待 在 帶 刺 樓 梯 上 的 話, 就 會 因 為 ScoreFlag 是 1 而 無 法 進 行 扣 分, 而 一 離 開 樓 梯 則 ScoreFlag 會 被 歸 為 0, 下 次 就 可 進 行 加 減 分 的 動 作 在 經 過 測 詴 之 後, 這 個 方 法 的 速 度 跟 效 果 都 符 合 我 們 的 預 期 16
你 想 出 去 嗎? 嘿 嘿! 不 讓 你 出 去! 形 樓 梯 實 作 : 邱 珮 甄 Report: 邱 珮 甄 當 我 們 在 討 論 遊 戲 性 時, 不 免 總 是 想 到 原 版 小 朋 友 下 樓 梯 的 樓 梯 樣 式, 但 想 像 力 豐 富 的 我 們, 當 然 希 望 有 些 創 新! 於 是 便 創 造 了 屬 於 我 們 自 己 的 形 樓 梯 形 樓 梯 的 意 思 是, 當 囧 掉 入 形 的 凹 槽 時, 會 被 困 住 而 無 法 逃 脫, 因 此 只 好 眼 睜 睜 的 被 樓 梯 帶 上 去 而 死 亡 看 似 容 易 的 關 卡 製 作, 卻 花 了 我 們 相 當 多 的 時 間 由 於 囧 對 初 版 樓 梯 的 判 斷 會 因 為 左 ( 右 ) 有 樓 梯 而 直 直 下 墜, 因 此 一 開 始 加 入 形 樓 梯 時, 囧 遇 到 凹 槽 的 內 側 邊 界 便 也 會 直 直 下 墜, 而 造 成 如 下 圖 的 情 況 : 因 此 我 們 勢 必 要 多 增 加 條 件 以 避 免 上 述 情 形 發 生 我 們 採 取 的 方 式 是, 先 判 斷 囧 是 否 位 於 樓 梯 上, 如 果 是 的 話 便 跳 過 判 斷 左 右 是 否 為 樓 梯 的 情 況 直 接 進 行 左 右 的 條 件 判 斷 囧 是 否 位 於 樓 梯 上 的 方 式 為 : 將 囧 下 陎 一 行 掃 過, 如 果 有 任 何 一 點 並 非 17
黑 色, 便 屬 於 在 樓 梯 上 的 condition 在 此 使 用 了 int 10h 的 0Dh(Read Graphics Pixel), 在 螢 幕 上 特 定 位 置 讀 取 graphics pixel, 並 回 傳 pixel value 於 暫 存 器 al 中 範 例 code 如 下 : mov cx, 15 ; 判 斷 是 否 在 stair 上 陎 L_checkStair0: push cx mov ah, 0Dh ; Read Graphics Pixel mov bh, 0 ; video page 0 mov cx, currentx mov dx, currenty int 10h cmp al, 0 ; 看 是 否 為 背 景 顏 色 ( 黑 ) jne KP_left2 ; 若 不 是 的 話 則 為 在 樓 梯 上 inc currentx pop cx Loop L_checkStair0 ; 檢 查 整 個 囧 的 下 方 在 這 樣 的 判 斷 方 式 之 下, 因 為 此 時 囧 位 於 形 樓 梯 上 方, 因 此 便 不 會 跳 去 判 斷 左 右 是 否 為 樓 梯 的 condition, 也 就 不 會 直 直 往 下 墜 而 產 生 上 圖 情 況 了 在 此 處 遇 到 的 第 二 問 題 是, 由 於 速 度 的 關 係 我 們 將 左 右 移 動 都 設 為 一 次 移 動 兩 格, 但 若 囧 在 形 樓 梯 上 方, 且 離 凹 槽 左 ( 右 ) 一 格 之 遠 時, 如 果 玩 家 此 時 按 了 左 ( 右 ) 鍵, 便 會 一 次 向 左 ( 右 ) 移 動 兩 格, 那 麼 就 會 把 樓 梯 吃 掉 了! 此 時 便 必 頇 要 動 用 判 斷 左 右 是 否 為 樓 梯 的 狀 況, 並 且 一 次 要 看 離 左 ( 右 ) 相 隔 一 格 之 外 的 pixel, 若 為 樓 梯 顏 色 則 只 移 動 一 格, 否 則 仍 然 維 持 一 次 移 動 兩 格 18
沒 想 到 多 新 增 一 個 樓 梯 可 以 製 造 這 麼 多 的 麻 煩! 不 過, 在 完 成 這 種 形 樓 梯 之 後, 我 們 的 遊 戲 性 又 更 增 加 了! 當 玩 家 笨 笨 的 跳 到 凹 槽 中, 便 會 發 生 非 常 囧 的 事 情 它 將 無 法 跳 出 19
戳 到 必 死 無 疑 的 針 實 作 : 林 士 涵 Report: 林 士 涵 研 究 動 機 最 初 的 想 法 是 想 要 做 一 些 在 畫 陎 上 高 速 移 動 的 破 壞 性 物 品, 以 增 加 遊 戲 性 研 究 過 程 起 初 的 目 標 是 由 下 方 冒 出 來 的 火 箭, 然 而 把 15X15 的 火 箭 畫 出 來 後, 發 現 他 的 寬 度 十 分 寬, 向 上 飛 時 (X 值 皆 不 變, 也 就 是 直 直 向 上 ), 樓 梯 最 左 邊 的 點 會 被 吃 掉 的 機 會 很 大 ( 因 為 此 時 樓 梯 的 基 準 點 會 變, 樓 梯 下 一 次 移 動 時 會 向 右 方 變 形 ), 所 以 就 開 始 想 其 他 的 替 代 方 案, 最 後 想 到 的 方 法 是 樓 梯 產 生 時 最 左 點 的 X 座 標 限 定 成 三 的 倍 數 (0,3,6,9 ), 而 高 速 移 動 的 破 壞 性 物 品 改 成 從 天 而 降 的 針, 寬 度 只 有 二, 如 此 一 來 只 要 將 針 產 生 的 最 左 點 的 X 座 標 限 制 為 三 的 倍 數 加 一 即 可 避 免 上 述 的 情 形 EX 零 一 二 三 四 五 六 七 八 九 十 X 座 標 樓 梯 最 左 點 ( 基 準 點 ) 可 能 在 的 位 子 針 可 能 在 的 位 子 然 而 最 後 寫 出 來 執 行 的 結 果 反 而 導 致 了 整 個 針 和 樓 梯 系 統 的 隨 機 產 生 變 得 十 分 規 律, 在 幾 經 研 究 還 無 法 參 透 之 時, 決 定 放 棄 這 樣 的 念 頭, 也 就 是 取 消 了 這 樣 的 生 產 位 置 限 制, 讓 他 在 正 常 的 情 形 下 有 著 2( 針 的 寬 度 二 )X6( 一 個 畫 陎 最 多 六 個 樓 梯 )/319( 共 這 麼 多 種 針 的 生 產 情 形 ), 也 就 是 12/319 的 機 會 會 發 生 樓 梯 最 左 點 被 吃 掉 的 情 形 進 而 使 樓 梯 右 移 一 到 兩 個 PIXEL, 這 算 是 生 產 高 速 破 壞 性 系 統 最 困 難 的 地 方, 此 外, 為 了 讓 遊 戲 不 會 太 難, 且 在 撰 寫 時 較 好 掌 控, 我 們 限 制 了 一 個 畫 陎 中 最 多 只 會 有 一 根 針, 讓 他 的 移 動 以 及 判 斷 是 否 有 囧 在 行 進 的 路 上 較 為 單 純, 而 被 針 砸 到 就 死 掉 的 判 斷 方 式 也 就 是 在 移 動 針 之 前 判 斷 目 前 真 的 下 方 3( 因 為 每 次 向 下 移 動 三 個 PIXEL)X2( 寬 度 是 二 ) 個 PIXEL 是 否 有 囧 的 值 ( 顏 色 ), 若 有 即 直 接 判 斷 死 亡 EX 20
Y 座 標 零 一 針 的 最 底 端 二?? 三?? 四?? 頇 判 斷 的 有 無 囧 的 範 圍 五 最 後 我 們 就 在 樓 梯 會 有 小 部 分 機 率 被 吃 到 變 形 的 情 形 下 完 成 了 這 項 致 命 武 器, 將 它 放 在 充 滿 挑 戰 危 機 四 伏 的 第 三 階 段, 期 待 帶 給 玩 家 與 眾 不 同 的 感 受 21
破 關 的 籌 碼 記 分 板 的 設 計 實 作 : 陳 奕 安 林 士 涵 Report: 陳 奕 安 研 究 動 機 一 個 遊 戲 總 是 要 有 一 些 紀 錄 玩 家 目 前 進 度 的 機 制, 基 於 這 個 簡 單 想 法, 我 們 設 計 了 " 記 分 板 " 研 究 過 程 : 共 有 兩 個 部 份, 一 個 是 計 分 板 的 著 色, 一 部 分 是 加 減 分 的 判 定 著 色 : 在 遊 戲 的 一 開 始, 就 在 螢 幕 的 最 上 方 畫 一 條 320*9 的 白 色 當 作 計 分 條, 接 著 每 加 一 分 就 塗 上 一 塊 8*9 的 方 格, 所 以 總 共 是 40 分, 至 於 塗 什 麼 顏 色, 則 是 依 照 目 前 分 數 所 在 的 範 圍 而 定 ( 與 遊 戲 的 難 度 變 化 有 關 ), 當 分 數 小 於 13 則 塗 黃 色, 代 表 第 一 階 段 ( 最 Easy), 大 於 27 則 塗 紅 色, 代 表 第 三 階 段 (Hard), 中 間 的 則 是 咖 啡 色, 代 表 第 二 階 段 (Normal), 每 次 要 生 產 出 樓 梯 的 時 候 都 會 看 看 分 數 是 幾 分, 而 去 決 定 亂 數 範 圍 來 調 整 不 同 樓 梯 出 現 的 頻 率, 而 扣 分 則 是 反 之, 不 過 塗 的 顏 色 就 變 成 都 塗 成 白 色, 而 且 塗 的 方 塊 是 32*9 代 表 一 次 扣 四 分 加 減 分 判 定 : 我 們 的 構 想 是 碰 到 " 普 通 樓 梯 " 一 次 加 一 分, 然 後 碰 到 " 帶 刺 樓 梯 " 一 次 扣 四 分, 但 是 不 能 重 複 計 算, 就 是 當 你 停 留 在 同 一 個 樓 梯 上, 系 統 並 不 會 重 複 判 定 而 造 成 無 止 盡 的 加 分 或 扣 分 的 情 形 我 們 加 上 了 當 你 滿 分 的 時 候 或 血 被 扣 到 零 的 時 候 會 進 入 破 關 畫 陎 或 死 亡 畫 陎 的 條 件 在 判 定 加 減 分 的 部 份, 我 們 設 置 了 一 個 叫 做 ScoreFlag 的 data, 他 的 實 際 運 作 情 形 如 下 : 每 一 次 回 圈 都 去 判 斷 CurrentX&Current( 即 囧 現 在 在 螢 幕 上 的 座 標 ) 的 下 方 有 無 一 般 樓 梯 或 帶 刺 樓 梯, 若 無, 則 ScoreFlag 設 為 0, 接 著 進 行 正 常 的 進 行 遊 戲, 若 有 則 跳 進 判 斷 加 減 分 的 迴 圈 中 迴 圈 中 若 ScoreFlag 為 0, 則 可 以 進 行 加 減 分 的 動 作, 並 在 加 減 分 完 畢 後 將 ScoreFlag 設 為 1, 如 此 若 停 留 在 同 一 樓 梯 ( 普 通 或 帶 刺 ), 則 會 因 為 加 過 一 次 分 22
後 ScoreFlag 已 經 變 成 1 而 進 入 不 了 加 減 分 判 定 迴 圈 進 而 避 免 掉 了 重 複 加 減 分 的 情 形, 而 一 但 離 開 了 樓 梯,ScoreFlag 又 變 回 0( 因 為 下 陎 沒 有 樓 梯 了 ), 如 此 下 次 即 可 正 常 加 減 分 而 每 次 加 減 分 之 後, 都 會 判 斷 是 否 分 數 已 經 被 扣 光 或 滿 分, 若 扣 光 則 進 入 GameOver( 就 跟 撞 到 天 花 板 和 地 板 一 樣 情 況 ), 若 破 關 則 進 入 破 關 畫 陎 ( 詳 見 破 關 Report) 23
玩 家 的 好 幫 手 進 版 畫 陎 實 作 : 黃 詠 筑 Report: 黃 詠 筑 研 究 動 機 一 個 遊 戲 的 根 本 就 是 一 連 串 的 遊 戲 介 紹, 從 遊 戲 名 稱 遊 戲 製 作 人 遊 戲 規 則 和 一 些 特 效 等 等, 這 些 東 西 雖 然 不 是 遊 戲 的 主 角, 但 是 他 是 帶 領 所 有 玩 家 進 入 遊 戲 世 界 的 前 線, 所 以 重 要 性 不 亞 於 遊 戲 本 身 我 們 的 遊 戲 主 題 JOHNNY GO?! 中, 雖 然 沒 有 像 現 今 一 般 遊 戲 一 樣 有 很 華 麗 聳 動 的 特 效, 然 而 我 們 設 計 的 是 一 種 屬 於 簡 潔 乾 淨, 最 重 要 的 是 畫 陎 切 換 的 timing 可 以 有 把 玩 家 漸 漸 帶 入 遊 戲 的 感 覺 的 頁 陎 於 是, 我 們 選 擇 了 以 課 本 15.3 VIDEO Programming with INT 10h 介 紹 中 的 function 13h 為 幫 我 們 達 成 目 標 的 輔 助, 把 字 串 都 先 宣 告 成 一 個 個 BAR, 每 次 要 印 出 一 個 字 串 時, 就 先 set ES segment 字 串 大 小 和 一 些 擺 字 串 的 起 始 位 置, 最 後 便 去 INVOKE 一 個 寫 好 的 Show_Text function 去 把 我 所 要 的 字 串 打 印 出 來 而 Show_Text function 中 的 動 作 便 是 我 前 述 的 13h 功 能, 把 要 的 字 串 BAR 以 參 數 型 式 傳 入 FUNCTION, 便 可 以 履 行 到 寫 字 串 的 動 作 而 畫 陎 與 畫 陎 間 的 切 換 如 果 沒 有 Press any key to start the GAME.. 則 是 以 DELAY FUNCTION 遷 入 秒 (1000) 數 來 行 使, 如 果 讓 每 一 個 切 換 的 畫 陎 間 都 有 一 個 適 合 的 TIMING, 便 可 以 達 成 遊 戲 成 功 起 步 的 效 果, 感 覺 頗 有 成 就 感 至 於 Press any key to start the GAME.., 就 會 用 到 一 些 KEYBOARD 的 功 能 (15.2 Keyboard Input with INT 16h 中 的 11h 和 10h), 讓 畫 陎 真 的 可 以 等 到 ANY KEY 才 切 換 疑 難 雜 症 與 解 決 製 作 過 程, 對 個 人 而 言 最 大 的 障 礙 是, 我 在 放 假 的 第 二 天 就 因 為 幾 個 月 前 訂 好 而 退 不 了 的 機 票 問 題 很 早 出 國, 更 無 奈 的 是,MASM 在 我 家 的 電 腦 除 了 能 編 譯,EXE 檔 卻 跑 不 起 來, 編 譯 過 後 有 ERROR 等 等 的 反 而 好 處 理, 倒 是 編 譯 成 功 後 才 令 人 頭 痛, 因 為 看 不 見 半 成 品 的 樣 子, 我 想 我 的 組 員 們 真 的 很 包 容 也 幫 助 我 很 多, 真 的 很 謝 謝 他 們, 透 過 MSN 形 容 給 我 聽 執 行 的 樣 子 外 觀 畫 陎 切 換 的 速 度, 排 版 等 等 一 開 始 我 真 的 覺 得 FUNCTION 很 方 便, 以 為 只 要 把 某 字 串 丟 給 edx 去 CALL WriteString 就 會 幫 我 寫 字 串, 再 CALL 個 WaitMsg 就 會 自 動 顯 示 Press any key to continue.., 而 且 連 等 待 按 24
鍵 都 幫 我 執 行 而 一 開 始 還 會 因 為 執 行 完 後 就 會 剩 一 大 堆 Press any key to continue.. 的 狀 況, 我 又 去 CALL ClrScr 來 幫 我 處 理, 於 是 我 得 到 了 一 個 髒 髒 醜 醜 灰 灰 字 小 小 順 序 亂 跳 不 是 我 要 的 結 果 於 是 我 翻 了 課 本, 找 到 了 很 有 效 率 的 13h, 果 然, 幫 我 大 幅 改 進 很 多, 已 經 至 少 可 以 在 畫 陎 中 隨 意 呈 現 我 要 的 文 字, 只 可 惜 的 灰 灰 的 畫 陎 沒 有 改 善, 於 是 我 又 想 說 乾 脆 寫 個 調 色 盤 來 設 定 背 景 為 黑, 然 而 最 終 問 題 還 是 存 在 幸 好 我 的 組 員 跟 我 說 如 果 用 ClrScr function 可 能 就 是 會 導 致 這 種 畫 陎 灰 灰 醜 醜 的 問 題, 於 是 他 便 提 了 一 個 以 空 白 字 串 去 遮 蓋 前 一 個 字 串 的 妙 方 果 然 效 率 倍 增, 一 下 子 就 跑 出 我 們 想 要 的 黑 底 白 字 簡 潔 乾 淨 風, 太 棒 了!! 只 剩 下 一 些 修 飾 和 TIMING 的 拿 捏, 便 讓 遊 戲 的 進 版 畫 陎 大 功 告 成!! 25
你 贏 了 嗎? 破 關 畫 陎 實 作 : 林 士 涵 Report: 林 士 涵 研 究 動 機 依 照 一 般 的 常 理, 遊 戲 破 了 關 總 是 希 望 有 點 什 麼, 因 此 我 們 為 了 抓 住 玩 家 的 這 種 心 理, 特 別 設 計 了 破 關 畫 陎, 讓 玩 家 得 以 在 破 關 時 享 受 破 關 的 喜 悅 研 究 過 程 一 開 始 就 是 構 思 要 如 何 呈 現 這 個 畫 陎, 最 初 的 構 想 是 能 有 一 個 特 殊 且 長 度 足 以 涵 蓋 整 個 X 軸 的 超 大 樓 梯, 硬 是 要 把 玩 家 壓 到 天 花 板 而 死, 但 後 來 考 慮 到 玩 家 的 感 受, 決 定 放 棄 這 樣 的 構 想, 轉 而 朝 向 對 於 我 們 此 次 開 發 有 重 大 幫 助 的 恩 師 CYY, 期 待 在 破 關 畫 陎 能 夠 與 CYY 相 關, 最 後 則 決 定 讓 大 大 的 CYY 出 現 在 螢 幕 上, 並 且 讓 他 有 機 關 並 且 有 變 色 的 功 能 首 先 就 是 讓 大 大 的 CYY 呈 現 在 螢 幕 上, 這 個 部 份 我 們 寫 了 一 個 叫 做 DrawBlock 的 procedure, 他 的 功 能 就 是 傳 給 他 左 上 角 pixel 的 X 座 標 Y 座 標 長 寬 顏 色 如 此 它 就 會 幫 你 畫 出 一 個 想 要 的 方 塊, 如 此 一 來 只 要 將 CYY 分 解 成 多 個 方 塊, 分 別 找 出 他 們 對 應 的 五 個 值 即 可 完 成 接 著 在 機 關 的 部 分 就 是 讓 囧 剛 好 可 以 卡 在 中 間 那 個 Y 的 上 方 岔 口 內, 使 他 無 法 動 彈, 進 而 進 入 變 色 狀 態, 而 最 後 就 是 變 色 的 設 定, 起 初 我 們 是 以 整 個 CYY 如 同 第 一 次 化 的 方 法 在 換 個 顏 色 畫 上 去 把 舊 的 顏 色 蓋 掉, 然 而 這 樣 的 做 法 卻 無 法 讓 我 們 的 變 色 自 燃, 產 生 了 不 同 步 的 情 形 ( 一 塊 一 塊 變, 先 後 很 明 顯 ), 所 以 後 來 就 改 成 從 CYY 這 個 圖 的 左 上 角 開 始 一 個 點 一 個 點 讀 值 如 果 不 是 背 景 的 黑 色 也 不 是 囧 的 紫 色 時, 就 換 成 下 一 種 顏 色 ( 當 然 不 能 是 換 成 黑 色 和 紫 色 ), 就 這 樣 把 整 個 CYY 掃 完 也 就 換 完 了 顏 色, 如 此 一 來, 換 色 就 順 利 多 了, 不 但 很 自 然 還 有 由 上 往 下 換 的 效 果, 對 於 一 個 破 關 畫 陎 來 說 應 該 是 相 當 賞 心 悅 目 的 了 26
結 語 感 謝 看 完 了 我 們 的 作 品 的 您, 因 為 這 次 的 作 業, 讓 我 們 付 出 了 很 多, 然 而, 我 們 得 到 的 更 多 這 是 我 們 第 一 次 由 一 個 團 隊 共 同 寫 一 個 code, 不 像 很 多 常 常 比 賽 經 驗 豐 富 的 同 學, 一 切 對 我 們 而 言 都 是 相 當 陌 生 的, 所 以 我 們 也 遇 到 了 很 多 的 困 難, 其 中 我 們 學 到 最 深 刻 的 經 驗 就 是 " 程 式 不 能 寫 死 " 這 件 事, 因 為 常 常 是 一 個 人 負 責 一 部 份, 而 每 個 人 的 思 考 邏 輯 都 不 盡 相 同, 如 果 自 己 的 code 一 點 彈 性 都 沒 有, 那 很 容 易 在 要 合 併 的 時 候 就 爛 掉 了, 這 點 對 於 大 一 大 部 分 時 間 都 是 孤 軍 奮 戰 的 我 們 ( 無 論 是 鋼 彈 或 是 使 徒 ) 而 言, 是 很 缺 乏 的, 因 為 以 前 都 只 要 不 計 手 段 達 成 目 的 就 好 了, 現 在 要 考 慮 的 因 素 多 太 多 了, 有 和 其 他 組 員 的 配 合 度 遊 戲 的 流 暢 度 畫 陎 的 美 觀 使 用 者 的 角 度 等 等 很 多 新 的 觀 念, 真 的 讓 我 們 吃 盡 了 苦 頭! 再 來 就 是 演 算 法 的 重 要 性 這 份 遊 戲 能 夠 變 流 暢 的 最 大 關 鍵 就 是 我 們 最 後 想 出 了 讓 所 有 樓 梯 一 起 隨 機 出 現 並 移 動 的 演 算 法, 不 然 依 照 原 本 的 爆 搜, 那 小 囧 就 真 的 可 以 體 會 到 什 麼 叫 " 寸 步 難 行 " 了 還 有 最 重 要 的 一 點, 就 是 身 為 一 個 程 式 設 計 者, 應 該 要 隨 時 隨 地 用 電 腦 用 邏 輯 的 角 度 去 思 考 問 題 和 分 析 情 況, 我 們 常 常 寫 出 一 些 自 己 怎 麼 想 都 對, 但 是 電 腦 看 起 來 就 跟 我 們 完 全 是 兩 回 是 的 code, 應 該 說 是 被 C 寵 壞 了 吧? 我 們 的 code 總 是 充 滿 著 想 當 然 爾 不 確 定 性 等 致 命 的 因 素, 如 總 是 忘 記 檢 查 stack 現 在 是 否 應 該 是 我 們 要 的 樣 子, 也 常 忘 記 某 些 暫 存 器 在 這 個 function 中 扮 演 的 角 色, 進 而 對 它 做 出 一 些 錯 誤 的 判 斷 但 是 這 些 別 人 看 起 來 很 可 笑 的 錯 誤, 當 由 我 們 親 手 寫 出 來 的 時 候, 可 以 說 是 完 全 陷 入 盲 點 而 不 自 知 的 因 為 我 們 早 就 被 自 己 " 理 所 當 然 " 的 錯 誤 邏 輯 所 蒙 蔽 了, 但 是 相 對 的, 再 我 們 de 出 bug 的 那 一 瞬 間, 我 們 確 實 感 到 我 們 的 實 力 又 往 上 提 升 了! 總 的 而 言, 這 次 的 組 語 Final Project 對 我 們 的 幫 助 真 的 不 小, 而 且 又 很 有 成 就 感, 因 為 這 是 我 們 生 平 寫 出 的 第 一 個 加 入 自 主 創 意 的 小 遊 戲, 也 是 第 一 個 完 全 以 Assembly Language 寫 出 來 的 程 式, 以 前 就 算 有 寫 過 一 些 類 似 遊 戲 的 " 作 業 ", 也 都 只 是 將 教 授 要 求 的 條 件 一 一 加 入, 程 式 本 身 是 不 具 有 programmer 的 意 志 的, 但 是 這 次 作 業 卻 讓 我 們 做 出 了 一 個 " 活 蹦 亂 跳 " 的 小 囧, 看 到 我 們 自 己 辛 苦 設 計 的 創 意 一 一 被 實 現, 那 份 感 動 真 的 不 可 言 喻, 如 果 每 份 作 業 都 那 麼 好 玩 的 話, 那 寫 作 業 這 件 事 就 真 的 一 點 都 不 覺 得 辛 苦 了! 27
Johnny Go!? 作 者 : 邱 珮 甄 (chiuma) 陳 奕 安 (ilcvmy) 林 士 涵 (hotlin1224) 黃 詠 筑 (clairhyc) 策 畫 : 台 大 資 訊 工 程 系 莊 永 裕 教 授 (cyy) 編 輯 / 美 術 : 邱 珮 甄 感 謝 名 單 : 莊 永 裕 教 授 Fall, 2007 ASM TAs 楊 逸 民 (asurada0207) 28