• 沒有找到結果。

遊戲擴充

透過設定動作物件與牌卡物件,遊戲設計師可以自行增加遊戲規 則,但由於目前系統所支援的「執行效果」的格式種類並不多,尚沒 有提供許多較高級的程式設計技巧,所以可能有一些執行效果需要用 比較複雜的方式來做設計。所以我們亦在「執行效果」的部份設計了 一項「函式呼叫」,然後允許玩家編輯一個擴充用的函式檔,魔法牌 遊戲開發系統在執行的時候,將載入玩家所編輯的擴充函式檔,讓玩 家可以在執行效果的地方,透過「函式呼叫」這個指令集來存取。關 於設定的方式,詳見附錄 C。

第五章 第五章 第五章

第五章、 、 、結論與未來展望 、 結論與未來展望 結論與未來展望 結論與未來展望

本論文提出了魔法牌的明確定義與系統架構,並且實際做出了一 個可以開發魔法牌遊戲的魔法牌遊戲開發系統。這個系統以 Java 語 言為基礎,透過讀取指令集的方式包裝程式碼,亦允許遊戲設計師自 行寫擴充的函式供系統使用。我們所提出的系統,就像是一種包裝在 某種程式語言(在此使用 Java)的程式語言一般,故透過該系統,遊戲 設計師可以製作各式各樣的魔法牌遊戲。

因為魔法牌遊戲的規則本身就複雜,所以就算是透過該系統來製 作魔法牌遊戲,仍然需要花上不少工夫。並且,一款遊戲免不了會需 要使用者操作介面(GUI),但因為各種不同的魔法牌遊戲所需要顯示 與操作畫面差別性都非常的大,所以本論文在這方面並沒有做深入的 研究。

本系統仍有許多部份是可以繼續加強的:

1. 支援更多更方便使用的程式語言技巧。

2. 支援更多更方便使用的內建函式。

3. 支援圖形化介面的「使用者操作介面編輯器」,讓遊戲設計師可以 更方便製作自己所需要的使用者操作介面。

4. 更方便的遊戲規則編輯器,讓遊戲設計師可以更有效率地透過本 系統來實作魔法牌遊戲。

另外,因為魔法牌遊戲亦是個規則複雜且平衡性不易設計的遊 戲,所以至於魔法牌遊戲的規則平衡性、甚至是 AI 的研究,都會是 不錯的相關研究主題。

附錄 A 執行條件與執行效果的文法

函式設定(控制權: 將控制權交給 [控制權設定] )

函式設定(玩家.玩家變數: [玩家.玩家] )

函式設定(事件.整數變數: [事件.整數] )

// [牌區] execType | actionTriggerType

[事件.整數] 回傳型態:整數 變數型態: 預設值: ID

函式設定(階段.遊戲: [階段] . [階段.遊戲] )

函式設定(牌區.牌卡: [牌區] . [牌區.牌卡] )

函式設定(事件.布林: [事件] . [事件.布林] )

<邏輯運算子> 回傳型態: 變數型態: 預設值:

if (preType==整數) [數字邏輯運算子]

[非數字邏輯運算子]

END

<指定運算子> 回傳型態: 變數型態: 預設值:

if (preType==整數) [數字指定運算子]

[非數字指定運算子]

END

附錄 B 「99 魔法牌」物件設定

 遊戲設定

String boolean Stage Player[] Action[] int Player Name isGameover Number Players actions number nowPlayer 99 魔

魔魔魔

法牌法牌 法牌法牌

false 換誰 階段

玩家 1 玩家 2

無 0 玩家 2

 階段設定

Int String Stage Action[]

ID name nextStage actions

1

換誰階段 出牌階段 『顯示現在階段名稱』

『決定換誰』

『顯示現在輪到誰』

2

出牌階段 抽牌階段 『顯示現在階段名稱』

『輪到的玩家敗北判斷』

『顯示目前遊戲積數』

『讓現在輪到的玩家可以行動』

『交出控制權給玩家』

3

抽牌階段 換誰階段 『顯示現在階段名稱』

『輪到的玩家抽一張牌』

 玩家設定

int String Player[] Player[] Areas[] Action[] Player Player ID name allys opponents areas actions 上家

上家上家上家 下家下家下家下家

1

玩家 1 無 玩家 2 牌庫 1

手上 1 廢牌 1

無 玩家 2 玩家 2

