summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdartbot.rb71
1 files changed, 60 insertions, 11 deletions
diff --git a/dartbot.rb b/dartbot.rb
index facd745..af6962f 100755
--- a/dartbot.rb
+++ b/dartbot.rb
@@ -34,6 +34,60 @@ CENTRE_DISTS = OUTER_DISTS.inject([{}, nil]) { |(h, prev), (k, v)|
[h, v]
}[0]
+CHECKOUTS = { # FIXME better checkout shots
+ 1 => {
+ 50=>"BULL", 40=>"D20", 38=>"D19", 36=>"D18", 34=>"D17", 32=>"D16",
+ 30=>"D15", 28=>"D14", 26=>"D13", 24=>"D12", 22=>"D11", 20=>"D10", 18=>"D9",
+ 16=>"D8", 14=>"D7", 12=>"D6", 10=>"D5", 8=>"D4", 6=>"D3", 4=>"D2", 2=>"D1"
+ },
+ 2 => {
+ 110=>"T20", 107=>"T19", 104=>"T18", 101=>"T17", 100=>"T20", 98=>"T20",
+ 97=>"T19", 96=>"T20", 95=>"T19", 94=>"T18", 93=>"T19", 92=>"T20",
+ 91=>"T17", 90=>"T18", 89=>"T19", 88=>"T16", 87=>"T17", 86=>"T18",
+ 85=>"T15", 84=>"T20", 83=>"T17", 82=>"T14", 81=>"T19", 80=>"T20",
+ 79=>"T19", 78=>"T18", 77=>"T19", 76=>"T20", 75=>"T17", 74=>"T16",
+ 73=>"T19", 72=>"T16", 71=>"T19", 70=>"T20", 69=>"T19", 68=>"T18",
+ 67=>"T17", 66=>"T16", 65=>"T15", 64=>"T14", 63=>"T13", 62=>"T12",
+ 61=>"T11", 60=>"20", 59=>"19", 58=>"18", 57=>"17", 56=>"16", 55=>"15",
+ 54=>"14", 53=>"13", 52=>"20", 51=>"19", 50=>"18", 49=>"17", 48=>"16",
+ 47=>"15", 46=>"14", 45=>"13", 44=>"12", 43=>"3", 42=>"10", 41=>"17",
+ 40=>"D20", 39=>"7", 38=>"D19", 37=>"17", 36=>"D18", 35=>"3", 34=>"D17",
+ 33=>"17", 32=>"D16", 31=>"7", 30=>"D15", 29=>"17", 28=>"D14", 27=>"3",
+ 26=>"D13", 25=>"17", 24=>"D12", 23=>"7", 22=>"D11", 21=>"17", 20=>"D10",
+ 19=>"3", 18=>"D9", 17=>"1", 16=>"D8", 15=>"7", 14=>"D7", 13=>"5", 12=>"D6",
+ 11=>"3", 10=>"D5", 9=>"1", 8=>"D4", 7=>"3", 6=>"D3", 5=>"1", 4=>"D2",
+ 3=>"1", 2=>"D1"
+ },
+ 3 => {
+ 170=>"T20", 167=>"T19", 164=>"T19", 161=>"T20", 160=>"T20", 158=>"T20",
+ 157=>"T20", 156=>"T20", 155=>"T20", 154=>"T19", 153=>"T20", 152=>"T20",
+ 151=>"T20", 150=>"T20", 149=>"T20", 148=>"T20", 147=>"T19", 146=>"T19",
+ 145=>"T20", 144=>"T20", 143=>"T20", 142=>"T20", 141=>"T19", 140=>"T15",
+ 139=>"T19", 138=>"T20", 137=>"T14", 136=>"T20", 135=>"BULL", 134=>"T14",
+ 133=>"T14", 132=>"BULL", 131=>"T19", 130=>"T20", 129=>"T19", 128=>"T20",
+ 127=>"T20", 126=>"T19", 125=>"BULL", 124=>"T20", 123=>"T19", 122=>"T18",
+ 121=>"T20", 120=>"T20", 119=>"T19", 118=>"T20", 117=>"T20", 116=>"T19",
+ 115=>"T19", 114=>"T20", 113=>"T19", 112=>"T20", 111=>"T19", 110=>"T19",
+ 109=>"T20", 108=>"T20", 107=>"T19", 106=>"T20", 105=>"T20", 104=>"T19",
+ 103=>"T19", 102=>"T20", 101=>"T19", 100=>"T20", 99=>"T19", 98=>"T20",
+ 97=>"T19", 96=>"T20", 95=>"T19", 94=>"T18", 93=>"T19", 92=>"T20",
+ 91=>"T17", 90=>"T20", 89=>"T19", 88=>"T20", 87=>"T17", 86=>"T18",
+ 85=>"T15", 84=>"T20", 83=>"T17", 82=>"BULL", 81=>"T19", 80=>"T20",
+ 79=>"T19", 78=>"T18", 77=>"T19", 76=>"T16", 75=>"T17", 74=>"T14",
+ 73=>"T19", 72=>"T16", 71=>"T13", 70=>"T18", 69=>"T15", 68=>"T12",
+ 67=>"T17", 66=>"T14", 65=>"BULL", 64=>"T16", 63=>"T13", 62=>"T10",
+ 61=>"BULL", 60=>"20", 59=>"19", 58=>"18", 57=>"17", 56=>"16", 55=>"15",
+ 54=>"14", 53=>"13", 52=>"20", 51=>"19", 50=>"18", 49=>"17", 48=>"16",
+ 47=>"15", 46=>"14", 45=>"13", 44=>"12", 43=>"11", 42=>"10", 41=>"9",
+ 40=>"D20", 39=>"7", 38=>"D19", 37=>"5", 36=>"D18", 35=>"3", 34=>"D17",
+ 33=>"1", 32=>"D16", 31=>"15", 30=>"D15", 29=>"13", 28=>"D14", 27=>"11",
+ 26=>"D13", 25=>"9", 24=>"D12", 23=>"7", 22=>"D11", 21=>"5", 20=>"D10",
+ 19=>"3", 18=>"D9", 17=>"1", 16=>"D8", 15=>"7", 14=>"D7", 13=>"5", 12=>"D6",
+ 11=>"3", 10=>"D5", 9=>"1", 8=>"D4", 7=>"3", 6=>"D3", 5=>"1", 4=>"D2",
+ 3=>"1", 2=>"D1"
+ }
+}
+
def get_coordinates(angle, radius)
t = angle * Math::PI / 180
x = radius * Math.cos(t)
@@ -131,15 +185,8 @@ def get_segment_coordinates(segment)
[SECTOR_ANGLES[sector], CENTRE_DISTS[ring]]
end
-def next_dart(rem)
- segment =
- if rem > 40
- 'T20'
- elsif rem % 2 == 1
- '1'
- else
- "D#{rem/2}"
- end
+def next_dart(rem, in_hand)
+ segment = CHECKOUTS[in_hand][rem] || (in_hand == 1 ? '20' : 'T20')
get_segment_coordinates(segment)
end
@@ -151,7 +198,7 @@ def play_visit(rem)
bust = false
3.times do
- t_angle, t_radius = next_dart(v_rem)
+ t_angle, t_radius = next_dart(v_rem, 3 - darts.length)
d_angle, d_radius = throw_dart(t_angle, t_radius)
segment = get_segment(d_angle, d_radius)
@@ -159,7 +206,9 @@ def play_visit(rem)
d_points = get_points(segment)
v_rem -= d_points
- if v_rem < 0 || v_rem == 1 || (v_rem == 0 && segment !~ /^D/)
+ if (v_rem < 0 || v_rem == 1 ||
+ (v_rem == 0 && segment != 'BULL' && segment !~ /^D/))
+
v_rem = rem
bust = true
break