天使帝國2.0 比賽題目下載

Download Report

Transcript 天使帝國2.0 比賽題目下載

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.