Thursday, September 10, 2009

PDA應用-象棋連線對戰

This is the html version of the file http://myiecs.iecs.fcu.edu.tw/upload/paper_uni/912pdf/910238.pdf.

Google automatically generates html versions of documents as we crawl the web.

Page 1

1

逢 甲 大 學

資訊工程學系專題報告

PDA之應用象棋連線對戰

學 生:陳 長 威 (四丙)

溫 淙 傑 (四丙)

指導教授 : 劉 振 緒

中華民國九十二年四月

Page 2

2

目錄

第一章導論------------------------------------------------------1

1-1發展動機-------------------------------------------------1

1-2發展目的-------------------------------------------------1

1-3發展特色-------------------------------------------------1

第二章開發環境---------------------------------------------------3

2-1PDA簡介--------------------------------------------------3

2-2開發環境-------------------------------------------------4

2-3開發工具介紹---------------------------------------------6

第三章程式設計--------------------------------------------------12

3-1程式概述------------------------------------------------12

3-2棋子移動、規則檢查--------------------------------------12

3-3 Save&Load、戰後棋譜檢討---------------------------------16

3-4繪圖----------------------------------------------------17

3-5紅外線傳輸----------------------------------------------23

第四章未來發展--------------------------------------------------24

第五章遭遇的困難和解答------------------------------------------25

第六章心得------------------------------------------------------27

附錄A:操作說明------------------------------------------------32

Page 3

3

圖表目錄

圖 1-1 Save&Load------------------------------------2

圖 1-2 ChangeSide-----------------------------------2

圖 1-3 連線對戰-------------------------------------2

圖2-1 設立一個新專案------------------------------7

圖2-2 選擇用c語言來篇寫程式-----------------------7

圖2-3 建好的專案----------------------------------8

圖2-4 呼叫模擬器------------------------------------9

圖2-5 按綠色的箭頭符號來Debug-----------------------9

圖2-6 如果程式無誤Debug將跑出此畫面---------------10

圖2-7 秀出專案裡,.rsrc 資源檔的應用介面-------------11

圖2-8 表單的建構介面--------------------------------11

圖 3-1 選擇棋子-------------------------------------13

圖 3-2 棋面產生-------------------------------------14

圖 3-3 棋子移動流程圖-------------------------------15

圖 3-4 棋盤樣式-------------------------------------17

圖 3-5 棋子的標記-----------------------------------19

圖 3-6 選擇棋子--------------------------------------19

圖 3-7 將不同的地方消除掉----------------------------20

圖 3-8 移動完成--------------------------------------20

圖 3-9 移動後更新 Table 資料--------------------------20

圖 3-10 紅黑棋交換-----------------------------------22

圖 3-11 紅外線傳輸----------------------------------23

圖 A-1 PDA 桌面--------------------------------------32

圖 A-2 象棋遊戲畫面---------------------------------32

圖 A-3 箭頭標記--------------------------------------33

圖 A-4 MENU 按鈕------------------------------------33

圖 A-5 Save 模式------------------------------------34

圖 A-6 Load 模式------------------------------------35

圖 A-7 IrGame---------------------------------------35

圖 A-8 開啟連接阜----------------------------------36

Page 4

4

圖 A-9 關閉連接阜--------------------------------36

圖 A-10 Edit--------------------------------------37

圖 A-11 L,N,U BUTTON-----------------------------37

Page 5

5

摘要

近年來隨著科技越來越進步,有許多東西也越作越小越方便

攜帶,但功能卻越來越強大,PDA 便是其中一項。PDA 現在幾乎已

經成為上班族人手一台的必備工具了,有了它可以管理自己的約

會、記下重要客戶的電話和需求、可以閱讀文件、靠著 GPS 功能

出門也不用怕迷路。而學生一族也可以用來記下重要的考試日

期,今天要上的課和教室,改天要交什麼作業等等。可是 PDA 難

道只有工作的的用途?在平常繁忙的日子中,在空閑的時候能玩

個小遊戲是十分愜意的,也能夠給人一種放鬆的感覺,可能等等

工作起來更加得心應手呢。所以便想作出一個小遊戲,讓人們在

空閒時能靜下心來玩一玩,休息一下然後重新出發。而我們所設

計的遊戲是象棋對戰遊戲。

本遊戲提供幾種功能:

1. 象棋基本的下棋

檢查規則的正確性,如果違反規則將不能移動這一步。

2. 紀錄存檔

讓玩家隨時將現在的進度存下來,以便以後能繼續遊戲。

3. 透過紅外線連線。

Page 6

6

第一章 導論

1-1 發展動機

我本身自己還算喜歡下棋,不過隨著年齡增長,下棋的機會卻

是越來越少,並不是沒有時間,而是時間多半是分散而且瑣碎,

出門自然是不方便下棋的,而在家要下,一盤棋要個幾個小時,

也沒那麼多時間,為了能更有效利用時間所以打算製作象棋遊

戲,存取方便,設計在 PDA 上,攜帶方便,所以 PDA 象棋遊戲

的開端於此。

1-2 發展目的

PDA 在這幾年以來,發展可說是日新月異,PDA 的發展亦可說

為一種必然的趨勢,為什麼?因為 NoteBook 在體積上過於龐大,

而傳統的翻譯機筆記簿,功能不夠完善,於此,我們有理由相信,

攜帶方便功能齊全的 PDA 將會是一種潮流,即使功能完全,在於

一般人工作上使用上的滿足之餘,遊戲雖然並非必須品,但是,

不可否認的,能有少許遊戲,必能在無聊閒暇之餘,作為一休閒

之樂,為啥我會選擇象棋遊戲,因為我自己本身對象棋頗有興趣,

而且象棋本身在實作上,可行性高,畢竟在 PDA 做一個格鬥或者

RPG 遊戲,似乎畫面有所不足,無法做出該有的畫面效果,所以就

打算以象棋為題。

1-3 發展特色

我們的程式包含了幾個特點:

一、 Save&Load:象棋這遊戲,遇到實力相當的對手,少說下

個一兩小時以上,這功能可以讓玩家免於一時時間不夠之

苦,下不完,Save起來下次繼續,基本上一般遊戲來說,

這功能是十分基本而且重要的。

Page 7

7