2

玩家 2 無 玩家 1 牌庫 2 手上 2 廢牌 2

無 玩家 1 玩家 1

註:canDoAction 屬性值,全部都為 false

 牌區設定

int String Int Card[] Action[]

ID name viewType cards actions 1

牌庫 1 0(無) LOAD 無

2

手上 1 1(自己) LOAD 無

3

廢牌 1 7(全) LOAD 無

4

牌庫 2 0(無) LOAD 無

5

手上 2 1(自己) LOAD 無

6

廢牌 2 7(全) LOAD 無

 牌卡設定

int String Action[] Int Boolean ID name actions Number special 1

A 『加』 1 false

2

2 『加』 2 false

3

3 『加』 3 false

4

4 『加』 4 false

5

5 『加』 5 false

6

6 『加』 6 false

7

7 『加』 7 false

8

8 『加』 8 false

9

9 『加』 9 false

10 10

『加』、『減』 10 true

11 J

『pass

0 true

12 Q

『加』、『減』 20 true

13 K

『99』 0 true

14 Joker1 『丟牌』

0 true

15 Joker2 『再出』

0 true

 動作設定

因為動作物件的設定全部都是動態設定的,所以在 timings、

conditions、effects 的部份,格式一律為<type>parameter,譬如『顯 示現在階段名稱』這個動作,他的 conditions 是<布林值>true,意思 就是他的 conditions 物件的 type=”布林值”,parameter=”true”

※階段動作

ID Name triggerType

1 『顯示現在階段名稱』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<顯示文字>現在階段:[遊戲.現在的階段.名稱]

ID Name triggerType

2 『決定換誰』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<變數指定>[遊戲.輪到的玩家] = [遊戲.輪到的玩家.下家]

ID name triggerType

3 『顯示現在輪到誰』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<顯示文字>現在輪到[遊戲.輪到的玩家.名稱]

ID name triggerType

4 『輪到的玩家敗北判斷』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<函式呼叫>玩家敗北判斷([遊戲.輪到的玩家])

ID name triggerType

5 『顯示目前遊戲積數』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<顯示文字>遊戲積數:[遊戲.遊戲積數]

ID name triggerType

6 『讓現在輪到的玩家可以行動』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<變數指定>[遊戲.輪到的玩家.可以行動] = true

ID name triggerType

7 『交出控制權給玩家』 無

Timings

<系統呼叫>無

Conditions <布林值>true Effects

<控制權>玩家

ID name triggerType

8 『輪到的玩家抽一張牌』 無

Timings

<系統呼叫>無

Conditions <布林值>true

Effects

<函式呼叫>[遊戲.輪到的玩家].抽牌(1)

※牌卡動作

ID name triggerType

12 『pass』 無

Timings

<玩家使用>出牌階段

Conditions <運算式>

[這張牌.所在位置] == [這張牌.擁有玩家.手上] &

<運算式> [這張牌. 擁有玩家.可以行動] == true

Effects

