diff options
-rw-r--r-- | checkouts.h | 525 | ||||
-rw-r--r-- | dartbot.c | 35 |
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 @@ -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); |