圖1-1 Save&Load

二、 ChangeSide:有些人下棋不只是因為好玩而下,更是希望

精益求精,能有所進步,這個功能是提供雙方交換棋子,

說的簡單點,就是你把兩人的PDA交換就能做到的功能,

這功能的好處莫過於,兩人實力有一定差距,已經似乎難

以挽回的棋勢,藉由換邊,讓高手處於劣勢,看一個高手

如何挽回劣勢,對於實力有莫大的幫助。

圖1-2 ChangeSide

三、 紅外線的連線:既然要更進一步確實自己是否已經進步,

隨時可以找身邊有Palm的人,利用Ir的連線互相對弈。

圖1-3 連線對戰

四、 棋譜:可以將已經下完的棋局儲存起來,方便日後檢討之

用。

Page 8

8

第二章開發環境

2-1 PDA 簡介

PDA: Personal Digital Assistant─個人數位助理,90 年代

初期,前蘋果電腦總裁 John Scully 提出 PDA 的觀念。Scully 認

為,人類需要接收的資訊愈來愈多,PDA 的發明能協助現代人處理

龐大資訊、管理工作及生活。而全球第 1 台 PDA 就是由蘋果電腦

製造,名為 Newton,開啟了目前可攜式消費產品的濫殤。許多廠

商與使用者都以為,PDA 將帶動電腦應用的另一項革命,由於它模

擬了掌上型電腦,因此是新一代最具代表性的個人化產品。大部

分 PDA 產品都有一個小鍵盤可供輸入,一些 PDA 則有一個靈敏的

面板可供手寫辨識。而某些 PDA 則利用語音辨識技術,提供語音

輸入方式。

以上是書本上對 PDA 的解釋,但是為什麼 PDA 能夠受到大家

的喜愛呢。它能被大眾接受因為它有以下的優點:

1.多功能:

它具有電子手冊功能,可以作為個人資訊管理之用,像是個

人時程記錄管理、記事本、通訊錄、計算機等功能都包含在內。

而隨著周邊網路產品的成熟,以及產品功能的推陳出新,其後推

出的PalmPilot,更兼具個人數位通訊能力。我們一般生活中會用

到的東西大都可以用PDA 來代替,例如記事本、計算機、行事曆、

鬧鐘、遊戲機、外掛模組作為行動電話、數位相機等等……。

2.方便

也因為它有以上的優點所以我們只要帶著一個PDA就可以不

用帶那麼多重複的東西以減少我們的負擔而且可以不用像

notebook 一樣要隨時擔心沒電。

且雖然PDA 功能多又方便,但是體積並不大,可以說是

notebook 的濃縮版,擁有notebook 的基本處理功能卻沒有

notebook 的缺點。

3.多元化:

Page 9

9

對於行動使用者(mobile user)而言,PDA提供了較筆記型電

腦更方便的可攜性。同時,它具有操作簡易、提供金融理財與日

常生活等資訊的功能,並能外接PC與筆記型電腦,將資料作雙向

傳輸。而新型的PDA更可連結大哥大,上網蒐集資料,並能接收GPS

的訊息。隨著普遍化,投入的人力,和發展出的創意和實用的軟

體,讓PDA 更具有可看性。

2-2 開發環境

PDA 目前的市場規格大致有二大類:一個是老牌的

Palm 系列、另一個是 Pocket PC 系列。差別在哪裡?只要

差在 PDA 機器內部的作業系統不同;老牌的 Palm 系列機

種內建的系統是 Palm OS,而 Pocket PC 系列內建的系統

是 Microsoft Pocket PC OS。

二種 PDA 所用的程式不能相容,比如你買了 Palm OS

的 PDA 以後,你只能買 Palm OS 相容或專用的軟體,如果

你買了 Pocket PC 的 PDA 日後也就只能買 Pocket PC OS

相容或專用的軟體。底下我們將分別討論一下兩者的差異。

2-2-1

Palm

基本的特性就是操作簡單、快速、穩定。怎麼說呢?

因為 Palm OS 本身設計是在同一個時間裡只有單一支程式

在執行,比方說:你現在正在寫備忘錄,突然想到要查一

下行事曆看日子,當你畫面切換到行事曆時,其實系統己

經將備忘錄關閉了(記憶體會被清空出來,可供其它程式

使用)這種方式在電腦述語裡叫”單工”;由於這種模式

是很單純的,所以系統通常會比較穩定一點;或者你可以

想成一次叫你做一件事跟一次叫你做多件事的意思,前者

凸搥的機率比較低。另外 Palm OS 由於這個特性所以當初

設計時所用的 CPU(處理器)速度只有 16MHZ. (現在隨便一

個桌上型電腦就 1.6Ghz 約是它的 1000 倍以上), 所以頂

多只能處理:計算機、行事曆...等等簡單的程式。最

近幾年 Palm OS 也漸漸著重 PDA 的娛樂性(播放音樂、遊

Page 10

10

戲、內建照相機...), 所以 CPU 速度目前最快也達到

200Mhz 了。

Palm 的另一特色便是沒有檔案系統,像 Window 有 NTFS

檔案系統,DOS 有 FAT 檔案系統,可是 Palm 沒有硬碟當然

就不需要檔案系統。取而代之的是,Palm 將記憶體是為是

多個資料庫,每一個資料庫裡有許多筆資料,每一筆資料

可以是不同大小。任何程式都只是這個資料庫的一筆資料

而已。執行程式時,也都是就地執行,不像一般桌上型電

腦執行檔得先從硬碟傳到記憶體在執行,Palm OS 的執行

檔本來就在記憶體中了。

2-2-2Pocket PC

Pocket PC 加入 PDA 市場比較晚,微軟為了快速跟 PALM

OS 有所區隔,所以 Pocket PC 當時就以除了基本行事曆功

能以外,另外強調其 PDA 的多媒體性:可以播放音樂、3D

遊戲等等...;也因為要處理這些複雜的程式,所以 Pocket

PC 當時 CPU 就以 100Mhz 起跳,相對的成本比較高一點;

目前最快的 CPU 為 400Mhz。

另外 Pocket

PC

OS 的特性剛好跟 Palm OS 不一樣,Pocket

