• 沒有找到結果。

Computer Organization Computer Organization Computer Organization Computer Organization and Assembly Languages, and Assembly Languages, and Assembly Languages, and Assembly Languages, Fall 2007Fall 2007Fall 2007Fall 2007

N/A
N/A
Protected

Academic year: 2022

Share "Computer Organization Computer Organization Computer Organization Computer Organization and Assembly Languages, and Assembly Languages, and Assembly Languages, and Assembly Languages, Fall 2007Fall 2007Fall 2007Fall 2007"

Copied!
9
0
0

加載中.... (立即查看全文)

全文

(1)

Computer Organization Computer Organization Computer Organization Computer Organization and Assembly Languages, and Assembly Languages, and Assembly Languages, and Assembly Languages,

Fall 2007 Fall 2007 Fall 2007 Fall 2007

Final Project Final Project Final Project

Final Project- - - -黃金傳說 黃金傳說 黃金傳說 黃金傳說

資工二 B96902013 邱柏睿 資工二 B96902023 游舜翔 資工二 B96902041 吳承恩

(2)

前言-遊戲介紹

從一開始對組合語言完全沒有有概念,經過一個學期 對組合語言的訓練,漸漸對組合語言有了一些瞭解,甚至可 以在GBA模擬器上作一些小程式,這次我們決定在GBA 的平台上實作一個小遊戲「黃金傳說」,這個小遊戲並沒有 複雜的AI,而是經由簡單的規則來產生樂趣,這遊戲是利 用挖寶的方式,在一個8x8的地圖中每一格都有黃金、鑽 石、鐵礦等等,每項的金錢都不同,一開始地圖是覆蓋住的,

Gamer要去挖掘未知的地區,並限制可以挖的次數,以 挖到高分為目標。為了增加遊戲的刺激性,除了金礦之外,

甚至還會有敵人,Gamer此時必須要回答問題,回答了 之後可能會發生好的事件也可能會發生壞的事件。

而 在 code 方 面 , 我 們 在 整 個 螢 幕 上 先 放 上 一 個 background<如圖一>,每個地圖上覆蓋住的未知區域都是一 個sprite,主角人物也是一個sprite<圖二

>,經由Query_select來決定上下左右的移 動,並利用random的方式來決定挖到的區域產生甚 麼,如果碰到敵人時,也是亂數決定要問甚麼問題!(較為 細部的部分會在稍後提到)

(圖一) (圖三)

(3)

操作介面

A A

A A 對前方區域開墾 對前方區域開墾 對前方區域開墾 對前方區域開墾 B

B B

B 選擇選單用 選擇選單用 選擇選單用 選擇選單用 L

L L

L 無 無 無 無 R

R R

R 無 無 無 無 上 上

上 上 往上走 往上走 往上走 往上走or or or or面向上方 面向上方 面向上方 面向上方 下

下 下

下 往下走 往下走 往下走 往下走or or or or面向下方 面向下方 面向下方 面向下方 左

左 左

左 往左走 往左走 往左走 往左走or or or or面向左方 面向左方 面向左方 面向左方 右 右

右 右 往右走 往右走 往右走 往右走or or or or面向右方 面向右方 面向右方 面向右方 START

START START

START 選擇問題的 選擇問題的 選擇問題的 選擇問題的A A A A SELECT

SELECT SELECT

SELECT 選擇問題的 選擇問題的 選擇問題的 選擇問題的B B B B

起始介面我們分成兩段,第一個介面(圖三)在按下

start 後,會進入 select 畫面(圖四), 此時可以有三個選

擇:分別是 start the game;review the high scores;quit

the game (如圖四),選擇 start the game 會進入遊戲畫

面,選擇 review the high scores 可以觀看目前為止的最

高分記錄,選擇 quit 則會進入 end 畫面。

(4)

(圖三) (圖四)

進入遊戲畫面時,首先我們的主角皮卡丘出現在左上 角(0,0)的位置,地圖上每一格都是 16x16 的pixel,

我們利用上下左右來選擇皮卡丘前進的方向,右上角標示剩 餘可以開墾的次數(用LIFE表示)當皮卡丘面對未知區 域要開墾時,Gamer可以按下A鈕,這時前方的未知區 域就會出現鐵礦、金礦、鑽石,出現的東西會在右方顯示。

地圖中的驚嘆號是特殊的格子,player 挖掘到那格時會有特 別的事件發生!

如果遇到 enemy 時,player 就必須回答問題時,如 果選擇對的選項,則可以得到獎賞,如果選擇錯的選項,則 會倒扣 life(挖掘次數)。

地圖下方的對話框會顯示出對話跟 player 互動,回

答問題時也是由對話框來顯示。當 life 剩餘數為0時,遊

戲就會結束。進入結束畫面(圖五)

(5)

(圖五)

實作內容

地圖部分 地圖部分 地圖部分 地圖部分: : : :

