-
Notifications
You must be signed in to change notification settings - Fork 0
/
2tjoeomv.pcw
120 lines (99 loc) · 3.61 KB
/
2tjoeomv.pcw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using Com.CodeGame.CodeHockey2014.DevKit.CSharpCgdk.Model;
namespace Com.CodeGame.CodeHockey2014.DevKit.CSharpCgdk {
public sealed class MyStrategy : IStrategy {
private const double StrikeAngle = 1.0D*Math.PI/180.0D;
private static World _world;
private static Hockeyist _self;
private static Game _game;
private static Move _move;
public void Move(Hockeyist self, World world, Game game, Move move)
{
_world = world;
_self = self;
_game = game;
_move = move;
if (self.State == HockeyistState.Swinging)
{
move.Action = ActionType.Strike;
return;
}
if (world.Puck.OwnerPlayerId == self.PlayerId)
{
DealWithPuck();
}
else
{
GoGetThePuck();
}
}
private static void GoGetThePuck()
{
_move.SpeedUp = 1.0D;
_move.Turn = _self.GetAngleTo(_world.Puck);
_move.Action = ActionType.TakePuck;
}
private static void DealWithPuck()
{
if (_world.Puck.OwnerHockeyistId == _self.Id)
{
PerformAttack();
}
else
{
PerformSupport();
}
}
private static void PerformAttack()
{
Player opponentPlayer = _world.GetOpponentPlayer();
double netX = 0.5D * (opponentPlayer.NetBack + opponentPlayer.NetFront);
double netY = 0.5D * (opponentPlayer.NetBottom + opponentPlayer.NetTop);
netY += (_self.Y < netY ? 0.5D : -0.5D) * _game.GoalNetHeight;
double angleToNet = _self.GetAngleTo(netX, netY);
_move.Turn = angleToNet;
if (Math.Abs(angleToNet) < StrikeAngle)
{
_move.Action = ActionType.Swing;
}
}
private static void PerformSupport()
{
Hockeyist nearestOpponent = NearestOpponent(_self.X, _self.Y, _world);
if (nearestOpponent != null)
{
if (_self.GetDistanceTo(nearestOpponent) > _game.StickLength)
{
_move.SpeedUp = 1.0D;
}
else if (Math.Abs(_self.GetAngleTo(nearestOpponent)) < 0.5D * _game.StickSector)
{
_move.Action = ActionType.Strike;
}
_move.Turn = _self.GetAngleTo(nearestOpponent);
}
}
private static Hockeyist NearestOpponent(double x, double y, World world) {
Hockeyist nearestOpponent = null;
double nearestOpponentRange = 0.0D;
foreach (Hockeyist hockeyist in world.Hockeyists) {
if (hockeyist.IsTeammate
|| hockeyist.Type == HockeyistType.Goalie
|| hockeyist.State == HockeyistState.KnockedDown
|| hockeyist.State == HockeyistState.Resting) {
continue;
}
double opponentRange = Hypot(x - hockeyist.X, y - hockeyist.Y);
if (nearestOpponent == null || opponentRange < nearestOpponentRange) {
nearestOpponent = hockeyist;
nearestOpponentRange = opponentRange;
}
}
return nearestOpponent;
}
private static double Hypot(double x, double y)
{
return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
}
}
}