PC OS 強調他是可以多工的(同一時間內可以處二個以上

工作);比方說:你在 windows 98 裡可以同時開啟”小畫

家”跟”接龍遊戲”一樣,只是因為 Pokcet PC 因為螢幕

太小,同一時間只能顯示一個程式在畫面上,另一個則是

佔時隱藏在背景裡;這種 OS 系統的特性是,如果你一直

切換程式如:點選了約會、記事本、工作、計算機時,你

會發現系統會愈跑愈慢,最壞情形時會出現”記憶體不

足,無法執行”的訊息;這是因為前一個程式會佔用在記

憶中(不會像 Palm OS 一樣會自動關閉),除非你親自到記

憶體管理程式中停止(釋放記憶體)這些程式,否則系統

運作不會順利。

雖然有這個現象,但是由於 Pocket PC 是微軟設計

的,支援它的廠商很多,遊戲聲光效果都很棒,操作介面

都跟 windows 98、ME、2000、XP 類似,所以還滿容易上

Page 11

11

手的。只是差在因為它是”多工”,所以

穩定度沒有像 Palm OS 一樣。不過科技是一直在進步的,

沒人能保證明天的 Pocket PC 是否會更進步。

由上面的介紹我們可以得知在硬體的功能和軟體的

表現上都是 Pocket PC 比較好,甚至一般來說使用 Pocket

PC 系統的機型,它的螢幕通常為 240*320 pixel。而使用

Palm OS 的機型的螢幕通常只有 160*160 pixel。

那為什麼我們選擇使用 Palm 呢?是因為使用 Palm OS

的機型在價錢上比較便宜,待機時間也比較久。因此 Palm

OS 比較適合學生來使用。

2-3 開發工具的介紹

那我們要如何製作出一個 Palm 程式呢?有些工具可以幫忙,

如 CodeWarrior、GCC、PilRC、POSE (Palm 模擬器)、PalmOS SDK

等,這些軟體除了 CodeWarrior 本身須要購買外,其它的都是免

費的。

2-3-1 開發工具的介紹

程式採用的開發工具是 CodeWarrior for Palm OS Platform 7.0

和 Palm OS Simulator,Code Warrior 是使用 C 語言來進行程式開

發的工作,這套工具是屬於整合式的視窗環境介面,在開發的過

程中,可以利用設置中斷點來追蹤記憶體中變數的變化,是否合

於預期的運作流程,在各個函式之間的呼叫,是否有陷入無窮迴

圈。

而 Simulator 和 Emulator 同樣是模擬 Palm 的工具,Simulator

和 Emulator 的差異在於,Simulator 可以說是將 PalmOS compiler

成 x86 執行檔,所以執行的效率比較高,而 Emulator 則是完完全

全的硬體模擬,他模擬真實的 Palm 硬體的動作,匯流排的操作,

Page 12

12

處理器中暫存器的值。在開發的過程中,我們使用 Simulator 比較

方便的。

2-3-2 CodeWarrior的應用

圖2-1 設立一個新專案

Page 13

13

圖2-2 選擇用c語言來篇寫程式

圖2-3 建好的專案

其中有三個主要的資料夾[Soure],[Resource],

[Palm OS Device]

1.Soure :

Page 14

14

Starter.c 和 Starter.h ,此資料夾存在程式碼和程式的標頭檔

header。

2.Resources :

Starter.rsrc 是為專案裡的資源檔,利用Constructor for Palm

OS 來建構我們所需的元件、資源,如button等。

3.Palm OS Device :

存放程式碼的涵式資料庫

圖2-4 呼叫模擬器

Page 15

15

圖2-5 按綠色的箭頭符號來Debug

圖2-6 如果程式無誤Debug將跑出此畫面

2-3-4 Constructor for Palm OS的應用

可以利用Constructor for Palm OS應用程式來製作表單和繪圖

Page 16

16

圖2-7 秀出專案裡,.rsrc 資源檔的應用介面

圖2-8 表單的建構介面

最後將產生一副檔名為prc的執行檔,把.prc檔直接拖曳到模擬器

Page 17

17

上便可以載入執行了。

第三章程式設計

3-1 程式概述

基本上整個程式可以說是一個極大的迴圈所製作而成,以 PDA 的

Pendown 作為觸發事件,抓取 Pendown 點為始,在去判斷該輪玩

家,所點的棋子或是任何位置,是否合法化,在繼續執行程式,

概略上來說,整體程式執行為:

User->Pen->主程式->紅外線連線

->規則檢查移動執行

->繪圖

->Save&Load

->棋譜

->ChangeSide

程式主要功能:

1. 規則檢查:看看所走之步伐是否合法化。

2. 紀錄棋譜:將每一步紀錄下來。

3. 賽後檢討:可以在遊戲結束後,在一步步重走瀏覽,可往前往

後。

4. Save&Load:存起來下次繼續。

整個程式的架構雖然是如此,玩家所能掌握的是 Pendwon 然後執

行棋子移動以及 Save&Load,以及觀看棋譜,和 ChangeSide,紅

外線的連線和終止,基本上規則檢查以及繪圖,完全是由主程式

所掌握,當然移動棋子必須輔合規則,否則當然無法移動,基本

上本人最近打 CS 遇到一堆 Cheater,所以心理十分不滿,因此並

沒有在此遊戲中設計作弊的功能。

3-2 棋子移動、規則檢查

3-2-1 規劃

Page 18

18

當然在首先規劃上,規則是一定要的,雖然規則都是死的,照做

就好,但是還是有遇到些問題,像炮本身移動以及吃,可說是分

為兩種不同型式,但是走法上略同,設計上判斷就麻煩些了,整

體規劃來說,棋子移動,我的做法是,先在內部將棋子移動到目

的地,並沒有直些繪圖,而是移動到目的地後,再把之前的位置

以及現在位置,套入完成的規則內,利用開始位置以前目的地做

比較,看看是否合法化,如果合法,就真的將棋子移動然後繪圖,

如果不合法的話,就將棋子踢回原來的位置,然後再次等待 User

做 Pendown,當然在每一步執行後,都將棋步丟入 LinkList 中,

以便做棋譜以及悔一手之用。

3-2-2 實作

基本上整個棋盤是存於陣列之中,每一個棋盤點上,都有對應一

