本篇論文研究市面上的棋譜編輯系統,並根據本實驗室所提出的 POT 通用遊戲模組理論與 GAML 通用棋譜格式,開發出通用棋譜編輯 系統開發平台。
目前我們的通用棋譜編輯系統開發平台,能夠支援編輯遊戲的初 始棋盤、棋步、標記、分支、註解及棋局相關資訊等功能。在瀏覽方 面,我們提供完整的棋譜列表,讓使用者自由點選欲觀看的棋步。另 外在工具列中也提供按鈕,讓使用者可以跳至第一步、上一分支點、
上一步、下一步、下一分支點及最後一步。
透過我們的平台所開發的棋譜編輯系統,能夠享有快速開發、程 式碼更少、維護更容易的優點。同時透過平台提供的機制,能讓遊戲 保有本身的特性,與附加自己獨特的功能。
在未來的發展上,可以考慮支援更多種類的棋譜格式,或是擴充 如棋盤的翻轉,棋盤棋子圖檔的替換等圖形使用者介面功能。另外,
可以設計更多的附加機制或是遊戲自由設定項目,讓遊戲在開發時能 夠保有更多的彈性與擴充空間,同時又能享受到透過平台開發的好 處。
參考文獻
[1] Brian Burns, The Encyclopedia of Games, MetroBooks, October 2000.
[2] 徐健智, “A General Development Platform for Play-on-table Game Over Internet”, 交通大學資訊工程系, 碩士論文, June 1999.
[3] I-Chen Wu, “Platform for Artificial Intelligence Game Tournament”, invited talk at International Computer Symposium, December 2002, Hualien, Taiwan, R.O.C.
[4] 胡小奇, “圍棋助手”, available from http://www.go-assistant.com/english/, 2004.
[5] 黃暉, “WinMGT”, available from http://waterfire.us/go/winmgt.htm, 2003.
[6] 天元科技, “Go2000”, available from http://sanppy.bizland.com/.
[7] “MultiGo”, available from http://www.ruijiang.com/multigo/chs/, 2004.
[8] Frank Arkbo, Uppsala , “Renju Library program”, available from http://www.renju.nu/renlib/, 2004.
[9] “GoRenjer”, available from
http://www.gonnta.ne.jp/~itty/GoRenjer-en.html, 2002.
[10] 董世偉, “象棋演播室”, available from
http://www.qipaile.net/xqstudio/index.htm, 2002.
[11] “象棋橋”, available from http://www.ccbridge.net/, 2001.
[12] Arno Hollosi, “Smart Game Format”, available from http://www.red-bean.com/sgf/, 2001.
[13] Judea Pearl, Heuristics/Intelligent Search Strategies for Computer Problem Solving, Addison-Wesley, 1984.
[14] W3C, “Extensible Markup Language”, available from http://www.w3c.org/XML/.
[15] Sun Microsystems, “Java 2 SDK”, available from http://java.sun.com/j2se/1.4.2/index.jsp, 2003.
[16] W3C, “Document Object Model”, available from http://www.w3.org/DOM/.
[17] 吳清源, 吳仁譯, 吳清源名局細解(4), 台灣世界文物出版社, 1986.
[18] Martin Fowler, Kendall Scott, UML distilled :a brief guide to the standard object modeling language, 2nd Edition, Addison-Wesley, December 2001.
[19] Robert Eckstein, Marc Loy, Dave Wood, Java Swing, 2nd Edition, O’REILLY, February 2003.
[20] David Flanagan, Java Examples In A Nutshell, 2nd Edition, O’REILLY, May 2002.
附錄一
以下是使用我們的通用棋譜編輯系統開發平台,來開發五子棋棋 譜編輯系統的完整程式碼和 Property 檔案內容。
程式部分:
package Five;
import javax.swing.*;
import Gamlib.lib.*;
import Gamlib.GameBase;
import java.util.*;
public class Five extends GameBase{
public static final int BLACK = 0;
public static final int WHITE = 1;
private static int[] piece_id = {BLACK,WHITE};
private static int[] piece_count = {300,300};
Vector nextPlys;
public void init(){
nextPlys = null;
}
//設定棋子代碼
public int[] getPiece_IDs(){
return piece_id;
}
//設定棋子數量
public int[] getPiece_count(){
return piece_count;
}
//設定遊戲資訊輸入對話框
public JPanel getSettingPanel(){
return new FiveSettingPanel(this);
}
//檢查擺譜後的棋盤
public boolean checkLegalBoard() { return true;
}
//repaint 時需要更新的資料寫在這裡 public void refresh(){
clearHighLight();
nextPlys = super.getNextPlys();
for (int i = 0; i < nextPlys.size(); i++){
PlyNode ply = (PlyNode)nextPlys.elementAt(i);
MoveNode move = ply.getMoveNodeAt(0);
for (int j = 0; j < ply.getMoveCount(); j++){
move = ply.getMoveNodeAt(j);
if (move.getMoveType() == MoveNode.PLACE) break;
}
int x = move.getDestPosition_X();
int y = move.getDestPosition_Y();
super.setHighLight(x,y,1);
} }
//設定棋譜列表中的棋步文字
public String getStepString(PlyNode ply){
MoveNode place = ply.getMoveNodeAt(0);
for (int i = 0; i < ply.getMoveCount(); i++){
place = ply.getMoveNodeAt(i);
if (place.getMoveType() == MoveNode.PLACE) break;
}
if (place.getPieceID() == BLACK)
return "● " + POS.charAt(place.getDestPosition_X())+" "
+ place.getDestPosition_Y();
return "○ "+POS.charAt(place.getDestPosition_X())+" "
+ place.getDestPosition_Y();
}
public void mouseClick(int x,int y, int mouse_key) { if (mouse_key == Game.MOUSE_KEY_RIGHT){
return; //使用滑鼠右鍵無作用 }
//瀏覽模式
if ((getMode() == Game.ViewMode)&& (nextPlys != null)){
for (int i = 0; i < nextPlys.size(); i++){ && (y == move.getDestPosition_Y())) super.gotoPlyNode(ply);
} }
//下子模式
else if (super.getMode() == Game.PlyMode){
//已經有子的位置不能點選
if (getPieceID(x,y) != Piece.EMPTY) return;
PlyNode ply = new PlyNode();
if ((getCurrentPlyNo()%2) == 0){
ply.addMoveNode(MoveNode.newPlacePieceMoveNode (x,y,BLACK,false));
}
else{
ply.addMoveNode(MoveNode.newPlacePieceMoveNode (x,y,WHITE,false));
}
this.addPly(ply,PlyNode.LEGAL);
}
//標記模式
else if (super.getMode() == Game.MarkMode){
int tar_id = getPieceID(x,y);
int index = getCurrentMarkMenuIndex();
if (tar_id == BLACK) index = 2*index;
else
index = 2*index + 1;
super.addMark(x,y,index);
} } }
//重建棋步
public PlyNode buildFullPly(PlyNode originPly) { return originPly;
}
Property 部分:
#遊戲名稱
GAME_NAME = Five
#棋盤大小
EDITER_BOARD_WIDTH = 15 EDITER_BOARD_HEIGHT = 15
#Board Panel 大小
EDITER_BOARD_PANEL_WIDTH = 500 EDITER_BOARD_PANEL_HEIGHT = 530
#棋子位置調整與棋盤格大小調整 EDITER_BOARD_OFFSET_X = 20 EDITER_BOARD_OFFSET_Y = 20 EDITER_PIECE_OFFSET_X = 0 EDITER_PIECE_OFFSET_Y = 0 EDITER_GRID_OFFSET_X = 8 EDITER_GRID_OFFSET_Y = 7 EDITER_GRID_SIZE_X = 30 EDITER_GRID_SIZE_Y = 30
#棋盤與棋子圖檔
EDITER_IMG_BOARD = table.gif EDITER_IMG_PIECE = pieces.gif EDITER_CUT_PIECE = 2
#標記相關設定
EDITER_MARK_SYMBOL = ○|●|△|▲|□|■
EDITER_IMG_MARK = marks.gif EDITER_CUT_MARK = 6
EDITER_MARK_MENU_TOTAL = 3
EDITER_MARK_MENU_0 = 添加圓形標記 EDITER_MARK_MENU_1 = 添加三角形標記 EDITER_MARK_MENU_2 = 添加正方形標記 EDITER_MARK_BUTTON_0 = ○
EDITER_MARK_BUTTON_1 = △ EDITER_MARK_BUTTON_2 = □
#手順使用的顏色
EDITER_PIECE_PLY_COLOR = FFFFFF|000000
#手順數字的大小
EDITER_PIECE_PLY_FONT_SIZE = 14
#手順數字的位置
EDITER_PIECE_PLY_OFFSETX_0 = 10 EDITER_PIECE_PLY_OFFSETY_0 = 17 EDITER_PIECE_PLY_OFFSETX_1 = 7 EDITER_PIECE_PLY_OFFSETY_1 = 17 EDITER_PIECE_PLY_OFFSETX_2 = 4 EDITER_PIECE_PLY_OFFSETY_2 = 17
#提示圖案相關設定
EDITER_IMG_HIGH_LIGHT = highLight.gif EDITER_CUT_HIGH_LIGHT = 3
EDITER_IMG_INDEX_CURSOR = 0 EDITER_IMG_INDEX_CLICK = 1 EDITER_IMG_INDEX_SRC = 2 EDITER_IMG_INDEX_DES = 2