<函式呼叫>[這張牌].移動到([這張牌.擁有玩家.廢牌] &

<變數指定>[這張牌. 擁有玩家.可以行動] = false

ID name triggerType

13 『丟牌』 無

Timings

<動作結束觸發>減

Conditions <運算式>

[這張牌.所在位置] == [這張牌.擁有玩家.手上] &

<運算式>[這張牌.擁有玩家] != [這張牌.觸發牌.擁有玩家]

Effects

<函式呼叫>[這張牌].移動到([這張牌.擁有玩家.廢牌]) &

<函式呼叫>[這張牌.擁有玩家].抽牌(1) &

<函式呼叫>[這張牌.觸發牌.擁有玩家].棄牌(1)

ID Name triggerType

14 『再抽』 無

Timings

<動作開始觸發>減

Conditions <運算式>

[這張牌.所在位置] == [這張牌.擁有玩家.手上] &

<運算式>[這張牌.擁有玩家] != [這張牌.觸發牌.擁有玩家]

Effects

<函式呼叫>[這張牌].移動到([這張牌.擁有玩家.廢牌]) &

<函式呼叫>[這張牌.擁有玩家].抽牌(1) &

<變數指定>[遊戲.遊戲積數] -= 5 &

<函式呼叫>[這張牌.觸發牌.擁有玩家].出牌(1) &

<函式呼叫>[這張牌.觸發牌.擁有玩家].抽牌(1)

附錄C 其他程式相關說明文件

一、 執行「魔法牌遊戲開發系統」的方式

1. 執行 menuFrame.java 讀入檔案:

GameSetting.txt varList

otherFunction.java

產生檔案:

GameSetting.txt varList

objList.txt server.config

2. 執行 gameGen.java 讀入檔案:

objList.txt

產生檔案:

TMP.java

ObjectCondition.java DynamicObject.java Effect.java

Condition.java Timing.java Action.java Card.java Area.java

Player.java Stage.java Game.java

3. 編譯遊戲檔(compile 以下 Java 檔)

TMP.java

ObjectCondition.java DynamicObject.java Effect.java

Condition.java Timing.java Action.java Card.java Area.java Player.java Stage.java Game.java

二、 執行遊戲的方式

1. 執行 server 執行 server.java

讀入檔案:

server.config

2. 執行 client 執行 client.java

讀入檔案:

playerData.txt(玩家的牌組資訊,為方便測試,暫由 client 端提供)

三、 遊戲執行流程

由於魔法牌遊戲的玩家資訊與玩家所使用的牌組資訊會依玩家 所使用的牌組有關,所以遊戲會需要於所有的玩家都建立好連線之 後,先讀入玩家資訊與牌組資訊,然後再動態產生遊戲物件。所以遊 戲會透過 Client 來呼叫執行,遊戲程式 (Game)的執行程序如下:

Client.startGame()

// 由

由由由 client 呼叫呼叫呼叫呼叫 startGame()

game.loadGameSetting() ; // 讀入遊戲的組成設定 game.setPlayerData(PlayerData) ; // 讀入玩家資料與牌組資料 game.setup() ; // 遊戲建置

game.setObj() : // 動態產生所有遊戲物件 game.setAllAction() : // 設定所有的 action 做好 link game.setAllObject() : // 設定所有的 object 做好 link game.setOwner() : // 設定所有物件的 owner link game.setTiming() : // 設定所有動作的 Timing

game.setInit() ; // 初始遊戲的一些內部設定值 game.run() ; // 開始遊戲

while(isGameover) {

game.startThisStage() ; // 進入目前所在的階段 game.doThisStage() ; // 執行目前所在的階段 game.endThisStage() ; // 結束目前所在的階段 game.goNextStage() ; // 進入下一個階段 }

game.setGameover() ; // 遊戲結束處理

四、 執行動作的方式

遊戲裡的動作有以下兩種執行的方式:

1. 由階段執行某個動作 2. 由使用者選擇動作執行

其他相關的要點如下:

 在執行動作時,為了顧慮到有時會有很多動作一起被執行,

所以我們使用一個佇列(Queue):vActionQueue 來做控制,將 所有要被執行的動作先依序加入這個佇列中,然後再在要「結 算」的時候,依序執行佇列裡的每個動作。

 執行動作時,會呼叫 execAction(Action action)將動作放入 vActionQueue 裡,然後,再呼叫 execActionQueue()來依序 執行 vActionQueue 裡的每個動作。

 呼叫 execEventQueue()的時機有兩者:

1. 在呼叫 execAction(Action action)時,傳入的動作的 execType 屬性值為"exec"。

2. 階段在將所有的階段動作放入 vActionQueue 後呼叫。

 執行動作的流程如下:

if (canUse()) {

doPreAction() ; // 執行這個動作的動作前觸發動作 doThisAction() ; // 執行這個動作本身的動作

doPostAction() ; // 執行這個動作的動作後觸發動作 }

五、 魔法牌遊戲開發系統的執行流程

 readGameSetting()

讀入遊戲設定檔,包含遊戲架構、牌組設定、玩家自定的類

 resetVarList()

更新遊戲的「物件列表」(若讀入的物件清單裡有不正確的物 件則刪除,如玩家人數應該只有兩人,但讀入的物件列表有 三個玩家物件,便要將多餘的玩家物件刪除)

 genGrammar()

依據使用者對整個遊戲的設定,產生「條件」與「效果」設

定所需要用的「文法」資訊。該資訊會存成檔案,方便遊戲 設計者閱讀。

 readGrammar()

讀入剛才所產生的「文法」檔案並建立資料結構。

 setFunction()

讀入「函式擴充」檔,使用者定義的函式會於此讀入。

 resetGrammar()

清除「文法」檔案中不會被存取到的文法規則。

另外,在該程式裡,我們主要使用 classDef 來儲存「類別」資 料,使用 MTGObject 來儲存「物件」資料。這兩個類別的資料結構 如下圖所示:

各個參數的詳細說明如下:

名稱名稱名稱

名稱 型態型態 型態型態 說明說明說明說明

classType

String 類別名稱

objName

String 物件名再

attType

Vector<String> 屬性值型態

attName

Vector<String> 屬性值名稱

attNote

Vector<String> 屬性值註解

attValue

Vector<String> 屬性值實際的值

attDeft

Vector<String> 屬性值預設值

attDimension Vector

屬性值的維度

六、 函式擴充

遊戲設計師可視需要自行寫函式(程式碼),然後擴充到系統裡。

系統會讀入 otherFunction.java 這個程式,並依據正確的格式將函式 資料匯入系統裡。otherFunction.java 裡的格式如下:

class Game { /**

* */

void getPlayer() { ....

} // end function }

class Stage { }

class Player { }

....

otherFunction.java 由數個 class 所組成,這些 class 即遊戲裡 會用到的所有類別。設計者可視需要將自己的 function 寫在合適的 class 下面。自定 function 請依下列格式設定:

1. 註解區:

/**

* 註解 */

由 ” /** ” 開頭,由” */ “結尾。就算該函式沒有註解,仍然需要有 註解區。

2. 函式區:

retType funcName(parameterList) {

// code } // end function

函式一定需要回傳型態(retType)、函式名稱(funcName),至於函 式的參數列表(parameterList)可有可沒有。函式的左大括號一定 要在下一行,右大括號後面一定要接上一個空格,然後再來是單 行註解的"end function"。

當 function 符合以下的格式,就可以在 tool 裡的效果設定裡看到 自己寫的 function 了。

參考文獻

[1] Wikipedia , “交換卡片遊戲” , available from http://www.wikipedia.org/

[2] Wizard of the Coast , “魔法風雲會” , available from http://www.wizards.com/magic/ , 1995

[3] KONAMI , “遊戲王” , available from http://www.yugioh-card.com/ , 1996

[4] Wizard of the Coast , “魔法風雲會 online” , available from http://www.wizards.com/default.asp?x=magic/magiconline , 2003

[5] KONAMI , “遊戲王 online” , available from http://www.yugioh-online.net/ , 1996

[6] GRAVITY , “仙境傳說 RO” , available from http://ro.gameflier.com/ , 2004

[7] Blizzard , “worldofwarcraft(WOW)” , available from http://www.worldofwarcraft.com/ , 2005

[8] netmarble , “RO-TCG” , available from

http://game.netmarble.jp/cpsite/ragnaroktcg/ , 2004~2007 [9] Blizzard , “worldofwarcraft-TCG” , available from

http://entertainment.upperdeck.com/wow/en/ , 2006 [10] KOEI , “真.三國無雙” , available from

http://www.wikipedia.org/ 查“真.三國無雙”, 2001

[11] KOEI , “真.三國無雙 4TCG” , available from http://www.gamecity.ne.jp/smusou4/tcard/ , 2005

[12] actreca.com , “鋼彈大戰(GundamWar)” , available from http://www.diana.dti.ne.jp/~hos/ , 1999 (日本)

http://www.spp.com.tw/asp/gundamwar/index.asp , 1999(台灣) [13] 麗嬰國際 , “神奇寶貝 TCG” , available from

http://www.funbox.com.tw/pokemontcg/ , 2006

[14]

智冠科技 , “中國魔法牌” , available from

http://sg.soft-world.com/ , 1998 ~ 2004

[15] Nival Interactive , “蒼穹霸主 2” , available from http://www.etherlords.com/ , 2002

[16] Qmud.com , “永恆之夢” , available from http://www.qmud.com/v3.5/ , 2003 ~ 2005

[17] Dex Entertainment , “神樣的年代記” , available from http://alteil.jp/index.php , 2004

[18] Apus Software , “Astral Master” , available from http://www.astralmasters.com/ , 2004

[19] I-Chen Wu and J. J. Hsu, "The Model and Systems for

Play-on-table Games", IEICE Trans. INF. & SYST. (SCI), VOL.

E87-D, No. 11, November 2004.

[20] Sun , “Java”, available from http://java.sun.com/ , 1994

相關文件