summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--checkouts.h525
-rw-r--r--dartbot.c35
2 files changed, 550 insertions, 10 deletions
diff --git a/checkouts.h b/checkouts.h
new file mode 100644
index 0000000..230c264
--- /dev/null
+++ b/checkouts.h
@@ -0,0 +1,525 @@
+#ifndef CHECKOUT_H
+#define CHECKOUT_H
+
+#include <stddef.h>
+
+char *CHECKOUTS[][170] = {
+ {
+ NULL, // 1
+ "D1", // 2
+ NULL, // 3
+ "D2", // 4
+ NULL, // 5
+ "D3", // 6
+ NULL, // 7
+ "D4", // 8
+ NULL, // 9
+ "D5", // 10
+ NULL, // 11
+ "D6", // 12
+ NULL, // 13
+ "D7", // 14
+ NULL, // 15
+ "D8", // 16
+ NULL, // 17
+ "D9", // 18
+ NULL, // 19
+ "D10", // 20
+ NULL, // 21
+ "D11", // 22
+ NULL, // 23
+ "D12", // 24
+ NULL, // 25
+ "D13", // 26
+ NULL, // 27
+ "D14", // 28
+ NULL, // 29
+ "D15", // 30
+ NULL, // 31
+ "D16", // 32
+ NULL, // 33
+ "D17", // 34
+ NULL, // 35
+ "D18", // 36
+ NULL, // 37
+ "D19", // 38
+ NULL, // 39
+ "D20", // 40
+ NULL, // 41
+ NULL, // 42
+ NULL, // 43
+ NULL, // 44
+ NULL, // 45
+ NULL, // 46
+ NULL, // 47
+ NULL, // 48
+ NULL, // 49
+ "BULL", // 50
+ NULL, // 51
+ NULL, // 52
+ NULL, // 53
+ NULL, // 54
+ NULL, // 55
+ NULL, // 56
+ NULL, // 57
+ NULL, // 58
+ NULL, // 59
+ NULL, // 60
+ NULL, // 61
+ NULL, // 62
+ NULL, // 63
+ NULL, // 64
+ NULL, // 65
+ NULL, // 66
+ NULL, // 67
+ NULL, // 68
+ NULL, // 69
+ NULL, // 70
+ NULL, // 71
+ NULL, // 72
+ NULL, // 73
+ NULL, // 74
+ NULL, // 75
+ NULL, // 76
+ NULL, // 77
+ NULL, // 78
+ NULL, // 79
+ NULL, // 80
+ NULL, // 81
+ NULL, // 82
+ NULL, // 83
+ NULL, // 84
+ NULL, // 85
+ NULL, // 86
+ NULL, // 87
+ NULL, // 88
+ NULL, // 89
+ NULL, // 90
+ NULL, // 91
+ NULL, // 92
+ NULL, // 93
+ NULL, // 94
+ NULL, // 95
+ NULL, // 96
+ NULL, // 97
+ NULL, // 98
+ NULL, // 99
+ NULL, // 100
+ NULL, // 101
+ NULL, // 102
+ NULL, // 103
+ NULL, // 104
+ NULL, // 105
+ NULL, // 106
+ NULL, // 107
+ NULL, // 108
+ NULL, // 109
+ NULL, // 110
+ NULL, // 111
+ NULL, // 112
+ NULL, // 113
+ NULL, // 114
+ NULL, // 115
+ NULL, // 116
+ NULL, // 117
+ NULL, // 118
+ NULL, // 119
+ NULL, // 120
+ NULL, // 121
+ NULL, // 122
+ NULL, // 123
+ NULL, // 124
+ NULL, // 125
+ NULL, // 126
+ NULL, // 127
+ NULL, // 128
+ NULL, // 129
+ NULL, // 130
+ NULL, // 131
+ NULL, // 132
+ NULL, // 133
+ NULL, // 134
+ NULL, // 135
+ NULL, // 136
+ NULL, // 137
+ NULL, // 138
+ NULL, // 139
+ NULL, // 140
+ NULL, // 141
+ NULL, // 142
+ NULL, // 143
+ NULL, // 144
+ NULL, // 145
+ NULL, // 146
+ NULL, // 147
+ NULL, // 148
+ NULL, // 149
+ NULL, // 150
+ NULL, // 151
+ NULL, // 152
+ NULL, // 153
+ NULL, // 154
+ NULL, // 155
+ NULL, // 156
+ NULL, // 157
+ NULL, // 158
+ NULL, // 159
+ NULL, // 160
+ NULL, // 161
+ NULL, // 162
+ NULL, // 163
+ NULL, // 164
+ NULL, // 165
+ NULL, // 166
+ NULL, // 167
+ NULL, // 168
+ NULL, // 169
+ NULL, // 170
+ },
+ {
+ NULL, // 1
+ "D1", // 2
+ "1", // 3
+ "D2", // 4
+ "1", // 5
+ "D3", // 6
+ "3", // 7
+ "D4", // 8
+ "1", // 9
+ "D5", // 10
+ "3", // 11
+ "D6", // 12
+ "5", // 13
+ "D7", // 14
+ "7", // 15
+ "D8", // 16
+ "1", // 17
+ "D9", // 18
+ "3", // 19
+ "D10", // 20
+ "17", // 21
+ "D11", // 22
+ "7", // 23
+ "D12", // 24
+ "17", // 25
+ "D13", // 26
+ "3", // 27
+ "D14", // 28
+ "17", // 29
+ "D15", // 30
+ "7", // 31
+ "D16", // 32
+ "17", // 33
+ "D17", // 34
+ "3", // 35
+ "D18", // 36
+ "17", // 37
+ "D19", // 38
+ "7", // 39
+ "D20", // 40
+ "17", // 41
+ "10", // 42
+ "3", // 43
+ "12", // 44
+ "13", // 45
+ "14", // 46
+ "15", // 47
+ "16", // 48
+ "17", // 49
+ "18", // 50
+ "19", // 51
+ "20", // 52
+ "13", // 53
+ "14", // 54
+ "15", // 55
+ "16", // 56
+ "17", // 57
+ "18", // 58
+ "19", // 59
+ "20", // 60
+ "T11", // 61
+ "T12", // 62
+ "T13", // 63
+ "T14", // 64
+ "T15", // 65
+ "T16", // 66
+ "T17", // 67
+ "T18", // 68
+ "T19", // 69
+ "T20", // 70
+ "T19", // 71
+ "T16", // 72
+ "T19", // 73
+ "T16", // 74
+ "T17", // 75
+ "T20", // 76
+ "T19", // 77
+ "T18", // 78
+ "T19", // 79
+ "T20", // 80
+ "T19", // 81
+ "T14", // 82
+ "T17", // 83
+ "T20", // 84
+ "T15", // 85
+ "T18", // 86
+ "T17", // 87
+ "T16", // 88
+ "T19", // 89
+ "T18", // 90
+ "T17", // 91
+ "T20", // 92
+ "T19", // 93
+ "T18", // 94
+ "T19", // 95
+ "T20", // 96
+ "T19", // 97
+ "T20", // 98
+ NULL, // 99
+ "T20", // 100
+ "T17", // 101
+ NULL, // 102
+ NULL, // 103
+ "T18", // 104
+ NULL, // 105
+ NULL, // 106
+ "T19", // 107
+ NULL, // 108
+ NULL, // 109
+ "T20", // 110
+ NULL, // 111
+ NULL, // 112
+ NULL, // 113
+ NULL, // 114
+ NULL, // 115
+ NULL, // 116
+ NULL, // 117
+ NULL, // 118
+ NULL, // 119
+ NULL, // 120
+ NULL, // 121
+ NULL, // 122
+ NULL, // 123
+ NULL, // 124
+ NULL, // 125
+ NULL, // 126
+ NULL, // 127
+ NULL, // 128
+ NULL, // 129
+ NULL, // 130
+ NULL, // 131
+ NULL, // 132
+ NULL, // 133
+ NULL, // 134
+ NULL, // 135
+ NULL, // 136
+ NULL, // 137
+ NULL, // 138
+ NULL, // 139
+ NULL, // 140
+ NULL, // 141
+ NULL, // 142
+ NULL, // 143
+ NULL, // 144
+ NULL, // 145
+ NULL, // 146
+ NULL, // 147
+ NULL, // 148
+ NULL, // 149
+ NULL, // 150
+ NULL, // 151
+ NULL, // 152
+ NULL, // 153
+ NULL, // 154
+ NULL, // 155
+ NULL, // 156
+ NULL, // 157
+ NULL, // 158
+ NULL, // 159
+ NULL, // 160
+ NULL, // 161
+ NULL, // 162
+ NULL, // 163
+ NULL, // 164
+ NULL, // 165
+ NULL, // 166
+ NULL, // 167
+ NULL, // 168
+ NULL, // 169
+ NULL, // 170
+ },
+ {
+ NULL, // 1
+ "D1", // 2
+ "1", // 3
+ "D2", // 4
+ "1", // 5
+ "D3", // 6
+ "3", // 7
+ "D4", // 8
+ "1", // 9
+ "D5", // 10
+ "3", // 11
+ "D6", // 12
+ "5", // 13
+ "D7", // 14
+ "7", // 15
+ "D8", // 16
+ "1", // 17
+ "D9", // 18
+ "3", // 19
+ "D10", // 20
+ "5", // 21
+ "D11", // 22
+ "7", // 23
+ "D12", // 24
+ "9", // 25
+ "D13", // 26
+ "11", // 27
+ "D14", // 28
+ "13", // 29
+ "D15", // 30
+ "15", // 31
+ "D16", // 32
+ "1", // 33
+ "D17", // 34
+ "3", // 35
+ "D18", // 36
+ "5", // 37
+ "D19", // 38
+ "7", // 39
+ "D20", // 40
+ "9", // 41
+ "10", // 42
+ "11", // 43
+ "12", // 44
+ "13", // 45
+ "14", // 46
+ "15", // 47
+ "16", // 48
+ "17", // 49
+ "18", // 50
+ "19", // 51
+ "20", // 52
+ "13", // 53
+ "14", // 54
+ "15", // 55
+ "16", // 56
+ "17", // 57
+ "18", // 58
+ "19", // 59
+ "20", // 60
+ "BULL", // 61
+ "T10", // 62
+ "T13", // 63
+ "T16", // 64
+ "BULL", // 65
+ "T14", // 66
+ "T17", // 67
+ "T12", // 68
+ "T15", // 69
+ "T18", // 70
+ "T13", // 71
+ "T16", // 72
+ "T19", // 73
+ "T14", // 74
+ "T17", // 75
+ "T16", // 76
+ "T19", // 77
+ "T18", // 78
+ "T19", // 79
+ "T20", // 80
+ "T19", // 81
+ "BULL", // 82
+ "T17", // 83
+ "T20", // 84
+ "T15", // 85
+ "T18", // 86
+ "T17", // 87
+ "T20", // 88
+ "T19", // 89
+ "T20", // 90
+ "T17", // 91
+ "T20", // 92
+ "T19", // 93
+ "T18", // 94
+ "T19", // 95
+ "T20", // 96
+ "T19", // 97
+ "T20", // 98
+ "T19", // 99
+ "T20", // 100
+ "T19", // 101
+ "T20", // 102
+ "T19", // 103
+ "T19", // 104
+ "T20", // 105
+ "T20", // 106
+ "T19", // 107
+ "T20", // 108
+ "T20", // 109
+ "T19", // 110
+ "T19", // 111
+ "T20", // 112
+ "T19", // 113
+ "T20", // 114
+ "T19", // 115
+ "T19", // 116
+ "T20", // 117
+ "T20", // 118
+ "T19", // 119
+ "T20", // 120
+ "T20", // 121
+ "T18", // 122
+ "T19", // 123
+ "T20", // 124
+ "BULL", // 125
+ "T19", // 126
+ "T20", // 127
+ "T20", // 128
+ "T19", // 129
+ "T20", // 130
+ "T19", // 131
+ "BULL", // 132
+ "T14", // 133
+ "T14", // 134
+ "BULL", // 135
+ "T20", // 136
+ "T14", // 137
+ "T20", // 138
+ "T19", // 139
+ "T15", // 140
+ "T19", // 141
+ "T20", // 142
+ "T20", // 143
+ "T20", // 144
+ "T20", // 145
+ "T19", // 146
+ "T19", // 147
+ "T20", // 148
+ "T20", // 149
+ "T20", // 150
+ "T20", // 151
+ "T20", // 152
+ "T20", // 153
+ "T19", // 154
+ "T20", // 155
+ "T20", // 156
+ "T20", // 157
+ "T20", // 158
+ NULL, // 159
+ "T20", // 160
+ "T20", // 161
+ NULL, // 162
+ NULL, // 163
+ "T19", // 164
+ NULL, // 165
+ NULL, // 166
+ "T19", // 167
+ NULL, // 168
+ NULL, // 169
+ "T20", // 170
+ }
+};
+
+#endif
diff --git a/dartbot.c b/dartbot.c
index c79706f..7c89a52 100644
--- a/dartbot.c
+++ b/dartbot.c
@@ -1,3 +1,5 @@
+#include "checkouts.h"
+
#include <math.h>
#include <ncurses.h>
#include <stdbool.h>
@@ -35,13 +37,13 @@
int SECTORS[] = { 20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7,
16, 8, 11, 14, 9, 12, 5 };
-#define LEN_SECTORS (sizeof(SECTORS) / sizeof(*SECTORS))
-#define SECTOR_WIDTH (360.0 / LEN_SECTORS)
-int SECTOR_INDS[LEN_SECTORS];
-double SECTOR_ANGLES[LEN_SECTORS];
+#define NUM_SECTORS (sizeof(SECTORS) / sizeof(*SECTORS))
+#define SECTOR_WIDTH (360.0 / NUM_SECTORS)
+int SECTOR_INDS[NUM_SECTORS];
+double SECTOR_ANGLES[NUM_SECTORS];
void init_sectors()
{
- for (size_t i = 0; i < LEN_SECTORS; ++i) {
+ for (size_t i = 0; i < NUM_SECTORS; ++i) {
SECTOR_INDS[SECTORS[i]-1] = i;
double angle = 90 - (i * SECTOR_WIDTH);
@@ -89,7 +91,7 @@ struct segment {
int get_sector(double angle)
{
double shifted = angle - 90 - (SECTOR_WIDTH/2);
- return SECTORS[LEN_SECTORS - 1 -
+ return SECTORS[NUM_SECTORS - 1 -
(int)((shifted - (360 * floor(shifted/360))) / SECTOR_WIDTH)];
}
@@ -237,16 +239,27 @@ struct segment segment_from_name(char *name)
struct visit {
int points;
- int darts_thrown;
+ int n_darts;
struct segment *darts;
};
+struct segment next_dart(int rem, int darts_in_hand)
+{
+ char *c = NULL;
+ if (rem <= 170)
+ c = CHECKOUTS[darts_in_hand-1][rem-1];
+ if (!c) c = "T20";
+
+ return segment_from_name(c);
+}
+
struct visit test_visit(int rem)
{
- struct visit v = { .points = 0, .darts_thrown = 0,
+ struct visit v = { .points = 0, .n_darts = 0,
.darts = calloc(3, sizeof(struct segment)) };
for (int i = 0; i < 3; ++i) {
+ /*
struct segment ts;
if (rem - v.points <= 40 && (rem - v.points) % 2 == 0)
ts = (struct segment){ .ring = R_DOUBLE,
@@ -255,12 +268,14 @@ struct visit test_visit(int rem)
ts = segment_from_name("1");
else
ts = segment_from_name("T20");
+ */
+ struct segment ts = next_dart(rem - v.points, 3 - i);
struct pcoords tc = segment_centre(ts);
struct pcoords dc = throw_dart(tc);
struct segment ds = get_segment(dc);
v.darts[i] = ds;
- ++v.darts_thrown;
+ ++v.n_darts;
v.points += segment_points(ds);
if (rem - v.points == 0 && segment_is_double(ds))
@@ -287,7 +302,7 @@ void test_match(int start_points)
rem -= v.points;
printf("(%2d) %3d", visits, rem);
- for (int i = 0; i < v.darts_thrown; ++i) {
+ for (int i = 0; i < v.n_darts; ++i) {
char *n = segment_name(v.darts[i]);
printf(i == 0 ? " %4s" :" %4s", n);
free(n);