找回密码
 立即注册

QQ登录

只需一步,快速开始

Valentine
版主   /  发表于:2013-3-29 08:25  /   查看:12685  /  回复:17
宣讲会展示的那个弱爆了的AI源代码。该AI只演示如何实现接口,直接参战必败无疑:)

---------------------我是分割线---------------------

using GrapCity.Competition.CastleRush.Ai;
using GrapCity.Competition.CastleRush.Ai.View;
using System;

namespace AiDemo.FreeGuy
{
    /// <summary>
    /// 演示用AI程序:随机前进,逢矿必占
    /// </summary>
    public class DemoStrategy : ICastleStrategy
    {
        #region ICastleStrategy Members

        /// <summary>
        /// 策略的唯一标识,建议使用GUID
        /// </summary>
        /// <value>The id.</value>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2012/01/13 16:08    Created
        /// </history>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2012/02/03 9:55    Created
        /// </history>
        public Guid Id
        {
            get { return new Guid("A3ABA1A3-F2E9-4414-ADDB-1D8217867B03"); }
        }

        /// <summary>
        /// 选手名
        /// </summary>
        /// <value>The name of the friendly.</value>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2012/01/13 17:37    Created
        /// </history>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2012/02/03 9:55    Created
        /// </history>
        public string FriendlyName
        {
            get { return "酱油党之随便转转"; }
        }

        public void Prefetch(MapView map)
        {
            //什么都不做
        }

        private int rectuiIndex = 0;

        public RecruitKnightResult RecruitKnight(MapView map, CastleView castle)
        {
            rectuiIndex++;
            return new RecruitKnightResult() { AttackPower = 1, MarchPower = 5, Name = "等待机会_" + rectuiIndex.ToString() };
        }

        public KnightDecision KnightDecision(MapView map, CastleView castle, KnightView activeKnight, int stepIndex)
        {

            // 先看是否可以占矿
            if (activeKnight.Position.X + 1 < map.Map.GetLength(0) &amp;&amp; map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Mine &amp;&amp; !(map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y] as MineView).IsMyUnit &amp;&amp; (map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y] as MineView).Reserves > 0)
            {
                return new KnightDecision() { Action = ActionType.占领, Direction = Direction.右 };
            }

            if (activeKnight.Position.X - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Mine &amp;&amp; !(map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y] as MineView).IsMyUnit &amp;&amp; (map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y] as MineView).Reserves > 0)
            {
                return new KnightDecision() { Action = ActionType.占领, Direction = Direction.左 };
            }

            if (activeKnight.Position.Y + 1 < map.Map.GetLength(1) &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Mine &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1] as MineView).IsMyUnit &amp;&amp; (map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1] as MineView).Reserves > 0)
            {
                return new KnightDecision() { Action = ActionType.占领, Direction = Direction.下 };
            }

            if (activeKnight.Position.Y - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Mine &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1] as MineView).IsMyUnit &amp;&amp; (map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1] as MineView).Reserves > 0)
            {
                return new KnightDecision() { Action = ActionType.占领, Direction = Direction.上 };
            }

            // 再看是否可以攻城
            if (activeKnight.Position.X + 1 < map.Map.GetLength(0) &amp;&amp; map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Caslte &amp;&amp; !(map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y] as CastleView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.攻城, Direction = Direction.右 };
            }

            if (activeKnight.Position.X - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Caslte &amp;&amp; !(map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y] as CastleView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.攻城, Direction = Direction.左 };
            }

            if (activeKnight.Position.Y + 1 < map.Map.GetLength(1) &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Caslte &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1] as CastleView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.攻城, Direction = Direction.下 };
            }

            if (activeKnight.Position.Y - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Caslte &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1] as CastleView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.攻城, Direction = Direction.上 };
            }

            // 再看是否可以攻击
            if (activeKnight.Position.X + 1 < map.Map.GetLength(0) &amp;&amp; map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Knight &amp;&amp; !(map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y] as KnightView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.作战, Direction = Direction.右 };
            }

            if (activeKnight.Position.X - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Knight &amp;&amp; !(map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y] as KnightView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.作战, Direction = Direction.左 };
            }

            if (activeKnight.Position.Y + 1 < map.Map.GetLength(1) &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Knight &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1] as KnightView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.作战, Direction = Direction.下 };
            }

            if (activeKnight.Position.Y - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Knight &amp;&amp; !(map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1] as KnightView).IsMyUnit)
            {
                return new KnightDecision() { Action = ActionType.作战, Direction = Direction.上 };
            }

            // 什么都不能做则随机行军
            Direction dir = Direction.原地不动;
            bool canGo = false;

            Random ran = new Random();

            while (!canGo)
            {
                int answer = ran.Next(4);

                switch (answer)
                {
                    case 0:
                        {
                            if (activeKnight.Position.X + 1 < map.Map.GetLength(0) &amp;&amp; map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Road)
                            {
                                canGo = true;
                                dir = Direction.右;
                            }

                            break;
                        }
                    case 1:
                        {
                            if (activeKnight.Position.X - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Road)
                            {
                                canGo = true;
                                dir = Direction.左;
                            }

                            break;
                        }
                    case 2:
                        {
                            if (activeKnight.Position.Y + 1 < map.Map.GetLength(1) &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Road)
                            {
                                canGo = true;
                                dir = Direction.下;
                            }

                            break;
                        }
                    case 3:
                        {
                            if (activeKnight.Position.Y - 1 > -1 &amp;&amp; map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Road)
                            {
                                canGo = true;
                                dir = Direction.上;
                            }

                            break;
                        }
                    case 4:
                        {
                            canGo = true;
                            dir = Direction.原地不动;
                            break;
                        }
                }
            }

            return new KnightDecision() { Action = ActionType.行军, Direction = dir };
        }

        #endregion

    }

}
GrapeCity inc.
LeySer Framework Team

