宣讲会展示的那个弱爆了的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) && map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Mine && !(map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y] as MineView).IsMyUnit && (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 && map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Mine && !(map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y] as MineView).IsMyUnit && (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) && map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Mine && !(map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1] as MineView).IsMyUnit && (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 && map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Mine && !(map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1] as MineView).IsMyUnit && (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) && map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Caslte && !(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 && map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Caslte && !(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) && map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Caslte && !(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 && map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Caslte && !(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) && map.Map[activeKnight.Position.X + 1, activeKnight.Position.Y].GetItemType() == ItemType.Knight && !(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 && map.Map[activeKnight.Position.X - 1, activeKnight.Position.Y].GetItemType() == ItemType.Knight && !(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) && map.Map[activeKnight.Position.X, activeKnight.Position.Y + 1].GetItemType() == ItemType.Knight && !(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 && map.Map[activeKnight.Position.X, activeKnight.Position.Y - 1].GetItemType() == ItemType.Knight && !(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) && 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 && 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) && 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 && 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
}
} |
|