整個地圖由8x8個格子構成,每個格子都是 16x16p ixel構成的,並且我們用開了二維陣列 stone_x[][]和 stone_y[][]來記錄格子的位置,左上角第一格的位置為 [33][0],從左上角往右數第一格是[33+16][0],左上角往 下數第一格是[33][0+16]以此類推。

我們設置一個array:stone_exist[][]則用來記錄 區域是否挖掘過,一開始所有的 stone_exist[][]值都為1

(未挖掘過) ,我們用 calcute()這個自定涵式來判斷可否行 走 ,當 stone_exist[][]=1時,人物的 position 就不能移 動到那個座標,當挖掘過後,stone_exist[][]會變成0,

程式部分 程式部分 程式部分 程式部分 ::::

程式主要由一個

main functionmain functionmain functionmain function

和幾個函式所構成,其 中 包 括

VBL VBL VBL VBL functionfunctionfunctionfunction 、、、、 query_buttons()query_buttons()query_buttons()query_buttons() 、、、、 update_player_pos()

update_player_pos() update_player_pos()

update_player_pos() 、、、 calcute()、 calcute()calcute()calcute() 、、、、 ququququery_select ery_select ery_select 、ery_select 、、、 random_happen ()

random_happen () random_happen ()

random_happen () 、、、、 random_questions()random_questions()random_questions()random_questions() 、、、、 s_random_happen()

s_random_happen() s_random_happen()

s_random_happen() 、、、、 setstartbg()setstartbg()setstartbg()setstartbg() 、、、、 high_scorehigh_scorehigh_score()high_score()() 、() 、、、 setendbg()

setendbg() setendbg() setendbg()等

在 main 中我們將基本的變數設置好,顯示模式我們是用

model0也就是Tile來做,我們固定將文字放在圖層

(6)

0,而BG則是放在圖層1,如此一來文字就可以印在背景 圖片上,整個流程如下

初始化 HAMlib 和spirte的調色盤->start:

初始化文字格式並且set開始介面->初始化所有的變 數並進入select畫面->select中有三個選 項:第一個選項會開始遊戲,第二個選項會跳到最高記錄的 畫面,第三個選項會跳到quit畫面->(IF選擇第一 個選項)設定遊戲畫面和所有sprite的調色盤->執 行VBL function->當LIFE=0時 Reset 所 有變數並跳進end畫面->在end畫面有兩個選 項,選擇選擇restart會跳到一開始start的標 籤,選擇exit則會進入結束化面並重新跑一次程式。

VBL_FUNCTION

中我們主要用來控制銀幕刷新的速度和顯示物件,在每一次刷新時間到時,

會跑一個程序裡面包含了 query_buttons()、update_player_gfx()、update_player_pos()、

query_select()、四個 function,並在跑完這些程序後,印出更新後的數值,這些數 值包括score、life、n_d(挖到的鑽石數目)、n_i(鐵礦數目)、 n_g(金礦數目)。

SETSTARTBG()

這個 function 是設定 start 畫面的調色盤並顯示在銀幕上。

HIGH_SCORE()

這個函式是在 select 畫面時選擇 High scores 時,讀入這個函式,在銀幕上顯 示出最高記錄的畫面,並且在判斷玩者輸入 start 鍵時,跳回到 select 畫面。

QUERY_BUTTONS()

主要是判斷移動的 function,在這裡我們用到 caculate function 來判斷是否有 障礙物 ,這裡我們判斷使用者按下的上下左右按鍵,如果經過 caculate 判斷使用 者案的方向上沒有障礙物,則更新 player 的位置和方向。

QUERY_SELECT()

(7)

則是判斷挖崛的 function,如果面對的方向有未開發區域並且接收到 A 按鈕 的指令,則會開啟 random_happen 的函式,並且將 stone_exist[][]設為0,Lif e(剩餘挖掘次數),並且更新障礙物的圖像

RANDOM_HAPPEN()

總共有8種情況會 random 出現,有挖到金礦、鐵礦、鑽石、甚麼都沒有等 等,其中最後一種狀況會碰到 enemy,此時會呼叫 random_questions 的 function。

S_RANDOM_HAPPEN()

這是遇到特殊事件時的 function,有兩種事件,第一種會得到大量的黃金,

第二種則會遇到炸彈,此時會創造一個炸彈的物件,並利用一個 bomb_time 來記 錄時間,當 bomb_time 到達1時炸彈變會爆炸。

RANDOM_QUESTIONS()

會隨機產生問題,使用者可以按下 start 和 select 來選擇答案,選擇完之後會 出現加分或扣 life 等不同的結果,並在選擇完後顯示新的 score 並跳出問問題的 模式

SETENDBG()

載入這個 function 時,會進入 end 畫面。

遇到的困難和問題 遇到的困難和問題 遇到的困難和問題 遇到的困難和問題

筆電數不足:

我們這組共有 3 個人但是只有兩台筆電,因此當我們想聚在一起 寫 code 或繪圖時,總會少一台電腦,也因此常常有閒置人力,造成時間的浪費,

因此後來我們利用219電腦教室的電腦來補足電腦數的不足。

記憶體結構不了解:

一開始的時候不太了解 GBA 的存取記憶體方式,留著以 前寫 c 語言的習慣,使用了一堆變數而沒去清空,導致記憶體不足,在換背景時 出現錯誤,之後就要用時才設定,用完立刻清空才解決這個問題。

(8)

錯誤使用調色盤:

原先以為調色盤就是一般常見的 256 色,gfx2gba 指令只是 去判斷圖片中哪裡要用甚麼顏色,導致色彩出現錯誤,圖形整個變得很奇怪,後 來把每個背景用一個調色盤,所有物件編成一個調色盤後,圖形顯示就變的正 常,順利解決問題。

亂數的使用:

本來以為可以跟 C 一樣用 srand(time(NULL))去擷取時間作為亂數 種子,但後來發現沒辦法,可能是 GBA 沒有儲存時間,後來利用 vbl 這個函式 再跑的時候順便加一個數字,把此數字當成亂數種子就可順利解決。

學習心得 學習心得 學習心得 學習心得

b96902023 資工二 游舜翔

在整個 coding 中,大家從無到有慢慢得從學習 Ham 語法開始,繪出屬 於自己遊戲的插圖,看著黑黑的銀幕開始變得有顏色,銀幕上的物件開始移動,

到最後甚至有了開始畫面和選單,成為一個具有完整性的小遊戲,這其中不但花 費了大量心力,也得到許多滿足感,當解決困擾已久的問題時,那種迸發出來的 喜悅實在難以言喻,除此之外,這次接觸 Ham 的經驗非常特別,有別於以往編 寫高階程式語言,這次我們要直接跟硬體作連結,並且對於圖片和編碼也有進一 步的了解,可以說是實際了解了程式語言的實際操作,是一次非常好的學習經驗。

B96902013 資工二 邱柏睿

沒想到寫個小遊戲就要這麼麻煩,所有東西都要從頭弄起,當 code 越 來越長時,要找出 bug 就越困難,過程中各式各樣的 bug 要去解決,才是最困難 的問題。這次的報告,學習到許多程式實際應用,以及跟其他人合作完成報告。

B96902041 資工二 吳承恩

寫了好久的程式,和別人一起合作的感覺真得很不一樣,彼此間不同的 寫作習慣真的有點麻煩,所幸經過溝通討論後都能順利執行。對於 gba 的結構有 了更多的了解,也重新復習了許久未用的 c 語言,畫圖也滿好玩的,看到圖片順 利出現就很開心,HAM 中很多指令都會牽扯到硬體,以前都沒有使用倒,這次 報告真的收穫很豐富,最重要的就是將有限的資源盡可能最佳的去利用。

(9)

感謝名單:

Gfx2gba 轉圖檔軟體轉圖檔軟體轉圖檔軟體轉圖檔軟體

Ham 教學網址教學網址教學網址教學網址 Lhttp://www.aaronrogers.com/ham/

Ham 教程翻義 : http://angeljicu.googlepages.com/ham 特別感謝 : 資工系館

參考文獻

相關文件

(過去稱作進階精簡指令集機器(Advanced RISC Machine) ,更早稱作 Acorn RISC Machine)是一個 32 位元精簡指令集 (RISC) 中央處理器

作業三之中,題目曾要求我們對圖片作 Blur(模糊影像)的效果,先以組合語言建 立一個名為 myfilter 的 assembler source 檔,再用 GBA

MIPS 處理器是個以管線方式工作的處器,因此執行程式碼的速度,就相當 依賴管線的工作方式。絕大多數 MIPS 指令需要在管線 RD 階段取得足夠的 operands,並且在緊接著 ALU 階段之後產生結果。由於

從以上的比較來看,RISC 與 CISC 各有優劣,而 RISC 的實用性則更強一些,應 該是未來處理器架構的發展方向。但事實上,由於早期的很多軟體是根據 CISC 設計的,單純的 RISC

z ESI — Pointer to data in the segment pointed to by the DS register; source pointer for string operationsz. r to data (or destination) in the segment pointed to by

記憶體的規劃上, real mode 使用 segment register 和 offset 相加的方式定址,總共可定址 的空間為 1MB。 作業系統本身使用的空間為 0x10000 以前: 0x5000 開始放檔案表,. 0x7C00 放 boot

void drop_banana()—令 banana 落下。當 banana 尚未落地時,banana 持續落下。當 banana 觸地時,則移除 banana 並且扣除 rabbit 的生命值。當 banana 在落地前被 rabbit 碰觸到時,則移除

¾ Relocation, which modifies the object program so that it can be loaded at an address different from the location originally specified.. ¾ Linking, which combines two or