17 个回复

倒序浏览
994572168_liu
新手上路   /  发表于:2013-3-29 12:27:00
沙发
回复 1楼Valentine的帖子

我想问问  是不是一定不会出现两个城堡间不可到达的现象?
回复 使用道具 举报
Valentine
版主   /  发表于:2013-3-29 13:40:00
板凳
回复 2楼994572168_liu的帖子

可能会啊。
比如对方的骑士把要道封死的话,不杀掉这些堵路的骑士那就真的到达不了对方城堡了。
GrapeCity inc.
LeySer Framework Team
回复 使用道具 举报
994572168_liu
新手上路   /  发表于:2013-3-29 14:34:00
地板
回复 3楼Valentine的帖子

嗯 就是原始地图上 两个城堡肯定是直接相通的?
回复 使用道具 举报
Valentine
版主   /  发表于:2013-3-29 15:50:00
5#
GrapeCity inc.
LeySer Framework Team
回复 使用道具 举报
daodao
论坛元老   /  发表于:2013-3-30 21:00:00
6#
你好,
目前我有几个疑问:
1.RecruitKnight和KnightDecision是否在每个会合都会被调用?
2.比赛开始时双方都是没有金矿的么?
3.如果2成立,就是说在占领金矿后,每个回合每个金矿会给自己带来一金币的收益?
……
嗯,目前想到的就是上面三个问题,希望能帮忙解答,谢谢!
回复 使用道具 举报
wyg_0802
银牌会员   /  发表于:2013-3-31 10:43:00
7#

演示代码的问题

回复 1楼Valentine的帖子



运行时出现了“未将对象引用设置到对象实例”的错误。。。为什么这个代码会这样呢????

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Valentine
版主   /  发表于:2013-4-1 08:41:00
8#
回复 7楼wyg_0802的帖子

目标平台需要设置为3.5或更低(VS2010默认是4.0)。
GrapeCity inc.
LeySer Framework Team
回复 使用道具 举报
Orzmand
新手上路   /  发表于:2013-4-6 11:36:00
9#
回复 1楼Valentine的帖子

GetLength(0)不是返回第一维长度么,应该是纵坐标啊,楼主是不是写错了???
回复 使用道具 举报
Valentine
版主   /  发表于:2013-4-7 10:35:00
10#
回复 9楼Orzmand的帖子

这个,似乎是写错了。
但是不影响比赛啦:)
GrapeCity inc.
LeySer Framework Team
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部