2012 程式設計比賽 Openfind 天使帝國 v2.0 (蓋亞的紋章) Openfind 天使帝國 v2.0 Preview 2 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 比賽規則 (1/2) 由Player(Blue)的部隊跟CPU(Red)控制的部隊互攻 地圖大小 10x7 起始戰役Player經費 1000 元可自行購買兵種 採回合制(每場最多50回合),由 Player 先攻 每場戰役結束(一方全滅 or 50回合到達) 每殺死CPU部隊,獲得50% 死亡部隊價格當作score 戰役結束,玩家每剩下一支部隊(不論血量),獲得50% 該存活部隊價格當作score 3 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 比賽規則 (2/2) 每場戰役玩家會得到 1000元(基本消費) + 上一場戰役 得到score + 上一場戰役剩下的錢 CPU 每場戰役會比上一場多 300元 總共10場戰役,10 場戰役每場 score累加,最高者得 冠軍 4 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 戰士 生命值:500 攻擊:170 防禦:50 移動力:3 攻擊方式:近戰 特殊能力:被近身攻擊可反擊 價格:200 5 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 法師 生命值:240 攻擊:200 防禦:0 移動力:1 攻擊方式:遠程法術 施法距離:3 移動方式:步行 特殊能力:攻擊無視防禦 價格:400 6 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 屬性相剋 總共有風火水土四種屬性 土剋水 水剋火 火剋風 風剋土 相剋屬性(土屬性攻擊水屬性),可獲得200%攻擊效果 被剋屬性(水屬性攻擊土屬性),攻擊效果削弱50% 不相干屬性互打,沒特別加成或是削弱 7 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 每回合輪到 Player 每支部隊只能行動一次,行動完畢必須要等下回合 CMD_MOVE: 移動,之後此部隊本回合行動結束 CMD_MOVE_AND_ATTACK: 移動後施展攻擊,之後此部隊本 回合行動結束 CMD_END_TURN: Player 主動宣告此回合結束 移動 src => dest,其中 src 可以等於 dest (代表站在原地) 每支部隊都行動過後,本回合自動結束換 CPU 部隊行動 8 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 移動規則 每步只能走上下左右四個方向 (不能走斜線) 步行 – 移動距離(3)當作例子, 可以走 0步(停在原地)、1步、 2步、或是3步。只是每一步都 必須有空地可以停留。(如右圖) 9 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 近戰攻擊規則 (A 攻擊 B) B 必須為敵軍 每回合可施展移動後攻擊一次 殺傷力= (A.攻擊 – B.防禦)xAdj(屬性調整) (1)殺傷力判斷為 A.攻擊-B.防禦 (2)若屬性無相剋,Adj為 100% (3)若屬性A剋B,Adj為 200% (4)若屬性B剋A,Adj為 50% (5)B存活且具備近戰反擊能力,將自動反擊A一次 10 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 遠程法術攻擊規則 (A 攻擊 B) B 必須為敵軍 每回合可施展移動後攻擊一次 殺傷力= A.攻擊力(無視對方防禦)xAdj(屬性調整) 若施法攻擊鄰近單位B,B未陣亡且具備反擊能力, 將自動反擊A 屬性相剋調整同上頁 (50%、100%、200%) 11 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 分數計算 & 戰役結束 戰役結束條件為 (1)一方全滅或(2)超過50回合 戰役中擊殺敵軍 B 可以得到 B.價格x50% 獎金 戰役結束後,PLAYER方殘存部隊得 A.價格x50%獎金 總獎金 + 本戰役剩下的錢可帶入下一場戰役,所以下一場戰 役起始會有上述金額 + 1,000元 的經費 每場戰役打越好,下一場錢越多,富人越富 每場戰役打越差,下一場錢越少,窮人越窮 搞砸一場戰役,等於打入深淵 12 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 處罰條件 有任何錯誤 (buildArmy, move, moveAndAttack), 直接判定該戰役得零分 超過 30 秒沒有移動,該戰役得零分 找到一個系統錯誤,可以拔 Mike 頭髮一根 13 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 Programming Guide Openfind 天使帝國 v2.0 User.dll 主程式 scoring.exe 將呼叫 User.dll (dynamic) User project 中包括 User.dsw(VC++ compiler) User.cpp -> 主要回傳 functions 都在此 check.h -> 資料結構以及輔助 functions 都在此 15 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Callback function (1/2) void buildArmy(int team[21], int money) Main system 每場戰役 開始前會呼叫此 function Users 把自己的起始部隊 配置放在 team[21](位 置如右圖),且花的錢不能 超過 money 16 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Callback function (2/2) int playerMove(POINT pt[3]) Main system 每回合不斷呼叫,直到使用者行動完畢回合結束 Pt[0]: src, pt[1]: dest, pt[2]: target CMD_MOVE: 從 pt[0] 走到 pt[1] CMD_MOVE_AND_ATTACK: 從pt[0]走到pt[1]並攻擊pt[2] CMD_END_TURN: 主動宣告回合結束 17 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Data structure (#define and global) #define #define #define #define #define #define #define #define #define #define WALL SPACE WARRIOR_WIND WARRIOR_FIRE WARRIOR_WATER WARRIOR_EARTH MAGICIAN_WIND MAGICIAN_FIRE MAGICIAN_WATER MAGICIAN_EARTH 0 1 2 3 4 5 6 7 8 9 g_nTurn : The current turn. 18 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Data structure (g_map) struct MAP { int armyType; // can be 2 ~ 9 int armySide; // 1 is Player, 2 is CPU int live; // 這支部隊剩下多少生命值 int alreadyMoved; // 0 is false, 1 is true int id; // An unique id for each army (繪圖使用) } g_map[MAP_X_SIZE][MAP_Y_SIZE]; 地圖大小:MAP_X_SIZE * MAP_Y_SIZE Global variable g_map:整張地圖上每個點的資訊 19 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Data structure (g_army) struct { int live; int attack; int defence; int attackRange; int moveRange; int type; int isFightBack; int isSpell; int price; } g_army[TOTAL_ICON]; //生命值 //攻擊力、法術攻擊量 //防禦力 //攻擊範圍 //移動力 //風(0) 火(1) 水(2) 土(3) //是否可近戰反擊 (0) or (1) //是否為法術攻擊 (0) or (1) // 部隊價格 可用範圍:g_army[2]~g_army[9] 僅當作 check functions 的參考,自行修改是沒用的 20 Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Utils 自我檢查 PLAYER build army 是否合法 21 // Function: int checkBuildArmy(int player[21], int money) // Input // int player[21]: 對應到地圖左邊的三排位置, // 每個位置放入兵種 2 ~ 9 或是 SPACE(代表空的) // Return // >=0: The content of player[21] is ok, return 剩下的金額 // ERR_INVALID_TYPE: At least one of the position contains invalid type // ERR_EXCEED_COST: The total cost of player[21] exceeds the maximum value (傳入的 money) Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Utils 取得 src 可以移動到那些 dest[] 22 // // // // // // // // // // // Function int getMove(POINT src, POINT dest[70], int userType) Input src: The original point of the army you want to move dest[70]: All the result of available move points will be stored in this array userType: should be PLAYER(1) or CPU(2) Return 0 ~ positive value: The count of total available moves. ERR_INPUT: The input userType is not PLAYER(1) or CPU(2) ERR_NOT_PLAYER: The army in the src does not belong to you ERR_ALREADY_MOVE: The army in the src has performed an move already. Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Utils 取得 src 可以法術攻擊那些 dest[] 23 // // // // // // // Function int getSpellAttack(POINT src, POINT dest[70], int userType) Input src: The original point of the army that you want to cast an offence spell dest[70]: All the result of available targets will be stored in this array userType: should be PLAYER(1) or CPU(2) // // // // // 0 ~ positive value: The count of total available points of targets. ERR_INPUT: The input userType is not PLAYER(1) or CPU(2) ERR_NOT_PLAYER: The army in the src does not belong to you ERR_ALREADY_MOVE: The army in the src has performed move and attack already ERR_CANNOT_CAST: The army in the src does have the ability to case an offence spell Return Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Utils 自我檢查 src => dest 是否正確 24 // // // // // // // // // // // // // // Function int checkMove(POINT src, POINT dest, int userType) To check move from src to dest is legal or not, but will not perform it. Input src: The original point that you want to move your army dest: The destination point that you want to move your army userType: Should be PLAYER(1) or CPU(2) Return SUCCESS: Your move is valid. ERR_INPUT: The input userType is not PLAYER(1) or CPU(2) ERR_NOT_PLAYER: The src does not belong to you ERR_ALREADY_MOVE: The src has performed move already. ERR_ILLEGAL_DEST: The dest is not empty or out of range Copyright 2012 Openfind Information Technology, Inc. Openfind 天使帝國 v2.0 Utils 自我檢查 src => dest 然後攻擊 target 是否正確 25 // // // // // // // // // // // // // // // // // Function int checkMoveAndAttack(src,dest,target,userType) To preform move then attack. If you don't want to move, you can just input src==dest Once performing attacking, the army cannot be moved anymore. Input src: The original point of your army dest: The destination point of your army target: The target point that you want to attack userType: Should be PLAYER(1) or CPU(2) Return SUCCESS: Your move and attack is valid ERR_INPUT: The input userType is not PLAYER(1) or CPU(2) ERR_NOT_PLAYER: The src does not belong to you, or cannot perform attack ERR_ALREADY_MOVE: The src has performed move already ERR_ILLEGAL_DEST: The dest is not empty or out of range ERR_ILLEGAL_TARGET: The target cannot be attacked (not enemy or not reachable) Copyright 2012 Openfind Information Technology, Inc.