葡萄城竞赛题目及相关说明

上传人:子 文档编号:42382477 上传时间:2018-06-01 格式:DOC 页数:14 大小:94KB
返回 下载 相关 举报
葡萄城竞赛题目及相关说明_第1页
第1页 / 共14页
葡萄城竞赛题目及相关说明_第2页
第2页 / 共14页
葡萄城竞赛题目及相关说明_第3页
第3页 / 共14页
葡萄城竞赛题目及相关说明_第4页
第4页 / 共14页
葡萄城竞赛题目及相关说明_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《葡萄城竞赛题目及相关说明》由会员分享,可在线阅读,更多相关《葡萄城竞赛题目及相关说明(14页珍藏版)》请在金锄头文库上搜索。

1、筑梦之城筑梦之城座标:183.2E,92.7N。这里,有一片未开垦的土地,空旷得,呃,荒无人烟。在 此,我更愿意称之为“筑梦之地” ,因为,我们即将在这里,打造一个全新的梦想之城!背景介绍背景介绍这是一块矩形的土地,被经、纬线划分成若干正方形的小格子。方便起见,我们将这 些被经纬线划分出的小格子称为“单元格” ,并按横向为行,纵向为列的方式进行描述。座 标的原点在地图的左上角,向右下递增。 下面是一张这个区域的地图:地图中的单元格分别被五种不同的颜色标记,这是一张规划图,不同的颜色代表不同 的区域功能: 灰色:代表此区域是非建筑用地,不能用于任何设施的建设; 白色:代表此区域为未指定功能的建筑

2、用地; 绿色:代表此区域的规划功能为住宅区; 蓝色:代表此区域的规划功能为商业区; 黄色:代表此区域的规划功能为工业区。除了区域功能的规划,我们在前期,还针对建筑的造型和功能做了详细的规划,所有 可用的建筑的图纸也都准备就绪。下图所示是一些可能的建筑布局:每一个建筑用一种颜色标识,这种颜色可以是绿、蓝或黄中的任意一种,代表的含意 为此建筑的功能为住宅、商场或工厂。 建筑布局中的小格子大小与地图上的单元格相等。 上图中白色的格子表示空白,不是建筑的一部分。 建筑在地图上放置时,既可以覆盖与其功能相同的单元格,也可以覆盖与其功能不同 的单元格,但不能覆盖类型为非建筑用地的单元格。 建筑物在被放置之

3、前,可以做顺时针的旋转,旋转的角度为 90 度的整数倍。 下图展示建筑物的放置及旋转:图中最左侧是当前选择的建筑的布局,在它的右侧是地图局部的布局。 左侧第三幅图展示了,将该建筑不旋转地放置在地图上这个区域的方法。 最右侧的图展示了,将该建筑顺时针旋转 180 度后,再放置到地图上这个区域的方法。右侧的两幅图中,粗边框的区域为建筑物放置的区域;标注”*”的位置,是放置时应指 定的座标点。 好了,背景内容介绍到这里。下面,来说说我们光荣而伟大的使命吧!光荣的使命光荣的使命为了把这块“筑梦之地”建设成和谐美好的“梦想之城” ,仅凭有关部门的闭门造车, 是远远不够的。我们在规划之初就深刻地认识到了这

4、一点,所以,我们诚邀各位有识之士 共谋大业。为了更合理有效地利用这块土地,我们准备举办一场比赛,从所有参赛选手 中选取最终的优胜者,来承担开发大任。 每位参与竞赛的选手,需要完成一个算法。在每一场角逐中,这个算法会与另外一位 选手的算法随机分组,以对弈的方式在这块神奇的土地上展开竞争,争取占有更多的土地, 建设更多的建筑,以及获得更多的额外的回报。而最终的胜者将成为这块“筑梦之地”的 开拓者。算法要求算法要求有关算法实现的细节及接口描述,请参见本文档中的接口说明部分。这一节的描述中 不会涉及到具体的技术细节。算法应实现以下功能:算法应实现以下功能:在每一次被调用时,从可用建筑列表中选择一个未被

