2012 程式設計比賽 Openfind 天使帝國 v2.0 (蓋亞的紋章).

Slides:



Advertisements
Similar presentations
考研英语复试 口语准备 考研英语口语复试. 考研英语复试 口语准备 服装 谦虚、微笑、自信 态度积极 乐观沉稳.
Advertisements

河內塔(Hanoi)問題.
信息技术在教学中的应用 信息技术应用于教学的整体观、系统观 信息技术应用于教学的整体观、系统观 对信息技术整合的理解——教师的视角
程序设计基础 贺辉 图书馆三楼办公室(进馆左侧上楼)
Type out your Chinese name and grade
战争结束了 年11月,听到停战的消息,巴黎街头人们欣喜若狂。法国总理克里孟梭说:“吻我的姑娘有500多个了。”
IP新作 扁平美学-视界最大化.
4.3 可持续发展的基本内涵 永嘉二中 钱凯俊.
TQC+ 物件導向程式認證-JAVA.
Performance Evaluation
資料庫設計 Database Design.
第4章 VHDL设计初步.
程設一.
数据结构与算法 数据结构与算法实验
Homework 4 an innovative design process model TEAM 7
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
Lotus Domino R7 Designer
Excellence in Manufacturing 卓 越 制 造
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
第六章 应用程序结构.
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
佇列 (Queue).
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
(Exec1) GIS 空间分析-使用ArcGIS (Exec1)
北京饭店 Tell them that 我是服务员, 我是北京饭店的服务员, 欢迎,欢迎您们来中国。欢欢迎您们来北京饭店吃饭。
第五讲 数据的分组、合并与转换.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
Logistics 物流 昭安國際物流園區 總經理 曾玉勤.
STRUCTURE 授課:ANT 日期:2010/5/12.
C 語言簡介 - 2.
第五組 : 廖震昌 / 謝坤吉 / 黃麗珍 陳曉伶 / 陳思因 / 林慧佳
XBRL未來發展趨勢 2009年12月 For information on applying this template onto existing presentations, refer to the notes on slide 3 of this presentation. The Input.
Windows Control Center
第三章 项目设定.
Interval Estimation區間估計
SpringerLink 新平台介绍.
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
ZEEV ZEITIN Delft University of Technology, Netherlands
Instructor:Po-Yu Kuo 教師:郭柏佑
Warren E. Buffett, 1995 Case 華倫巴菲特分析個案 林修葳
Chapter 5 Recursion.
實用郵政英文對話.
Discovery數位課程教學影片資料庫 使用手冊
(第2版).
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
Chapter 2 & Chapter 3.
3.5 Region Filling Region Filling is a process of “coloring in” a definite image area or region. 2019/4/19.
Speaker: Liu Yu-Jiun Date: 2009/4/29
虚 拟 仪 器 virtual instrument
True friendship is like sound health;
線性規劃模式 Linear Programming Models
Chapter 2 Negotiable instrument
Introduction to the C Programming Language
今天, AC 你 了吗? 2019/4/21.
Chapter 3 What Is Money?.
Philosophy of Life.
SpringerLink 新平台介绍.
Inheritance -II.
資料結構簡介 綠園.
C++程序设计 吉林大学计算机科学与技术(软件)学院.
Introduction to the C Programming Language
 隐式欧拉法 /* implicit Euler method */
國立清華大學 National Tsing Hua University
Go 语言编程 —— 平台研发部 吴植民.
Arguments to the main Function and Final Project
Race Conditions and Semaphore
第6章 硬盘实用程序 GHOST 6.0 硬盘克隆(Clone)、硬盘分区拷贝工具
Introduction to Computer Security and Cryptography
外链锚文本优化:那味丢失的关键词排名佐料
Presentation transcript:

2012 程式設計比賽 Openfind 天使帝國 v2.0 (蓋亞的紋章)

Preview

比賽規則 (1/2) 由Player(Blue)的部隊跟CPU(Red)控制的部隊互攻 地圖大小 10x7 每場戰役結束(一方全滅 or 50回合到達) 每殺死CPU部隊,獲得50% 死亡部隊價格當作score 戰役結束,玩家每剩下一支部隊(不論血量),獲得50% 該存活部隊價格當作score

比賽規則 (2/2) 每場戰役玩家會得到 1000元(基本消費) + 上一場戰役得到score + 上一場戰役剩下的錢 CPU 每場戰役會比上一場多 300元 總共10場戰役,10 場戰役每場 score累加,最高者得冠軍

戰士 生命值:500 攻擊:170 防禦:50 移動力:3 攻擊方式:近戰 特殊能力:被近身攻擊可反擊 價格:200