個陣列位置,棋子各有個的名稱,至於空白位置上則是設定為

NULL,這樣做的好處莫過於,在繪圖的時候,直接對應座標就可

以將每一個位置繪出,而在棋子的移動上,更是直些可以利用座

標去判斷,十分方便,基本上棋子移動可分為下列步驟:

1. 選取棋子:

首先必須要判斷的是,是否選對棋子,例如白色棋子移動時選

到黑色那麼依舊可以讓他選取,但是不能做任何移動的動作。

圖 3-1 選擇棋子

Page 19

19

2.判斷目的地:

已經確定選擇正確棋子之後,接下來就是判斷移動,在移動

中,第一個判斷就是:目的地是否有棋子,在象棋規則中,是不

分大小的,只要合乎走法,就可以吃子,當然,黑吃黑或者白吃

白是不被允許的,先看目的地棋子是否為行動方的棋子,如果是

則判斷違反規則,不讓其行走,如果為對方的棋子或者空白則進

入下一步驟。

片段判斷程式架構:

if(IsBlack(ChessTable1[destX][destY].name)==true) return false;

//黑的不能吃黑滴

3.規則檢查:

已經確定目的地為對方棋子或者是空白位置後,接著就是檢

查,是否合乎基本的象棋規則。

4.正式移動:

在確定規則都正確之後,將陣列復原然後正式移動,當然,有

一重要的步驟是,將棋步丟入 LinkList 中,這樣才能作為以後看

棋譜之用。

5. 棋面產生:

以上動作,都是在系統內部,陣列判斷中做的,事實上棋面並

未有所動作,在此呼叫繪圖程式將真正的棋面完成。

Page 20

20

圖 3-2 棋面產生

選取棋子

判斷目的地

規則檢查

正式移動

錯誤

Page 21

21

圖 3-3 棋子移動流程圖

3-3Save&Load、戰後棋譜檢討

3-3-1 規劃

基本上 Save&Load 和棋譜,大體上可說是一起做的,在規劃上,

每一個正確的棋步,都會將其儲存於一個 LinkList 中,正確來說

應該是一條雙向的 LinkList,做成雙向的好處莫過於,在悔一手的

時候可以利用反向來製作,此外當然看棋譜的時候,亦需要來回

觀看,揣摩,所以為了能夠來回方便,雙向的 LinkList 是必要的,

至於為何選用 LinkList 來製作而不利用陣列,因為在這裡並非像

是之前棋子移動,在棋子移動中我們所要注意的是位置間的對

應,所以利用陣列比較方便,在這我們需要的是一個先後的連續

關係,雖然陣列也可以使用,但是沒有人可以知道一盤棋需要多

少步規劃陣列可能過大或者過小,一來造成當機二來造成浪費,

所以利用動態配置記憶體的 LinkList 是一個十分好的選擇。

3-3-2 實作

基本上就如同規劃所說,實作一個雙向的 LinkList,向 OS 要一塊

繪圖

結束

Page 22

22

記憶體(new),然後依照一般使用 LinkList 的方式來將資料存取,

每走一步棋,就在尾端增加一個 node,在來利用基本的 LinkList

走訪,就能製作出往前往後的功能了。

在 PDA 的資料庫來說,亦可說為另一種型態的 Memory,不同在於

他在使用的時候需要 Lock,免於被 OS 拿去使用,當然使用後還

是需要 unLock,不然漸漸你就會發現,你的 PDA 不會動了,

Memory 被吃光,雖然使用上感覺比較麻煩,但是事實上這是必須

的,這樣對程式對 OS 都算是一種保護作用,畢竟 PDA 不比筆記

型電腦,RAM 動輒幾百 MB,所以有效的規劃使用,這對於系統

資源不算豐富的 PDA 來說,是十分重要的,好的規劃不只可以使

程式穩定,更可以讓 OS 負擔減輕。

3-4 繪圖

3-4-1 規劃

要製作一個象棋遊戲,第一步當然是要先畫出一個象棋棋盤

來。那象棋棋盤長什麼樣子呢?就如同下圖一般。

圖 3-4 棋盤樣式

因為象棋棋盤不同於其他棋類的棋盤一般,只用單純的直

線畫出。在有些地方有著不同的標記圖案,如將、士所在的九

宮格裡就有著斜線,而不是單純的直線,而卒和包一開始的放

置位置便有著十字的標記。為了表現出這些差別,讓玩家更有

在玩象棋的感覺,完整的畫出整個棋盤是應該要做到的地

Page 23

23

方,,所以我們採用貼圖的方式來繪製整個棋盤。

3-4-2 繪製棋盤、棋子

且在實作上利用貼圖的方式是十分方便的,先作出各個小

圖,並賦予每一個小圖一個獨特的編號,且每一個小圖都是

15 像素*15 像素大小。利用 DrawOneTable 程式去決定在畫面

上的何處要貼上哪一個小圖。

void DrawOneTable(int i,int j,int size){

if(i==0){

if(j==0){

DrawBitmap(i*15,j*15,1201);

}

• ••

else if(j==9|j==4){

DrawBitmap(i*15,j*15,1303);

}

else{DrawBitmap(i*15,j*15,1302);}

}

}

i,j 為棋盤上的位置。i 是由左至右的每一條直線,從 0~8,

而 j 是由上至下的每一條橫線,從 0~9,所以必須將 i,j 乘上

15(size 大小)才是在畫面上的 x,y 值。而那一串數字便是代表

了每一個小圖的代號。

而 DrawBitmap 程式依照所傳來的 id 號碼,將正確的圖貼

到畫面上的正確位置。

void DrawBitmap(int x, int y, int id){

MemHandle h;

BitmapPtr p;

h = DmGet1Resource('Tbmp', id);

if (h != NULL) {

p = (BitmapPtr) MemHandleLock(h);

Page 24

24

WinPaintBitmap(p, x, y);

MemHandleUnlock(h);

DmReleaseResource(h);

}

}

而繪製棋子的部分也是依照上面的方法利用 DrawBitmap

程式在正確的地方貼上棋子。而棋子的起始值存放在

ResetTable1()中

ChessTable1[0][0].name=BcastleBitmapFamily;

ChessTable1[0][1].name=BknightBitmapFamily;