5、使用的建筑,放置到地图上的某 一位置;或者,选择不放置任何建筑到地图上。 建筑在被放置到地图上之前,可以进行角度为 90 度整数倍的旋转;算法的目标:算法的目标:根据规定的计分方法,获得比对手更高的分数,并且分差越大越好。算法的限制:算法的限制:时间限制:每次调用限时 1s,一局比赛限时 30s; 空间限制:算法执行过程中,内存占用不超过 512MB;算法常驻内存的部分,不 超过 256MB; 其它限制:如果使用多线程技术,每次调用返回前,应主动结束调用过程中主动 开启的线程。算法能够获得的信息包括:算法能够获得的信息包括:地图的大小(宽度 W 和高度 H,0/ 参加竞赛的算法必须实现这个接口

6、。/ 竞赛过程中,伺服程序会调用接口中定义的 Step 方法。/ 所以,Step 方法应该是算法的入口。/ / / 在提交的程序集中,应该有且仅有一个类型实现这个接口。/ public interface IPlayer/ / 这个方法是算法的入口,由竞赛伺服程序调用。/ / / 这个接口实现了一些属性和方法,算法可以访问它们,获得当前的状态信息。/ / / 每次调用结束时,应该返回一个 Operation 类型的实例,指示算法希望在这一步作出的操 作。/ 如果算法在这一回合不作操作,请返回 Operation.Empty。/ / / 建议实现这个方法的时候,在方法体内添加计时逻辑,以免算法计

7、算超时。/ Operation Step(IGameService service); 下面是一个对 IPlayer 接口的简单实现,这个算法不关心任何条件,每次调用均返回一 个空的操作。public class MyPlayer: IPlayerpublic Operation Step(IGameService service)return Operation.Empty; 注意,提交的程序集中应该有且仅有一个 public 的类型从 IPlayer 接口派生。获取当前状态获取当前状态在 IPlayer 接口的 Step 方法中,有一个 IGameService 类型的参数,IGameSe

8、rvice 包装了 一些属性和方法,使得选手实现的算法能够获取相关的状态信息。 下面是 IGameService 接口的定义:/ / 这个接口中包含一些属性和方法,选手实现的算法可以通过它们获取当前的状态和信息。/ public interface IGameService/ / 获取一个 IMap 的实例,这个实例包含地图信息。/ IMap Map get; / / 获取一个只读的 IConstruction 集合,这个集合中包含当前可用的建筑。/ ReadOnlyCollection Constructions get; / / 获取一个 Operation 实例,这个实例包含本次方法调用

9、前的最后一次操作。/ / / 这个实例中包含的操作,可能是对方的最后一次操作,也可能是自己的最后一次操作,具 体情况取决于调用顺序。/ 如果这是本局比赛中的第一次调用,这个实例的值为 Operation.Empty。/ Operation LastOperation get; / / 获取上一次执行操作的选手的 ID。/ / / 一个可空的 PlayerID 枚举值,指示上一次执行了操作的选手的 ID。/ 这个值为空(null)时,表示本次调用是这局比赛的第一次调用。/ PlayerID? LastOperator get; / / 通过调用本方法获得算法被分配的 ID。/ / / 传入一个

10、IPlayer 的实例,这个实例应该是实现当前算法的类型的实例。/ / / 方法的返回值是与传入实例对应的 ID。/ / / 算法实例的 ID 在比赛开始时分配,先于任何一次方法的调用。/ ID 一经分配就不会被更改,所以这个方法的返回值可以被存储在算法实例的内部。/ / / 如果传入的实例不是竞赛伺服程序在竞赛开始时创建并分配了 ID 的实例中的任意一个,/ 则会引发 ArgumentException。/ PlayerID GetPlayerID(IPlayer player);/ / 通过调用本方法获得算法在本次调用前的剩余时间。/ / / 传入一个 IPlayer 的实例,这个实例应该

11、是实现当前算法的类型的实例。/ / / 一个 TimeSpan 实例。/ / / 请注意,本方法的返回值,指示的时间是本次算法的 Step 方法被调用之前的剩余时间,/ 而不是这个方法调用时刻的剩余时间。/ 每次调用过程中,算法消耗的时间应自行计算。/ TimeSpan GetRemainingTime(IPlayer player); 其它接口的定义其它接口的定义IMap/ / 这个接口定义了一幅地图的基本信息。/ public interface IMap/ / 获取一个整形值,指示地图的宽度。/ int Width get; / / 获取一个整形值,指示地图的高度。/ int Heigh

12、t get; / / 获取一个 IBlock 实例,这个实例包含对应单元格的信息。/ / / 单元格的横座标。/ / / 单元格的纵座标。/ / / 座标指向的单元格所对应的 IBlock 实例。/ / / 传入的横、纵座标的值,应该大于等于 0,小于宽度或高度。/ / / 当传入的横、纵座标超出规定的范围时,将引发 ArgumentOutOfRange 异常。/ IBlock thisint x, int y get; IBlock/ / 这个接口定义了一个单元格的信息。/ public interface IBlock/ / 获取一个 DistrictType 值,该值指示当前单元格的类型

13、。/ DistrictType Type get; / / 获取一个 BlockStatus 值,该值指示当前单元格的状态。/ BlockStatus Status get; DistrictType/ / 这个枚举定义了地图上单元格的类型。/ public enum DistrictType/ / 表示生活区。/ Living,/ / 表示工业区。/ Industrial,/ / 表示商业区。/ Business,/ / 表示未指定类型的区域。可以在该区域放置建筑物。/ Unspecified,/ / 表示非建筑区域。不可以在该区域放置建筑物。/ Frozen,BlockStatus / /

14、 这个枚举定义了地图上单元格的状态。/ public enum BlockStatus/ / 表示未放置任何建筑物。/ Empty,/ / 表示当前单元格被选手 A 的建筑物覆盖。/ TakenByPlayerA,/ / 表示当前单元格被选手 B 的建筑物覆盖。/ TakenByPlayerB,IConstruction/ / 这个接口定义了建筑物的基本信息。/ public interface IConstruction/ / 获取一个整形值,该值唯一标识一个建筑物。/ int ID get; / / 获取一个整形值,指示该建筑物外边界的宽度。/ int Width get; / / 获取一个整形值,指示该建筑物外边界的高度。/ int Height get; / / 获取一个 ConstructionType 值,指示该建筑的类型。/ ConstructionType Type get; / / 获取一个布尔值,指示对应座标处是否为建筑物的一部分。/ / / 要获取信息的位置对应的横座标。/ / / 要获取信息的位置对应的纵座标。/ / / 一个布尔值,如果座标对应处是建筑物的一部分,值为 true,/ 否则值为 false./ / / 传入的横、纵座标的值,应该大于等于 0,小于宽度或高度。/ /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号