法師 生命值:240 攻擊:200 防禦:0 移動力:1 攻擊方式:遠程法術 施法距離:3 移動方式:步行 特殊能力:攻擊無視防禦 價格:400

屬性相剋 總共有風火水土四種屬性 土剋水 水剋火 火剋風 風剋土 相剋屬性(土屬性攻擊水屬性),可獲得200%攻擊效果 被剋屬性(水屬性攻擊土屬性),攻擊效果削弱50% 不相干屬性互打,沒特別加成或是削弱

每回合輪到 Player 每支部隊只能行動一次,行動完畢必須要等下回合 CMD_MOVE: 移動,之後此部隊本回合行動結束 CMD_MOVE_AND_ATTACK: 移動後施展攻擊,之後此部隊本回合行動結束 CMD_END_TURN: Player 主動宣告此回合結束 移動 src => dest,其中 src 可以等於 dest (代表站在原地) 每支部隊都行動過後,本回合自動結束換 CPU 部隊行動

移動規則 每步只能走上下左右四個方向 (不能走斜線) 步行 – 移動距離(3)當作例子,可以走 0步(停在原地)、1步、2步、或是3步。只是每一步都必須有空地可以停留。(如右圖)

近戰攻擊規則 (A 攻擊 B) B 必須為敵軍 每回合可施展移動後攻擊一次 殺傷力= (A.攻擊 – B.防禦)xAdj(屬性調整) (3)若屬性A剋B,Adj為 200% (4)若屬性B剋A,Adj為 50% (5)B存活且具備近戰反擊能力,將自動反擊A一次

遠程法術攻擊規則 (A 攻擊 B) B 必須為敵軍 每回合可施展移動後攻擊一次 殺傷力= A.攻擊力(無視對方防禦)xAdj(屬性調整) 屬性相剋調整同上頁 (50%、100%、200%)

分數計算 & 戰役結束 戰役結束條件為 (1)一方全滅或(2)超過50回合 戰役中擊殺敵軍 B 可以得到 B.價格x50% 獎金 戰役結束後,PLAYER方殘存部隊得 A.價格x50%獎金 總獎金 + 本戰役剩下的錢可帶入下一場戰役,所以下一場戰役起始會有上述金額 + 1,000元 的經費 每場戰役打越好,下一場錢越多,富人越富 每場戰役打越差,下一場錢越少,窮人越窮 搞砸一場戰役,等於打入深淵

處罰條件 有任何錯誤 (buildArmy, move, moveAndAttack),直接判定該戰役得零分 超過 30 秒沒有移動,該戰役得零分 找到一個系統錯誤,可以拔 Mike 頭髮一根

Openfind 天使帝國 Programming Guide

User.dll 主程式 scoring.exe 將呼叫 User.dll (dynamic) User project 中包括 User.dsw(VC++ compiler) User.cpp -> 主要回傳 functions 都在此 check.h -> 資料結構以及輔助 functions 都在此

Callback function (1/2) void buildArmy(int team[21], int money) Main system 每場戰役開始前會呼叫此 function Users 把自己的起始部隊配置放在 team[21](位置如右圖),且花的錢不能超過 money

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: 主動宣告回合結束

Data structure (#define and global) #define WALL 0 #define SPACE 1 #define WARRIOR_WIND 2 #define WARRIOR_FIRE 3 #define WARRIOR_WATER 4 #define WARRIOR_EARTH 5 #define MAGICIAN_WIND 6 #define MAGICIAN_FIRE 7 #define MAGICIAN_WATER 8 #define MAGICIAN_EARTH 9 g_nTurn : The current turn.

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:整張地圖上每個點的資訊

Data structure (g_army) { int live; //生命值 int attack; //攻擊力、法術攻擊量 int defence; //防禦力 int attackRange; //攻擊範圍 int moveRange; //移動力 int type; //風(0) 火(1) 水(2) 土(3) int isFightBack; //是否可近戰反擊 (0) or (1) int isSpell; //是否為法術攻擊 (0) or (1) int price; // 部隊價格 } g_army[TOTAL_ICON]; 可用範圍:g_army[2]~g_army[9] 僅當作 check functions 的參考,自行修改是沒用的

Utils 自我檢查 PLAYER build army 是否合法 // 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)

Utils 取得 src 可以移動到那些 dest[] // 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.

Utils 取得 src 可以法術攻擊那些 dest[] // 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) // // Return // 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

Utils 自我檢查 src => dest 是否正確 // 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

Utils 自我檢查 src => dest 然後攻擊 target 是否正確 // 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)