ChessTable1[0][2].name=BbishopBitmapFamily;

•••

ChessTable1[9][7].name=WknightBitmapFamily;

ChessTable1[9][8].name=WcastleBitmapFamily;

3-4-3 棋子的標記

當我們玩家開始開始玩之後,卻發現一個問題。就是如果

我們玩家在選擇完棋子之後,如果沒有馬上移動,常常會忘

記自己是否已經選擇和選擇的是哪一顆棋子,因此加上了一

個 mark 棋子的功能。利用 MarkBitmap 在被選擇的棋子的位

置上去貼上一張圖,但這張圖和一般小圖的性質不同,是為

可透視的,因此並不會遮蓋住底下棋子的圖檔。

圖 3-5 棋子的標記

3-4-4 棋子的移動

Page 25

25

繪圖的資料是包含了兩個 9*10 的陣列,每個陣列中有三

個元素分別為 ChessTable1[x][y].chosen 代表是否選擇了棋

子、ChessTable1[x][y].marked 代表棋子是否被標記和

ChessTable1[x][y].name 代表棋子的名字。在繪圖時先檢查兩個

陣列有哪些棋子的名字不同,將不同名的地方消除掉,在根據

ChessTable1 來畫上新的棋子,之後將新棋盤的資料複製到

ChessTable2 上。

圖 3-6 選擇棋子

圖 3-7 將不同的地方消除掉

Page 26

26

圖 3-8 移動完成

圖 3-9 移動後更新 Table 資料

3-4-5 紅黑棋交換

因為希望當象棋完到一半時藉由換邊,讓高手處於劣

勢,看一個高手如何挽回劣勢,讓較弱者能夠學習以提高他

的實力,所以增加了這個功能。

在掉換的過程中整個陣列並沒有更動,換句話說只是表

現在畫面上時有所改變而已。利用 Turn_Side 來改變畫面的座

標位置

void Turn_Side(int &x,int &y,Boolean turn){

if(turn){

ChessTable1

ChessTable2

消除掉不同的地方

檢查是否相同

畫上新棋子

刷新 ChessTable2 資料

Page 27

27

x=x-9;

y=y-8;

if(x

if(y

return;

}

return;

}

不過因為整個象棋棋盤並不是正方形,而是 9*10 的長方

形,因此只改變畫面上座標的話是行不通的,會抓不到棋子。

所以在選取棋子的程式中多加了一個判斷,如果棋盤掉換過

的話,抓取棋子的位置也要跟著改變。

if(!IsBlackSide){MarkBitmap(y*15,x*15,1700);}

else{

y=y-8;

y=-y;

x=x-9;

x=-x;

MarkBitmap(y*15,x*15,1700);}

圖 3-10 紅黑棋交換

Page 28

28

3-5 紅外線傳輸

基本上在 CodeWarrior for Palm OS Platform 這個工具中,有提

供一個叫做 IR Library 的 FunctionCall 來控制紅外線傳輸,而在這

一個 IR Library 中,是由程式本身來控制連線以及中斷,事實上來

說,為啥會知道有這樣一個 FunctionCall 可以利用,是由於找到一

個範例程式,在由範例程式加以修改完成。

基本紅外線傳輸的步驟,大致如下:尋找對方設備,然後傳送

連線要求,當建立連線之後,在傳送資料,最後在同步兩邊的機

器資訊比對。

在我們的程式中,為了使用者便利,所以在連線上的方式是,

Page 29

29

用完就斷線,簡單的說,就是當下完一步棋,就開啟連線,然後

將資料傳輸,然後確定同步之後,就斷線,這樣的好處在於,User

可以在下棋的時候,不用管 IR 設備還開啟的問題。

整體來說當連線由 A(Server)發起時(第一次建立連線),A 將會

建立一個連線的通道,AB 兩端便由 A 所建立的通道來溝通。當

同步完成時,B(Client)將會找尋 A 的裝置名(Address),這樣一來

AB 皆有彼此的 Address,以便於在次連線的時候(走下一步棋) ,

能夠很快的發送,不用再次尋找對方的位置。

當已經建立過第一次連線之後,就沒有所謂的 Server 以及

Client 端之分別,雙方皆可以主動連線,然後傳送棋步,因為平時

是處於斷線的狀態,所以平時雙方不需要考慮 PDA 的放置位置,

更方便的是,當決定棋步之後,下棋的一方(或者毀棋) ,可以立

刻建立連線然後將棋步送出。

圖 3-11 紅外線傳輸

第四章未來發展

這個遊戲基本上還是很陽春的,能在附加上去的功能很多,以

下分門別類來說明:

1. 增加外在棋譜:本遊戲中雖然可以儲存,然後將舊有的已經結

束的棋譜叫出來,重新在看過,來檢討,但是,並沒有支援外

在棋譜輸入的功能,這方面可以在加強!

2. 增加 AI:這個遊戲並沒有設定 AI,因為,我們最初的構想,

並沒有把 AI 囊括在內,因為一開始的考量是,PDA 本身就是我

執行棋步

接收棋步





































Page 30

30

們所不熟悉的東西,要一步一步重零開始,事實上已經花費了

不少時間,所以在 AI 方面並沒有特別設置!

3. 考量 Web 模式:基本上這遊戲僅僅止於兩人對戰的小遊戲,如

果有足夠的資金,可以有一個 sever,然後將紅外線傳輸改為一

般網路的規格,這樣在 sever 上,就可以提供大家做對手選擇以

及對戰,有點類似早期宏碁戲谷的內容,一個大 sever,大家可

以連線過去選擇對手對戰。

4. 程式開發工具:基本上這個程式可以作為一個基本棋類的開發

工具,整體來說,原先的工具所提供的功能之下,我們可以輕

易的自己製圖,或者匯入圖檔,只要按照編號邊好,設定完成,

在來就是在 table 程式中,去修改關於陣列的設定,然後 rule,

部分一一修正(看你要寫啥棋類,去寫該棋子的功能就行啦),

然後注意 ChangSide 的座標,那麼幾乎就已經將一個基本的棋

類遊戲完成了,當要要注意的是,所有新增的副程式,最好都

要在表頭檔中定義,這樣可以避免可能因為跨檔案的呼叫,會

出現的 Bug。

第五章 遭遇的困難和解答

Q:第一個大問題莫過於開發工具的選擇,因為是第一次接觸

PDA,實在不知道該用哪一種開發工具,正確來說連有哪幾種開

發工具都不清楚!

A:這個問題,可以說是卡最久的問題,因為工具繁多,而且事實

上我們並不了解,後來得知有另一組同學也是做有關於 PDA 的應

用,找他們討論之後,才知道有這一個方便的軟體工具可以使用,

更重要的是,有些直接關於 PDA 才有的 Pendown、PenUp 之類的

Page 31

31

程式,一開始內部就有定義了,我們只需要去 call 就能知道

Pendown 在何處,這樣對整體抓位置以及之後貼圖座標的設定有

莫大幫助。

Q:第二個面臨的問題是,貼圖,畢竟能用 C 語言來寫,對我們

來說幫助很大,事實上其他語言我們也不熟悉,但是 C 雖然接觸

最多,但是,實際上貼圖運作,幾乎沒有用上,貼圖就成了一個

大問題了。

A:這一個問題解決上,算是運氣十分的好,在工具內部,就已經

有函式可以利用,基本上只要 call 下去然後把要貼的圖代碼以及

座標位置傳入,那麼基本貼圖就完成了。

Q:基本貼圖是解決了,一開始打算是,每走一步棋之後,將整個

盤面重新繪製,這樣一來製作上方便,也比較簡單而且省程式碼,

但是,有一個問題存在,因為,每走一步就整個重繪過,這樣會

造成,畫面閃爍。

A:這個問題是有點麻煩了,基本上整個版面重繪,是很方便,但

是會閃,實在傷眼,後來解決的方案是,只有重繪有改變的部分,

也因此,我們原先的陣列只有一個改為兩個,利用移動前後陣列

的不同處,來作重繪。

Q:製作 rule 的部分,基本上困難遇到的較少,畢竟規則是死的,

象棋規則就是那樣,應該也不至於隨意的更動,但是基本上所有

rule 還是依照我自己的概念直接寫成,所以可能在程式處理上,應

該都會有更好的處理或者判斷方式,這方面遇到的問題,大概就

是炮吧。

A:炮的問題在於,移動和吃子是分成兩種型態,因為我們移動以

及吃子是一起做的,基本上,除了炮以外,其他棋子只要可以移

動到該處,只要是空格或者是對方棋子就可以移動過去或者吃掉

對方,對於炮而言可以說是雙重標準,最後我所採用的是最笨的

方法,直接由限制移動來完成,移動時基本判斷與車相同,但是,

故意將行走限制上,少一格,這樣一來就可以造成像車一般移動

Page 32

32

卻不能吃子了,在吃子方面,則是多加一個 conter,紀錄著跨越的

棋子數目,基本上炮是只能跨越一個棋子然後吃子,至於做 conter

是怕沒有跨子和跨兩子以上,所以在這方面問題就解決了,但是

因為是用這種方法,所以程式碼格外的龐大。

Q:大致上在模擬器階段完工之後,問題就在於準備上機了,上機

之前,兩大問題莫過於,連線以及雙方方向不同的問題,在模擬

器上,所能做的僅僅止於 ChangeSide,很奇怪的是在 ChangeSide

中,我們一旦只要換邊之後,棋子就不能移動,但是換回來之後,

就又可以繼續走了。

A:這個問題卡了很久,沒解決也無法上機,實在很苦,最後終於,

自暴自棄開始暴走,胡亂點,突然發現,會走了!原來是旋轉的

時候的對應出了問題,棋子都移位了,基本上旋轉只是座標上的

旋轉應該不至於出錯,對應一下就行了,後來才發現,問題在於

我們最初的最標設定,機器內部 XY 軸,和我設定的陣列第一座

標和第二座標,是相反的,因為直接貼圖即使相反,因為不旋轉,

只要相對應的正確,就能正確貼圖,再貼圖位置運算上也就會正

常,但是經過旋轉的時候,陣列的確正確旋轉,因為直接經過運

算丟入就行了,但是在貼圖的時候,XY 軸就差很多了貼圖所對應

的是實際座標位置,象棋並非方正的棋盤,而是 9*10 的座標,所

以對應上必須改正,修正後果然正確了,雖然 XY 軸對應的應該

是第二第一這樣相反的,但是在這裡並不會衝突,因為陣列只是

提供位置,所以繪圖上不會有問題。

Q:終於上機了,單機來說,是很正常,沒有問太多問題,最大的

問題莫過於連線了,不能連線怎麼連線對戰,這遊戲本身並沒有

設定 AI,所以連線對戰,是必須的,雖然說一台 PDA 還是可以讓

兩人輪流下,但是這樣還是有點不方便,所以必須要製作連線來

解決這個問題。

A:連線的方式有很多種,最後我們選擇的是,紅外線傳輸,為什

麼?理由十分簡單,第一個考量的就是 PDA 有哪些可用的,小小

的 PDA,總不能像 NoteBook 插一張卡用 802.11 的規格吧!而且

Page 33

33

事實上我們所應用的只是單純的兩台連線,應該用不上那種複雜

的東西,更重要的是,我們手機中,如果有連線遊戲,都是用紅

外線搞出來的,例如貪食蛇,雖然據我所知好像除了我自己本身

以外,根本沒有人會無聊到拿和人拿兩隻手機一起連線玩貪食

蛇,不管怎說,就是因為這原因,所以我決定使用紅外線,當作

我們的傳出連線工具。

F:決定使用紅外線傳輸之後,當然問題就是,紅外線傳輸怎麼使

用,說很簡單,事實上,我們完全沒有摸過這玩意的程式,大問

題又來了,紅外線要怎做。

Q:基本上這個問題解決在於,利用 IR Library 這一個

FunctionCall,來控制有關於紅外線傳輸,基本上要實際應用還是

有困難的,我們後來有找到一個範例程式,然後利用範例程式修

改而成,大體上也要謝謝一位同學,他在上學期也是製作有關 PDA

的遊戲,所以在這方面向他請教了不少。

第六章 心得

資訊四丙陳長威:

專題題目,其實考慮了很久,事實上,也換過一次指導老師,

Page 34

34

原本是打算做硬體的,不過因為某些原因,最後才決定換老師,

做 PDA 遊戲,之所以會選擇 PDA 莫過於,PDA 的畫面小,如果

做遊戲,也不能做的太過複雜,畫面上也有限,所以這樣感覺上,

做起來會比較輕鬆一點,就像同樣象棋遊戲,在一般 PC 上做的

話,感覺上就要做得功能十分完善,但是在小小的 PDA 上的時候,

就要有所取捨,所以就此決定,開發在 PDA 平台上,雖然 PDA

是一個很陌生的東西,但是聽同學說,已經有模擬器可以使用,

所以基本操作上,我們可以在 PC 上去寫,因此就更堅定,決定做

PDA 的遊戲了,最後我們選擇的是象棋遊戲,因為 PDA 其實畫面

並不大,所以能選擇的遊戲種類很有限,原本想製作文字 RPG 遊

戲,不過那樣顯的很單調,而且,那樣會只有一大堆的文字,感

覺上並不適合,至於動作的 RPG 的話,那麼,PDA 的畫面,似乎

有所不足,所以決定,製作棋類遊戲,為啥決定象棋,一來因為

我個人對象棋有興趣,二來我想到的棋類中,感覺上適合做的就

是,象棋、西洋棋、陸軍棋,這一類格子方正的棋類,西洋棋,

嗯!我不會下,不考慮,陸軍棋,感覺上棋子走的沒有太多的規

則,做起來感覺上程式會比較單調容易,所以決定以象棋為題目。

專題的製作過程中,其實遇到了不少的問題,至於問題,較大

的問題,都已經在 Q&A 中提出來了,在此就不再囉唆的打一遍

了,感覺上還要蠻謝謝一些同學,在各方面的支援,不只是程式

技術部分,就連最後打報告,一開始我還打的爆笑百出,沒有依

照基本格式去做,然後呆呆的還打了一大堆字,打了三千字還比

不上個五六張圖片的版面,而且插圖,在解說上也方便許多,所

以後來就在插入大量的圖片,不過很好奇的是,一般看來專題

paper 大約都是 30-60 頁左右,彷彿變成了一種,固定的型態,讓

後人大家都遵照此法執行,事實上說真的,很多的 paper 根本用不

到那麼多版面,只是一直插圖,連沒必要的也插圖,用來撐場面

而已,我個人認為這是十分沒有意義的,徒然浪費而已,但是很

無奈,這已經是一種風氣,似乎專題太薄看起來沒有氣勢,我也

只好隨波逐流,放了一堆的圖片,來增加版面,當然不可或缺的

就是,依靠個人說寫能力,努力的把心得寫多一點看起來好像比

較多字,這種歪風到底何時才會停止,希望有學弟能夠打破此歪

Page 35

35

風,報告還是精簡易懂,有內容,那樣才比較實際,不燃放了一

堆東西,看的人痛苦,做的人更苦,何苦呢?而且讓我更好奇的

是,這份專題上,我已經打了應該不下萬字了吧!其中不包括網

路資料,以及另一位組員所負責的部分,到底,我們偉大的評審

們,會看幾個字?在說,我們這組並不突出,而且 paper 已經算少

的吧!如果他有耐心去一份一份的看,那麼其他組的,那不就要

更久了?在此,隊友用心在看 paper 的評審教授們,致上最高的敬

意!

最後對於專題,只能說感覺到十分無奈,大部分的科系,專題

都是選修為多,而我們卻是必修,雖然已經完工,但是還是覺得,

專題還是留給有心發展,或者為了推薦徵試、申請入學的人去做,

感覺上會比較實際,畢竟不是每個人都有心於此,強迫性的專題,

感覺上,真的能學到東西嗎?我個人認為,學到的東西實在太有

限了,就拿我自己為例子,你問我學到啥?那個模擬器,到現在

我還是只會點 Compiler,然後做 step by step,的執行,去 Debug,

然後在模擬器上,做動作,設定中斷點,來檢查內部參數,雖然

還有工具做圖,繪圖部分不是我做,我完全沒有去碰,結論,我

只是像拿了個另一個工具,在努力的寫 C 程式,真的學到的大概

就是利用他來把龐大的程式,分開在很多不同的小程式寫,在組

合在一起,其他方面或多或少,學了些東西,此外就是在寫判斷

上,有所進步,還有基本的 DataStruct 有點進步,在 LinkList 的使

用時,更容易上手,大概就是這些了吧!雖然說我還不確定自己

專題是否可以過關,但是還是希望,以後不用荼毒學弟了,專題

這玩意,就留給有心人去做,感覺上會比較實際吧!畢竟真的有

心去做,做出來的東西才會用心,就算原本有心的人想做,但是

變成強制在課業上一定要做,壓力就來了,為了如期繳交,所製

作出來的工自然也就比較粗操了,所以還是希望,專題改選修吧!

說歸說,系上看的見我這篇心得嗎?看的見會不會聽又是另一回

事情了!

資訊四丙溫淙傑:

Page 36

36

專題的製作是每一個資工系學生的必經之路,可是對大部分

學生而言也可以說是一個全新的挑戰,至少對我來說製作專題是

一項體驗,從一開始的找老師和找題目便開始有了困難。在大三

時,找了王益文老師為執導教授,認為本身在硬體方面比較有興

趣,可惜當我加入之後發現現實跟想像還是有點差距,因此萌生

退意。之後和同組組員商量之後便找了劉振緒老師來作指導教

授,也決定作一個遊戲來作為專題內容。

一開始是想在電腦上作一個象棋遊戲,因為我和另一組員都

滿喜歡象棋的,且對象棋都有一定的認知。那為什麼後來改到在

PDA上實作呢?是因為我們想到了一件事,下象棋時,什麼情況下

會讓一個人的棋藝進步呢?答案很明顯的是跟人對戰的時候,只

有在和高手對戰中才能很快地看清楚自己思考不足的地方。因此

我們決定將遊戲製作在攜帶方便而且是目前熱門的PDA上。

可是以前完全沒碰過PDA,連要用什麼開發工具來製作程式都

不知道,所以只好跑圖書館借了一些書回來看,希望能在其中多

加認識Palm的製作工具、方法。書上看不懂的地方便跑去問一些

已經了解的同學,慢慢的也開始知道該如何動手,雖然在實作的

過程中,仍然處處碰壁。

在專題的製作過程中,聽說其他組別在討論過程中,大家都

各持己見,不肯各退一步,最後大家翻臉拆組。想到這就覺得這

些其實都是可以避免的,每一個人對一件事情的看法本來就不可

能完全一樣,如果大家都有這樣的共識。不要堅持自己的想法,

試著去了解對方為什麼想這樣做,或許就不會有這樣的事發生了。

這次的專題除了讓我接觸到之前從沒接觸過的Palm,但更重

要的是讓我提會到人際溝通的重要,有些小組能一起解決困難,

有些小組到了最後組員間已經鬧翻了。因此更是感謝跟我同一組

的組員能夠不介意我寫程式功力很差很差,常常幫助我。還有每

次我去詢問同學一些不明白的地方時,同學總是不厭其煩的講

解,即使他之前已經講過一遍了。

參考資料

Page 37

37

[1] Palm, Inc.5400 Bayfront Plaza Santa Clara, CA 95052 USA

Palm OS SDK Reference Document Number 3003-003 June 23,

2000 http://homepages.enterprise.net/jmarshall/palmos/

[2]Lonnon R.Foster/原著,陳永昱/譯,PalmOS程式設計大全(譯

自Palm OS Programming Bible),旗標,民90

[3]Robert Mykland/原著, 吳卓俊/譯,PalmOS程式設計大全(譯

自PalmOS Programming From the Ground

Up),McGrawHill,2001.4

[4]紅外線標準協會 http://www.irda.org/

[5]PalmSource http://www.palmos.com/dev/support/

[6] Bid-Palm.com專業PDA網站http://www.bid-palm.com/

[7] CPalm漢化聯盟 首頁http://cpalm.idv.tw/

Page 38

38

附錄 A:操作說明

當一切準備妥當之後便可以將象棋遊戲灌進 PDA 中,開始來

體驗一下和人對戰的樂趣。

圖 A-1 PDA 桌面

當成功地把象棋遊戲灌進去 PDA 之後,我們可以在一開始的

主畫面中看見一個象棋棋子的圖案,如上圖中藍色框框中的圖

示。我們點進去之後便可以開始遊戲。

圖 A-2 象棋遊戲畫面

本象棋遊戲一開始預設為上方為黑棋,而下方為紅棋,且為

紅棋先走。當紅旗走完第一步之後在象棋棋盤的右邊,會出現一

Page 39

39

箭頭符號(如圖 A-3 中紅框標示地方)來提醒使用者現在是輪到哪

一方。

圖 A-3 箭頭標記

因為象棋棋盤為 9*10 格且每一格為 15*15 像素大小,所以在

螢幕上整個象棋棋盤在螢幕總共佔了 135*150 大小,而 Palm 系統

的 PDA 螢幕大小為 160*160 像素大小。為了所以我們並沒有在螢

幕的上作出工作列,因為如果直接在螢幕上作出工作列,便不能

擺下整個棋盤。所以我們必須先按底下 MENU button(如圖 A-4 中

用紅框 A 框起來的地方)來叫出工作列。

Page 40

40

圖 A-4 MENU 按鈕

底下我們將介紹工作列上各個選項的用途。

START:

在 START 選單下又分為 NEW,Save,Load。

NEW:顧名思義這個是直接開一個新局,重新開始。

Save:當使用者點擊了 Save 或是用觸控筆在英文手寫區(如

圖 A-4 紅框 B 框起來之處)下寫出「S」則會進入 Save 模式(如圖

A-5)。而 Game name 中寫入 24 個字元作為檔名,Memo 中可以打一

些自己的備註事項,例如對戰的日期、和誰對戰等等。全部寫好

之後點「ok」就會以 pdb 的格式紀錄在 palm 的資料庫裡面了

Page 41

41

圖 A-5 Save 模式

Load:當使用者點擊了 Load 或是用觸控筆在英文手寫區(如

圖 A-4 紅框 B 框起來之處)下寫出「L」則會進入 Load 模式(如圖

A-6)。Up 和 Down 可以上選擇要載入的進度,選好後按 OK 來載入。

圖 A-6 Load 模式

Page 42

42

IrGame:

在 IrGame 中共分為五個項目,分別為 Open Port,Close

Port,Connect 和 Disconnect(如圖 A-7)。

圖 A-7 IrGame

Open Port 和 Close Port 是用來開啟和關閉連接阜的,而凱

起和關閉時都會出現一個 Ir Err 視窗來告知使用者。如圖 A-7 和

圖 A-8。

圖 A-8 開啟連接阜

Page 43

43

圖 A-9 關閉連接



Connect 和 DisConnect 此功能是建立在「IR Port Is Open」的

狀態下才成立,而且要雙方都已經開啟了紅外線連接阜的狀態

下,其中一邊的使用者點擊「Connect」。若紅外線沒有調整好,例

如角度不正確、距離太遠等等問題,而彼此無法連線,則會有視

窗「no IrDA in range」的訊息出現,這時使用者必須再調整紅外線

以求最佳的連線品質。如果是已經連線且對弈了一段時間之後,

雙方紅外線胡然斷線的話則會有訊息視窗「Check IR Device

Direction」碰現出來 ,表示已經失去連線,如果要再繼續下的話,

請重新 Connect,而且如果最後一步棋是有下沒有傳過去的話,則

會回到上一步的狀態。

Edit:

Edit 中只包含了一個選項,就是 SIDE 的指令,而這個指令可

以將紅黑棋掉換,讓雙方接續對方的棋子來繼續下棋。

Page 44

44

圖 A-10 Edit

圖 A-11 L,N,U BUTTON

L,N,U 這三個按鈕各自代表了 Last,Next 和 Undo。

L 代表了 Last,可以用來觀看上一步的棋盤狀況。

N 代表了 Next,配合 Last 來使用,看目前棋盤狀態的下一步

棋。

Last 和 Next 兩者搭配使用讓使用者可以在任何時間下瀏覽

整個棋局的演變,進而下出最好的一步。

U 代表了 Undo,當使用者對自己下的這一步棋並不滿意時,

可以使用這一功能,重下一次。

No comments: