Grid-based Pokitto game that challenges the player to deploy ships and then destroy the hidden ships of the computer.
main.cpp@2:b96bb2a68c81, 2018-01-02 (annotated)
- Committer:
- RichardAmes
- Date:
- Tue Jan 02 18:06:00 2018 +0000
- Revision:
- 2:b96bb2a68c81
- Parent:
- 1:7962cd90f0b3
Updated AI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RichardAmes | 1:7962cd90f0b3 | 1 | /* Naval Battle for Pokitto */ |
RichardAmes | 1:7962cd90f0b3 | 2 | /* Written by Richard Ames 2018 */ |
RichardAmes | 1:7962cd90f0b3 | 3 | |
RichardAmes | 0:1c44c4ef1245 | 4 | #include "Pokitto.h" |
RichardAmes | 0:1c44c4ef1245 | 5 | |
RichardAmes | 0:1c44c4ef1245 | 6 | Pokitto::Core game; |
RichardAmes | 0:1c44c4ef1245 | 7 | Pokitto::Sound snd; |
RichardAmes | 0:1c44c4ef1245 | 8 | |
RichardAmes | 0:1c44c4ef1245 | 9 | #define DESTROYER 0 |
RichardAmes | 0:1c44c4ef1245 | 10 | #define CRUISER 1 |
RichardAmes | 0:1c44c4ef1245 | 11 | #define BATTLESHIP 2 |
RichardAmes | 0:1c44c4ef1245 | 12 | #define CARRIER 3 |
RichardAmes | 0:1c44c4ef1245 | 13 | |
RichardAmes | 0:1c44c4ef1245 | 14 | /* Ship states */ |
RichardAmes | 0:1c44c4ef1245 | 15 | #define DEPLOYING 1 |
RichardAmes | 0:1c44c4ef1245 | 16 | #define SELECTED 2 |
RichardAmes | 0:1c44c4ef1245 | 17 | |
RichardAmes | 0:1c44c4ef1245 | 18 | /* Game states */ |
RichardAmes | 1:7962cd90f0b3 | 19 | #define SPLASH 0 |
RichardAmes | 1:7962cd90f0b3 | 20 | #define SETUP 1 |
RichardAmes | 1:7962cd90f0b3 | 21 | #define PLACE 2 |
RichardAmes | 1:7962cd90f0b3 | 22 | #define ENGAGE 3 |
RichardAmes | 1:7962cd90f0b3 | 23 | #define FLY_MISSILE 4 |
RichardAmes | 0:1c44c4ef1245 | 24 | #define COMPUTER_PLAYS 5 |
RichardAmes | 1:7962cd90f0b3 | 25 | #define WINNER 6 |
RichardAmes | 0:1c44c4ef1245 | 26 | |
RichardAmes | 0:1c44c4ef1245 | 27 | /* Placement states */ |
RichardAmes | 0:1c44c4ef1245 | 28 | #define PLACING 0 |
RichardAmes | 0:1c44c4ef1245 | 29 | #define NOT_SELECTED 1 |
RichardAmes | 0:1c44c4ef1245 | 30 | |
RichardAmes | 0:1c44c4ef1245 | 31 | /* Grid states */ |
RichardAmes | 0:1c44c4ef1245 | 32 | #define GRID_SHIP 0x01 |
RichardAmes | 0:1c44c4ef1245 | 33 | #define GRID_SHOT 0x02 |
RichardAmes | 0:1c44c4ef1245 | 34 | |
RichardAmes | 0:1c44c4ef1245 | 35 | #define MUXCOUNT 8 |
RichardAmes | 1:7962cd90f0b3 | 36 | #define BTHRESH 1 |
RichardAmes | 0:1c44c4ef1245 | 37 | |
RichardAmes | 0:1c44c4ef1245 | 38 | #define GRID_SIZE 10 |
RichardAmes | 0:1c44c4ef1245 | 39 | |
RichardAmes | 1:7962cd90f0b3 | 40 | /* Simple sprite graphics, coded by hand */ |
RichardAmes | 0:1c44c4ef1245 | 41 | const uint8_t ship2[] = { |
RichardAmes | 0:1c44c4ef1245 | 42 | 16, 5, |
RichardAmes | 0:1c44c4ef1245 | 43 | 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 44 | 0xee, 0xee, 0x66, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 45 | 0xee, 0x66, 0x76, 0x66, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 46 | 0x55, 0x55, 0x55, 0x55, 0x55, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 47 | 0xe5, 0x55, 0x55, 0x55, 0x5e, 0xee, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 48 | }; |
RichardAmes | 0:1c44c4ef1245 | 49 | |
RichardAmes | 0:1c44c4ef1245 | 50 | const uint8_t ship2v[] = { |
RichardAmes | 0:1c44c4ef1245 | 51 | 8, 10, |
RichardAmes | 0:1c44c4ef1245 | 52 | 0xee, 0x5e, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 53 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 54 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 55 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 56 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 57 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 58 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 59 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 60 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 61 | 0xee, 0x5e, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 62 | }; |
RichardAmes | 0:1c44c4ef1245 | 63 | |
RichardAmes | 0:1c44c4ef1245 | 64 | const uint8_t ship3[] = { |
RichardAmes | 0:1c44c4ef1245 | 65 | 16, 5, |
RichardAmes | 0:1c44c4ef1245 | 66 | 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 67 | 0xee, 0xee, 0xee, 0x66, 0x6e, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 68 | 0xee, 0xee, 0x66, 0x76, 0x76, 0x76, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 69 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5e, |
RichardAmes | 0:1c44c4ef1245 | 70 | 0xe5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xee |
RichardAmes | 0:1c44c4ef1245 | 71 | }; |
RichardAmes | 0:1c44c4ef1245 | 72 | |
RichardAmes | 0:1c44c4ef1245 | 73 | const uint8_t ship3v[] = { |
RichardAmes | 0:1c44c4ef1245 | 74 | 8, 15, |
RichardAmes | 0:1c44c4ef1245 | 75 | 0xee, 0x5e, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 76 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 77 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 78 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 79 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 80 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 81 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 82 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 83 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 84 | 0x55, 0x5e, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 85 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 86 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 87 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 88 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 89 | 0xee, 0x5e, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 90 | }; |
RichardAmes | 0:1c44c4ef1245 | 91 | |
RichardAmes | 0:1c44c4ef1245 | 92 | const uint8_t ship4[] = { |
RichardAmes | 0:1c44c4ef1245 | 93 | 24, 5, |
RichardAmes | 0:1c44c4ef1245 | 94 | 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, 0x6e, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 95 | 0xee, 0xee, 0xee, 0x66, 0x66, 0x66, 0x66, 0x6e, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 96 | 0xee, 0xee, 0x66, 0x76, 0x76, 0x76, 0x76, 0x76, 0x6e, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 97 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 98 | 0xe5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5e, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 99 | }; |
RichardAmes | 0:1c44c4ef1245 | 100 | |
RichardAmes | 0:1c44c4ef1245 | 101 | const uint8_t ship4v[] = { |
RichardAmes | 0:1c44c4ef1245 | 102 | 8, 20, |
RichardAmes | 0:1c44c4ef1245 | 103 | 0xee, 0x5e, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 104 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 105 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 106 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 107 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 108 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 109 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 110 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 111 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 112 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 113 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 114 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 115 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 116 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 117 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 118 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 119 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 120 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 121 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 122 | 0xee, 0x5e, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 123 | }; |
RichardAmes | 0:1c44c4ef1245 | 124 | |
RichardAmes | 0:1c44c4ef1245 | 125 | const uint8_t ship5[] = { |
RichardAmes | 0:1c44c4ef1245 | 126 | 32, 5, |
RichardAmes | 0:1c44c4ef1245 | 127 | 0xee, 0xee, 0xee, 0xee, 0x66, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 128 | 0xee, 0xee, 0xee, 0xe6, 0x76, 0x76, 0x6e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 129 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5e, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 130 | 0xe5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 131 | 0xee, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5e, 0xee, 0xee, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 132 | }; |
RichardAmes | 0:1c44c4ef1245 | 133 | |
RichardAmes | 0:1c44c4ef1245 | 134 | const uint8_t ship5v[] = { |
RichardAmes | 0:1c44c4ef1245 | 135 | 8, 25, |
RichardAmes | 0:1c44c4ef1245 | 136 | 0xee, 0x5e, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 137 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 138 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 139 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 140 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 141 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 142 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 143 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 144 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 145 | 0x56, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 146 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 147 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 148 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 149 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 150 | 0x56, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 151 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 152 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 153 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 154 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 155 | 0x56, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 156 | 0x56, 0x66, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 157 | 0x55, 0x65, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 158 | 0x55, 0x55, 0x5e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 159 | 0xe5, 0x55, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 160 | 0xee, 0x5e, 0xee, 0xee |
RichardAmes | 0:1c44c4ef1245 | 161 | }; |
RichardAmes | 0:1c44c4ef1245 | 162 | |
RichardAmes | 0:1c44c4ef1245 | 163 | const uint8_t missile[] = { |
RichardAmes | 0:1c44c4ef1245 | 164 | 8, 5, |
RichardAmes | 0:1c44c4ef1245 | 165 | 0x9e, 0x9e, 0x9e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 166 | 0xe9, 0x99, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 167 | 0x99, 0xa9, 0x9e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 168 | 0xe9, 0x99, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 169 | 0x9e, 0x9e, 0x9e, 0xee |
RichardAmes | 0:1c44c4ef1245 | 170 | }; |
RichardAmes | 0:1c44c4ef1245 | 171 | |
RichardAmes | 0:1c44c4ef1245 | 172 | const uint8_t splash[] = { |
RichardAmes | 0:1c44c4ef1245 | 173 | 8, 5, |
RichardAmes | 0:1c44c4ef1245 | 174 | 0x7e, 0xee, 0x7e, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 175 | 0xe7, 0xe7, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 176 | 0xee, 0x7e, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 177 | 0xe7, 0xe7, 0xee, 0xee, |
RichardAmes | 0:1c44c4ef1245 | 178 | 0x7e, 0xee, 0x7e, 0xee |
RichardAmes | 0:1c44c4ef1245 | 179 | }; |
RichardAmes | 0:1c44c4ef1245 | 180 | |
RichardAmes | 0:1c44c4ef1245 | 181 | struct point { |
RichardAmes | 0:1c44c4ef1245 | 182 | int x; |
RichardAmes | 0:1c44c4ef1245 | 183 | int y; |
RichardAmes | 0:1c44c4ef1245 | 184 | }; |
RichardAmes | 0:1c44c4ef1245 | 185 | |
RichardAmes | 0:1c44c4ef1245 | 186 | struct point budge[] = { |
RichardAmes | 0:1c44c4ef1245 | 187 | {-1, 1}, |
RichardAmes | 0:1c44c4ef1245 | 188 | { 0, 1}, |
RichardAmes | 0:1c44c4ef1245 | 189 | { 1, 1}, |
RichardAmes | 0:1c44c4ef1245 | 190 | {-1, 0}, |
RichardAmes | 0:1c44c4ef1245 | 191 | { 1, 0}, |
RichardAmes | 0:1c44c4ef1245 | 192 | {-1, -1}, |
RichardAmes | 0:1c44c4ef1245 | 193 | { 0, -1}, |
RichardAmes | 0:1c44c4ef1245 | 194 | { 1, -1}}; |
RichardAmes | 0:1c44c4ef1245 | 195 | |
RichardAmes | 0:1c44c4ef1245 | 196 | struct ship { |
RichardAmes | 0:1c44c4ef1245 | 197 | int type; |
RichardAmes | 0:1c44c4ef1245 | 198 | int state; |
RichardAmes | 0:1c44c4ef1245 | 199 | int vert; |
RichardAmes | 0:1c44c4ef1245 | 200 | struct point home; |
RichardAmes | 0:1c44c4ef1245 | 201 | struct point dest; |
RichardAmes | 0:1c44c4ef1245 | 202 | struct point now; |
RichardAmes | 0:1c44c4ef1245 | 203 | }; |
RichardAmes | 0:1c44c4ef1245 | 204 | |
RichardAmes | 0:1c44c4ef1245 | 205 | struct ship ship[] = { |
RichardAmes | 0:1c44c4ef1245 | 206 | {0, 0, 0, 5, 24, 0, 0, 0, 0}, |
RichardAmes | 0:1c44c4ef1245 | 207 | {1, 0, 0, 5, 34, 0, 0, 0, 0}, |
RichardAmes | 0:1c44c4ef1245 | 208 | {1, 0, 0, 25, 34, 0, 0, 0, 0}, |
RichardAmes | 0:1c44c4ef1245 | 209 | {2, 0, 0, 5, 44, 0, 0, 0, 0}, |
RichardAmes | 0:1c44c4ef1245 | 210 | {3, 0, 0, 5, 54, 0, 0, 0, 0}}; |
RichardAmes | 0:1c44c4ef1245 | 211 | |
RichardAmes | 0:1c44c4ef1245 | 212 | int shiplen[] = {2, 3, 4, 5}; |
RichardAmes | 0:1c44c4ef1245 | 213 | int shipinfo[] = {2, 3, 3, 4, 5}; |
RichardAmes | 1:7962cd90f0b3 | 214 | |
RichardAmes | 1:7962cd90f0b3 | 215 | /* Globals */ |
RichardAmes | 0:1c44c4ef1245 | 216 | int numships = (sizeof(ship) / sizeof(ship[0])); |
RichardAmes | 0:1c44c4ef1245 | 217 | int cursx; |
RichardAmes | 0:1c44c4ef1245 | 218 | int cursy; |
RichardAmes | 0:1c44c4ef1245 | 219 | int place_state; |
RichardAmes | 0:1c44c4ef1245 | 220 | int game_state; |
RichardAmes | 0:1c44c4ef1245 | 221 | int state_ctr; |
RichardAmes | 0:1c44c4ef1245 | 222 | char str1[8]; |
RichardAmes | 2:b96bb2a68c81 | 223 | int debug0; |
RichardAmes | 0:1c44c4ef1245 | 224 | int debug1; |
RichardAmes | 0:1c44c4ef1245 | 225 | int debug2; |
RichardAmes | 2:b96bb2a68c81 | 226 | int debug3; |
RichardAmes | 0:1c44c4ef1245 | 227 | int mx; |
RichardAmes | 0:1c44c4ef1245 | 228 | int my; |
RichardAmes | 0:1c44c4ef1245 | 229 | int a_num; |
RichardAmes | 0:1c44c4ef1245 | 230 | int a_den; |
RichardAmes | 0:1c44c4ef1245 | 231 | int arc_c; |
RichardAmes | 2:b96bb2a68c81 | 232 | char pgrid[GRID_SIZE][GRID_SIZE]; |
RichardAmes | 2:b96bb2a68c81 | 233 | char cgrid[GRID_SIZE][GRID_SIZE]; |
RichardAmes | 2:b96bb2a68c81 | 234 | char heatmap[GRID_SIZE][GRID_SIZE]; |
RichardAmes | 0:1c44c4ef1245 | 235 | int computer_playing; |
RichardAmes | 1:7962cd90f0b3 | 236 | int computer_guessing; |
RichardAmes | 0:1c44c4ef1245 | 237 | int computerx; |
RichardAmes | 0:1c44c4ef1245 | 238 | int computery; |
RichardAmes | 0:1c44c4ef1245 | 239 | int oldx; |
RichardAmes | 0:1c44c4ef1245 | 240 | int oldy; |
RichardAmes | 1:7962cd90f0b3 | 241 | int bdelay; |
RichardAmes | 0:1c44c4ef1245 | 242 | |
RichardAmes | 0:1c44c4ef1245 | 243 | void show_debug(void) |
RichardAmes | 0:1c44c4ef1245 | 244 | { |
RichardAmes | 2:b96bb2a68c81 | 245 | game.display.color = 12; |
RichardAmes | 2:b96bb2a68c81 | 246 | game.display.setCursor(60, 72); |
RichardAmes | 2:b96bb2a68c81 | 247 | sprintf(str1, "%d %d", debug0, debug1); |
RichardAmes | 2:b96bb2a68c81 | 248 | game.display.print(str1); |
RichardAmes | 0:1c44c4ef1245 | 249 | game.display.setCursor(60, 80); |
RichardAmes | 2:b96bb2a68c81 | 250 | sprintf(str1, "%d %d", debug2, debug3); |
RichardAmes | 0:1c44c4ef1245 | 251 | game.display.print(str1); |
RichardAmes | 0:1c44c4ef1245 | 252 | } |
RichardAmes | 0:1c44c4ef1245 | 253 | |
RichardAmes | 0:1c44c4ef1245 | 254 | /* Convert from coarse grid to fine grid */ |
RichardAmes | 0:1c44c4ef1245 | 255 | int cursx0(void) |
RichardAmes | 0:1c44c4ef1245 | 256 | { |
RichardAmes | 0:1c44c4ef1245 | 257 | return cursx * 5 - 1; |
RichardAmes | 0:1c44c4ef1245 | 258 | } |
RichardAmes | 0:1c44c4ef1245 | 259 | |
RichardAmes | 0:1c44c4ef1245 | 260 | /* Convert from coarse grid to fine grid */ |
RichardAmes | 0:1c44c4ef1245 | 261 | int cursy0(void) |
RichardAmes | 0:1c44c4ef1245 | 262 | { |
RichardAmes | 0:1c44c4ef1245 | 263 | return cursy * 5 - 2; |
RichardAmes | 0:1c44c4ef1245 | 264 | } |
RichardAmes | 0:1c44c4ef1245 | 265 | |
RichardAmes | 1:7962cd90f0b3 | 266 | /* Show yellow box cursor */ |
RichardAmes | 0:1c44c4ef1245 | 267 | void show_cursor(void) |
RichardAmes | 0:1c44c4ef1245 | 268 | { |
RichardAmes | 0:1c44c4ef1245 | 269 | game.display.color = 10; |
RichardAmes | 0:1c44c4ef1245 | 270 | game.display.fillRectangle(cursx0(), cursy0(), 5, 5); |
RichardAmes | 0:1c44c4ef1245 | 271 | } |
RichardAmes | 0:1c44c4ef1245 | 272 | |
RichardAmes | 1:7962cd90f0b3 | 273 | /* Updated ship on screen. Could probably be rewritten as one case */ |
RichardAmes | 1:7962cd90f0b3 | 274 | void display_ship(int index) |
RichardAmes | 0:1c44c4ef1245 | 275 | { |
RichardAmes | 0:1c44c4ef1245 | 276 | switch (ship[index].type) |
RichardAmes | 0:1c44c4ef1245 | 277 | { |
RichardAmes | 0:1c44c4ef1245 | 278 | case DESTROYER: |
RichardAmes | 0:1c44c4ef1245 | 279 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 280 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship2); |
RichardAmes | 0:1c44c4ef1245 | 281 | else |
RichardAmes | 0:1c44c4ef1245 | 282 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship2v); |
RichardAmes | 0:1c44c4ef1245 | 283 | break; |
RichardAmes | 0:1c44c4ef1245 | 284 | case CRUISER: |
RichardAmes | 0:1c44c4ef1245 | 285 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 286 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship3); |
RichardAmes | 0:1c44c4ef1245 | 287 | else |
RichardAmes | 0:1c44c4ef1245 | 288 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship3v); |
RichardAmes | 0:1c44c4ef1245 | 289 | break; |
RichardAmes | 0:1c44c4ef1245 | 290 | case BATTLESHIP: |
RichardAmes | 0:1c44c4ef1245 | 291 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 292 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship4); |
RichardAmes | 0:1c44c4ef1245 | 293 | else |
RichardAmes | 0:1c44c4ef1245 | 294 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship4v); |
RichardAmes | 0:1c44c4ef1245 | 295 | break; |
RichardAmes | 0:1c44c4ef1245 | 296 | case CARRIER: |
RichardAmes | 0:1c44c4ef1245 | 297 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 298 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship5); |
RichardAmes | 0:1c44c4ef1245 | 299 | else |
RichardAmes | 0:1c44c4ef1245 | 300 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship5v); |
RichardAmes | 0:1c44c4ef1245 | 301 | break; |
RichardAmes | 0:1c44c4ef1245 | 302 | } |
RichardAmes | 0:1c44c4ef1245 | 303 | } |
RichardAmes | 0:1c44c4ef1245 | 304 | |
RichardAmes | 1:7962cd90f0b3 | 305 | /* Draw computer grid on display. Include hits and misses */ |
RichardAmes | 0:1c44c4ef1245 | 306 | void draw_cgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 307 | { |
RichardAmes | 0:1c44c4ef1245 | 308 | int i; |
RichardAmes | 0:1c44c4ef1245 | 309 | int j; |
RichardAmes | 0:1c44c4ef1245 | 310 | int checkval; |
RichardAmes | 0:1c44c4ef1245 | 311 | |
RichardAmes | 0:1c44c4ef1245 | 312 | game.display.color = 11; |
RichardAmes | 0:1c44c4ef1245 | 313 | /* Draw grid for computer's ships */ |
RichardAmes | 0:1c44c4ef1245 | 314 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 315 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 316 | { |
RichardAmes | 0:1c44c4ef1245 | 317 | game.display.fillRectangle(5 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 318 | checkval = cgrid[i][j] & (GRID_SHIP | GRID_SHOT); |
RichardAmes | 0:1c44c4ef1245 | 319 | if (checkval == (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 0:1c44c4ef1245 | 320 | game.display.drawBitmap(5 + i * 5, 19 + j * 5, missile); |
RichardAmes | 0:1c44c4ef1245 | 321 | else if (checkval == GRID_SHOT) |
RichardAmes | 0:1c44c4ef1245 | 322 | game.display.drawBitmap(5 + i * 5, 19 + j * 5, splash); |
RichardAmes | 0:1c44c4ef1245 | 323 | } |
RichardAmes | 0:1c44c4ef1245 | 324 | } |
RichardAmes | 0:1c44c4ef1245 | 325 | |
RichardAmes | 1:7962cd90f0b3 | 326 | /* Draw player grid on screen. Include hits and misses */ |
RichardAmes | 0:1c44c4ef1245 | 327 | void draw_pgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 328 | { |
RichardAmes | 0:1c44c4ef1245 | 329 | int i; |
RichardAmes | 0:1c44c4ef1245 | 330 | int j; |
RichardAmes | 0:1c44c4ef1245 | 331 | int checkval; |
RichardAmes | 0:1c44c4ef1245 | 332 | |
RichardAmes | 0:1c44c4ef1245 | 333 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 334 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 335 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 336 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 337 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 338 | |
RichardAmes | 0:1c44c4ef1245 | 339 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 340 | { |
RichardAmes | 1:7962cd90f0b3 | 341 | display_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 342 | } |
RichardAmes | 0:1c44c4ef1245 | 343 | |
RichardAmes | 0:1c44c4ef1245 | 344 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 345 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 346 | { |
RichardAmes | 0:1c44c4ef1245 | 347 | checkval = pgrid[i][j] & (GRID_SHIP | GRID_SHOT); |
RichardAmes | 0:1c44c4ef1245 | 348 | if (checkval == (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 0:1c44c4ef1245 | 349 | game.display.drawBitmap(60 + i * 5, 19 + j * 5, missile); |
RichardAmes | 0:1c44c4ef1245 | 350 | else if (checkval == GRID_SHOT) |
RichardAmes | 0:1c44c4ef1245 | 351 | game.display.drawBitmap(60 + i * 5, 19 + j * 5, splash); |
RichardAmes | 0:1c44c4ef1245 | 352 | } |
RichardAmes | 0:1c44c4ef1245 | 353 | } |
RichardAmes | 0:1c44c4ef1245 | 354 | |
RichardAmes | 0:1c44c4ef1245 | 355 | /* Check if player's ships are inside grid. Return 1 if OK */ |
RichardAmes | 0:1c44c4ef1245 | 356 | int check_pgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 357 | { |
RichardAmes | 0:1c44c4ef1245 | 358 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 359 | struct ship *s; |
RichardAmes | 0:1c44c4ef1245 | 360 | int endpoint; |
RichardAmes | 0:1c44c4ef1245 | 361 | int x; |
RichardAmes | 0:1c44c4ef1245 | 362 | int y; |
RichardAmes | 0:1c44c4ef1245 | 363 | int i; |
RichardAmes | 0:1c44c4ef1245 | 364 | |
RichardAmes | 0:1c44c4ef1245 | 365 | /* Clear player grid ship placement info */ |
RichardAmes | 0:1c44c4ef1245 | 366 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 0:1c44c4ef1245 | 367 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 0:1c44c4ef1245 | 368 | pgrid[x][y] &= ~GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 369 | |
RichardAmes | 0:1c44c4ef1245 | 370 | for (shipno = 0; shipno < numships; shipno++) |
RichardAmes | 0:1c44c4ef1245 | 371 | { |
RichardAmes | 1:7962cd90f0b3 | 372 | |
RichardAmes | 0:1c44c4ef1245 | 373 | s = &ship[shipno]; |
RichardAmes | 0:1c44c4ef1245 | 374 | /* Set up coarse coordinates */ |
RichardAmes | 0:1c44c4ef1245 | 375 | x = (s->now.x + 1) / 5; |
RichardAmes | 0:1c44c4ef1245 | 376 | y = (s->now.y + 2) / 5; |
RichardAmes | 0:1c44c4ef1245 | 377 | /* Check first end point */ |
RichardAmes | 0:1c44c4ef1245 | 378 | if ((x < 12) || (x > 21) || |
RichardAmes | 0:1c44c4ef1245 | 379 | (y < 4) || (y > 13)) |
RichardAmes | 0:1c44c4ef1245 | 380 | { |
RichardAmes | 0:1c44c4ef1245 | 381 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 382 | } |
RichardAmes | 0:1c44c4ef1245 | 383 | /* Check second end point */ |
RichardAmes | 0:1c44c4ef1245 | 384 | if (s->vert) |
RichardAmes | 0:1c44c4ef1245 | 385 | { |
RichardAmes | 0:1c44c4ef1245 | 386 | endpoint = y + shiplen[s->type] - 1; |
RichardAmes | 0:1c44c4ef1245 | 387 | if ((endpoint < 4) || (endpoint > 13)) |
RichardAmes | 0:1c44c4ef1245 | 388 | { |
RichardAmes | 0:1c44c4ef1245 | 389 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 390 | } |
RichardAmes | 0:1c44c4ef1245 | 391 | } |
RichardAmes | 0:1c44c4ef1245 | 392 | else |
RichardAmes | 0:1c44c4ef1245 | 393 | { |
RichardAmes | 0:1c44c4ef1245 | 394 | endpoint = x + shiplen[s->type] - 1; |
RichardAmes | 0:1c44c4ef1245 | 395 | if ((endpoint < 12) || (endpoint > 21)) |
RichardAmes | 0:1c44c4ef1245 | 396 | { |
RichardAmes | 0:1c44c4ef1245 | 397 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 398 | } |
RichardAmes | 0:1c44c4ef1245 | 399 | } |
RichardAmes | 0:1c44c4ef1245 | 400 | /* Convert to pgrid relative offsets */ |
RichardAmes | 0:1c44c4ef1245 | 401 | x = x - 12; |
RichardAmes | 0:1c44c4ef1245 | 402 | y = y - 4; |
RichardAmes | 0:1c44c4ef1245 | 403 | for (i = 0; i < shiplen[s->type]; i++) |
RichardAmes | 0:1c44c4ef1245 | 404 | if (s->vert) |
RichardAmes | 0:1c44c4ef1245 | 405 | if (pgrid[x][y + i] & GRID_SHIP) |
RichardAmes | 0:1c44c4ef1245 | 406 | { |
RichardAmes | 0:1c44c4ef1245 | 407 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 408 | } |
RichardAmes | 0:1c44c4ef1245 | 409 | else |
RichardAmes | 0:1c44c4ef1245 | 410 | pgrid[x][y + i] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 411 | else |
RichardAmes | 0:1c44c4ef1245 | 412 | if (pgrid[x + i][y] & GRID_SHIP) |
RichardAmes | 0:1c44c4ef1245 | 413 | { |
RichardAmes | 0:1c44c4ef1245 | 414 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 415 | } |
RichardAmes | 0:1c44c4ef1245 | 416 | else |
RichardAmes | 0:1c44c4ef1245 | 417 | pgrid[x + i][y] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 418 | } |
RichardAmes | 0:1c44c4ef1245 | 419 | return 1; |
RichardAmes | 0:1c44c4ef1245 | 420 | } |
RichardAmes | 0:1c44c4ef1245 | 421 | |
RichardAmes | 1:7962cd90f0b3 | 422 | /* Randomly place ships in computer grid, clear player grid */ |
RichardAmes | 1:7962cd90f0b3 | 423 | void fill_grids(void) |
RichardAmes | 0:1c44c4ef1245 | 424 | { |
RichardAmes | 0:1c44c4ef1245 | 425 | int x; |
RichardAmes | 0:1c44c4ef1245 | 426 | int y; |
RichardAmes | 0:1c44c4ef1245 | 427 | int len; |
RichardAmes | 0:1c44c4ef1245 | 428 | int dir; |
RichardAmes | 0:1c44c4ef1245 | 429 | int i; |
RichardAmes | 0:1c44c4ef1245 | 430 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 431 | int inplace; |
RichardAmes | 0:1c44c4ef1245 | 432 | |
RichardAmes | 0:1c44c4ef1245 | 433 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 0:1c44c4ef1245 | 434 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 435 | { |
RichardAmes | 0:1c44c4ef1245 | 436 | cgrid[x][y] = 0; |
RichardAmes | 1:7962cd90f0b3 | 437 | pgrid[x][y] = 0; |
RichardAmes | 1:7962cd90f0b3 | 438 | } |
RichardAmes | 1:7962cd90f0b3 | 439 | |
RichardAmes | 1:7962cd90f0b3 | 440 | for (shipno = 0; shipno < sizeof(shipinfo) / sizeof(int); ) |
RichardAmes | 0:1c44c4ef1245 | 441 | { |
RichardAmes | 0:1c44c4ef1245 | 442 | x = rand() % 10; |
RichardAmes | 0:1c44c4ef1245 | 443 | y = rand() % 10; |
RichardAmes | 0:1c44c4ef1245 | 444 | dir = rand() % 2; |
RichardAmes | 0:1c44c4ef1245 | 445 | len = shipinfo[shipno]; |
RichardAmes | 0:1c44c4ef1245 | 446 | |
RichardAmes | 1:7962cd90f0b3 | 447 | if ((dir == 0) && (x + len < GRID_SIZE)) |
RichardAmes | 0:1c44c4ef1245 | 448 | { |
RichardAmes | 0:1c44c4ef1245 | 449 | inplace = 0; |
RichardAmes | 0:1c44c4ef1245 | 450 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 451 | inplace += cgrid[x + i][y] & GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 452 | if (inplace == 0) |
RichardAmes | 0:1c44c4ef1245 | 453 | { |
RichardAmes | 0:1c44c4ef1245 | 454 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 455 | cgrid[x + i][y] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 456 | shipno++; |
RichardAmes | 0:1c44c4ef1245 | 457 | } |
RichardAmes | 0:1c44c4ef1245 | 458 | } |
RichardAmes | 1:7962cd90f0b3 | 459 | else if (y + len < GRID_SIZE) |
RichardAmes | 0:1c44c4ef1245 | 460 | { |
RichardAmes | 0:1c44c4ef1245 | 461 | inplace = 0; |
RichardAmes | 0:1c44c4ef1245 | 462 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 463 | inplace += cgrid[x][y + i] & GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 464 | if (inplace == 0) |
RichardAmes | 0:1c44c4ef1245 | 465 | { |
RichardAmes | 0:1c44c4ef1245 | 466 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 467 | cgrid[x][y + i] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 468 | shipno++; |
RichardAmes | 0:1c44c4ef1245 | 469 | } |
RichardAmes | 0:1c44c4ef1245 | 470 | } |
RichardAmes | 0:1c44c4ef1245 | 471 | } |
RichardAmes | 1:7962cd90f0b3 | 472 | } |
RichardAmes | 1:7962cd90f0b3 | 473 | |
RichardAmes | 2:b96bb2a68c81 | 474 | /* Computer selects target. This is where we try to beat the player. */ |
RichardAmes | 2:b96bb2a68c81 | 475 | /* Sets cursx and cursy */ |
RichardAmes | 1:7962cd90f0b3 | 476 | void target_pgrid(void) |
RichardAmes | 1:7962cd90f0b3 | 477 | { |
RichardAmes | 1:7962cd90f0b3 | 478 | int x; |
RichardAmes | 1:7962cd90f0b3 | 479 | int y; |
RichardAmes | 2:b96bb2a68c81 | 480 | int i; |
RichardAmes | 2:b96bb2a68c81 | 481 | int shipno; |
RichardAmes | 2:b96bb2a68c81 | 482 | int len; |
RichardAmes | 2:b96bb2a68c81 | 483 | int misses; |
RichardAmes | 2:b96bb2a68c81 | 484 | int hits; |
RichardAmes | 2:b96bb2a68c81 | 485 | int hottest; |
RichardAmes | 2:b96bb2a68c81 | 486 | int count; |
RichardAmes | 2:b96bb2a68c81 | 487 | |
RichardAmes | 2:b96bb2a68c81 | 488 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 2:b96bb2a68c81 | 489 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 2:b96bb2a68c81 | 490 | heatmap[x][y] = 0; |
RichardAmes | 2:b96bb2a68c81 | 491 | |
RichardAmes | 2:b96bb2a68c81 | 492 | /* Update heat map */ |
RichardAmes | 2:b96bb2a68c81 | 493 | /* Walk through every square, add points for every ship that would */ |
RichardAmes | 2:b96bb2a68c81 | 494 | /* fit there. Extra points if we can see a ship *is* there */ |
RichardAmes | 2:b96bb2a68c81 | 495 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 2:b96bb2a68c81 | 496 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 2:b96bb2a68c81 | 497 | for (shipno = 0; shipno < sizeof(shipinfo) / sizeof(int); shipno++) |
RichardAmes | 2:b96bb2a68c81 | 498 | { |
RichardAmes | 2:b96bb2a68c81 | 499 | len = shipinfo[shipno]; |
RichardAmes | 2:b96bb2a68c81 | 500 | /* Check horizontal case */ |
RichardAmes | 2:b96bb2a68c81 | 501 | misses = 0; |
RichardAmes | 2:b96bb2a68c81 | 502 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 503 | { |
RichardAmes | 2:b96bb2a68c81 | 504 | if ((x + i >= GRID_SIZE) || |
RichardAmes | 2:b96bb2a68c81 | 505 | ((pgrid[x + i][y] & (GRID_SHIP | GRID_SHOT)) == |
RichardAmes | 2:b96bb2a68c81 | 506 | GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 507 | misses++; |
RichardAmes | 2:b96bb2a68c81 | 508 | } |
RichardAmes | 2:b96bb2a68c81 | 509 | if (misses == 0) |
RichardAmes | 2:b96bb2a68c81 | 510 | { |
RichardAmes | 2:b96bb2a68c81 | 511 | hits = 0; |
RichardAmes | 2:b96bb2a68c81 | 512 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 513 | { |
RichardAmes | 2:b96bb2a68c81 | 514 | if ((pgrid[x + i][y] & (GRID_SHIP | GRID_SHOT)) == |
RichardAmes | 2:b96bb2a68c81 | 515 | (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 516 | hits++; |
RichardAmes | 2:b96bb2a68c81 | 517 | } |
RichardAmes | 2:b96bb2a68c81 | 518 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 519 | heatmap[x + i][y] += 1 + hits; |
RichardAmes | 2:b96bb2a68c81 | 520 | } |
RichardAmes | 2:b96bb2a68c81 | 521 | /* Check vertical case */ |
RichardAmes | 2:b96bb2a68c81 | 522 | misses = 0; |
RichardAmes | 2:b96bb2a68c81 | 523 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 524 | { |
RichardAmes | 2:b96bb2a68c81 | 525 | if ((y + i >= GRID_SIZE) || |
RichardAmes | 2:b96bb2a68c81 | 526 | ((pgrid[x][y + i] & (GRID_SHIP | GRID_SHOT)) == |
RichardAmes | 2:b96bb2a68c81 | 527 | GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 528 | misses++; |
RichardAmes | 2:b96bb2a68c81 | 529 | } |
RichardAmes | 2:b96bb2a68c81 | 530 | if (misses == 0) |
RichardAmes | 2:b96bb2a68c81 | 531 | { |
RichardAmes | 2:b96bb2a68c81 | 532 | hits = 0; |
RichardAmes | 2:b96bb2a68c81 | 533 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 534 | { |
RichardAmes | 2:b96bb2a68c81 | 535 | if ((pgrid[x][y + i] & (GRID_SHIP | GRID_SHOT)) == |
RichardAmes | 2:b96bb2a68c81 | 536 | (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 537 | hits++; |
RichardAmes | 2:b96bb2a68c81 | 538 | } |
RichardAmes | 2:b96bb2a68c81 | 539 | for (i = 0; i < len; i++) |
RichardAmes | 2:b96bb2a68c81 | 540 | heatmap[x][y + i] += 1 + hits; |
RichardAmes | 2:b96bb2a68c81 | 541 | } |
RichardAmes | 2:b96bb2a68c81 | 542 | } |
RichardAmes | 2:b96bb2a68c81 | 543 | |
RichardAmes | 2:b96bb2a68c81 | 544 | /* Find the hottest points in the heat map. Ignore if we have already */ |
RichardAmes | 2:b96bb2a68c81 | 545 | /* targeted that point */ |
RichardAmes | 2:b96bb2a68c81 | 546 | hottest = 0; |
RichardAmes | 2:b96bb2a68c81 | 547 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 2:b96bb2a68c81 | 548 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 2:b96bb2a68c81 | 549 | if (!(pgrid[x][y] & GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 550 | { |
RichardAmes | 2:b96bb2a68c81 | 551 | if (heatmap[x][y] > hottest) |
RichardAmes | 2:b96bb2a68c81 | 552 | { |
RichardAmes | 2:b96bb2a68c81 | 553 | count = 1; |
RichardAmes | 2:b96bb2a68c81 | 554 | hottest = heatmap[x][y]; |
RichardAmes | 2:b96bb2a68c81 | 555 | } |
RichardAmes | 2:b96bb2a68c81 | 556 | else if (heatmap[x][y] == hottest) |
RichardAmes | 2:b96bb2a68c81 | 557 | count++; |
RichardAmes | 2:b96bb2a68c81 | 558 | } |
RichardAmes | 2:b96bb2a68c81 | 559 | |
RichardAmes | 2:b96bb2a68c81 | 560 | /* Select random instance of hottest from 0..count-1 */ |
RichardAmes | 2:b96bb2a68c81 | 561 | count = rand() % count; |
RichardAmes | 2:b96bb2a68c81 | 562 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 2:b96bb2a68c81 | 563 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 2:b96bb2a68c81 | 564 | if (!(pgrid[x][y] & GRID_SHOT)) |
RichardAmes | 2:b96bb2a68c81 | 565 | { |
RichardAmes | 2:b96bb2a68c81 | 566 | if (heatmap[x][y] == hottest) |
RichardAmes | 2:b96bb2a68c81 | 567 | { |
RichardAmes | 2:b96bb2a68c81 | 568 | if (count == 0) |
RichardAmes | 2:b96bb2a68c81 | 569 | { |
RichardAmes | 2:b96bb2a68c81 | 570 | cursx = x + 12; |
RichardAmes | 2:b96bb2a68c81 | 571 | cursy = y + 4; |
RichardAmes | 2:b96bb2a68c81 | 572 | return; |
RichardAmes | 2:b96bb2a68c81 | 573 | } |
RichardAmes | 2:b96bb2a68c81 | 574 | else |
RichardAmes | 2:b96bb2a68c81 | 575 | count--; |
RichardAmes | 2:b96bb2a68c81 | 576 | } |
RichardAmes | 2:b96bb2a68c81 | 577 | } |
RichardAmes | 1:7962cd90f0b3 | 578 | } |
RichardAmes | 1:7962cd90f0b3 | 579 | |
RichardAmes | 1:7962cd90f0b3 | 580 | /* Check for winner. Returns 0 - none, 1 - computer, 2 - player */ |
RichardAmes | 1:7962cd90f0b3 | 581 | int check_winner(void) |
RichardAmes | 1:7962cd90f0b3 | 582 | { |
RichardAmes | 1:7962cd90f0b3 | 583 | int x; |
RichardAmes | 1:7962cd90f0b3 | 584 | int y; |
RichardAmes | 1:7962cd90f0b3 | 585 | int misses; |
RichardAmes | 1:7962cd90f0b3 | 586 | |
RichardAmes | 1:7962cd90f0b3 | 587 | misses = 0; |
RichardAmes | 1:7962cd90f0b3 | 588 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 1:7962cd90f0b3 | 589 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 590 | { |
RichardAmes | 1:7962cd90f0b3 | 591 | if (cgrid[x][y] & GRID_SHIP) |
RichardAmes | 1:7962cd90f0b3 | 592 | { |
RichardAmes | 1:7962cd90f0b3 | 593 | if (!(cgrid[x][y] & GRID_SHOT)) |
RichardAmes | 1:7962cd90f0b3 | 594 | misses++; |
RichardAmes | 1:7962cd90f0b3 | 595 | } |
RichardAmes | 1:7962cd90f0b3 | 596 | } |
RichardAmes | 1:7962cd90f0b3 | 597 | if (misses == 0) |
RichardAmes | 1:7962cd90f0b3 | 598 | return 1; |
RichardAmes | 1:7962cd90f0b3 | 599 | |
RichardAmes | 1:7962cd90f0b3 | 600 | misses = 0; |
RichardAmes | 1:7962cd90f0b3 | 601 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 1:7962cd90f0b3 | 602 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 603 | { |
RichardAmes | 1:7962cd90f0b3 | 604 | if (pgrid[x][y] & GRID_SHIP) |
RichardAmes | 1:7962cd90f0b3 | 605 | { |
RichardAmes | 1:7962cd90f0b3 | 606 | if (!(pgrid[x][y] & GRID_SHOT)) |
RichardAmes | 1:7962cd90f0b3 | 607 | misses++; |
RichardAmes | 1:7962cd90f0b3 | 608 | } |
RichardAmes | 1:7962cd90f0b3 | 609 | } |
RichardAmes | 1:7962cd90f0b3 | 610 | if (misses == 0) |
RichardAmes | 1:7962cd90f0b3 | 611 | return 2; |
RichardAmes | 1:7962cd90f0b3 | 612 | |
RichardAmes | 1:7962cd90f0b3 | 613 | return 0; |
RichardAmes | 1:7962cd90f0b3 | 614 | } |
RichardAmes | 1:7962cd90f0b3 | 615 | |
RichardAmes | 1:7962cd90f0b3 | 616 | /* Initialize globals so game can be restarted */ |
RichardAmes | 0:1c44c4ef1245 | 617 | void reset_game(void) |
RichardAmes | 0:1c44c4ef1245 | 618 | { |
RichardAmes | 0:1c44c4ef1245 | 619 | int sn; |
RichardAmes | 0:1c44c4ef1245 | 620 | |
RichardAmes | 0:1c44c4ef1245 | 621 | game_state = SPLASH; |
RichardAmes | 0:1c44c4ef1245 | 622 | place_state = NOT_SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 623 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 0:1c44c4ef1245 | 624 | { |
RichardAmes | 1:7962cd90f0b3 | 625 | ship[sn].vert = 0; |
RichardAmes | 0:1c44c4ef1245 | 626 | ship[sn].now.x = 55; |
RichardAmes | 0:1c44c4ef1245 | 627 | ship[sn].now.y = 0; |
RichardAmes | 0:1c44c4ef1245 | 628 | ship[sn].dest.x = ship[sn].home.x; |
RichardAmes | 0:1c44c4ef1245 | 629 | ship[sn].dest.y = ship[sn].home.y; |
RichardAmes | 0:1c44c4ef1245 | 630 | } |
RichardAmes | 0:1c44c4ef1245 | 631 | state_ctr = 0; |
RichardAmes | 0:1c44c4ef1245 | 632 | cursx = 5; |
RichardAmes | 0:1c44c4ef1245 | 633 | cursy = 5; |
RichardAmes | 1:7962cd90f0b3 | 634 | fill_grids(); |
RichardAmes | 0:1c44c4ef1245 | 635 | } |
RichardAmes | 0:1c44c4ef1245 | 636 | |
RichardAmes | 1:7962cd90f0b3 | 637 | /* Display splash screen */ |
RichardAmes | 0:1c44c4ef1245 | 638 | void splash_screen(void) |
RichardAmes | 0:1c44c4ef1245 | 639 | { |
RichardAmes | 0:1c44c4ef1245 | 640 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 641 | game.display.setCursor(10, 10); |
RichardAmes | 0:1c44c4ef1245 | 642 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 643 | game.display.print("Naval Battle"); |
RichardAmes | 0:1c44c4ef1245 | 644 | state_ctr++; |
RichardAmes | 0:1c44c4ef1245 | 645 | if (state_ctr > 30) |
RichardAmes | 0:1c44c4ef1245 | 646 | game_state = SETUP; |
RichardAmes | 0:1c44c4ef1245 | 647 | } |
RichardAmes | 0:1c44c4ef1245 | 648 | |
RichardAmes | 1:7962cd90f0b3 | 649 | /* Find ship closest to cursor, returns index of ship */ |
RichardAmes | 0:1c44c4ef1245 | 650 | int closest_ship(int x, int y) |
RichardAmes | 0:1c44c4ef1245 | 651 | { |
RichardAmes | 0:1c44c4ef1245 | 652 | int i; |
RichardAmes | 0:1c44c4ef1245 | 653 | int pole_value; |
RichardAmes | 0:1c44c4ef1245 | 654 | int distance; |
RichardAmes | 0:1c44c4ef1245 | 655 | int closest; |
RichardAmes | 0:1c44c4ef1245 | 656 | |
RichardAmes | 0:1c44c4ef1245 | 657 | closest = 0; |
RichardAmes | 0:1c44c4ef1245 | 658 | pole_value = 10000; |
RichardAmes | 0:1c44c4ef1245 | 659 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 660 | { |
RichardAmes | 0:1c44c4ef1245 | 661 | distance = (ship[i].now.x - x) * (ship[i].now.x - x) + |
RichardAmes | 0:1c44c4ef1245 | 662 | (ship[i].now.y - y) * (ship[i].now.y - y); |
RichardAmes | 0:1c44c4ef1245 | 663 | if (distance < pole_value) |
RichardAmes | 0:1c44c4ef1245 | 664 | { |
RichardAmes | 0:1c44c4ef1245 | 665 | pole_value = distance; |
RichardAmes | 0:1c44c4ef1245 | 666 | closest = i; |
RichardAmes | 0:1c44c4ef1245 | 667 | } |
RichardAmes | 0:1c44c4ef1245 | 668 | } |
RichardAmes | 0:1c44c4ef1245 | 669 | return closest; |
RichardAmes | 0:1c44c4ef1245 | 670 | } |
RichardAmes | 0:1c44c4ef1245 | 671 | |
RichardAmes | 1:7962cd90f0b3 | 672 | /* Pull ship in the direction of the cursor */ |
RichardAmes | 0:1c44c4ef1245 | 673 | void pull_ship(int s) |
RichardAmes | 0:1c44c4ef1245 | 674 | { |
RichardAmes | 0:1c44c4ef1245 | 675 | int i; |
RichardAmes | 0:1c44c4ef1245 | 676 | int closest; |
RichardAmes | 0:1c44c4ef1245 | 677 | int pole_value; |
RichardAmes | 0:1c44c4ef1245 | 678 | int dx; |
RichardAmes | 0:1c44c4ef1245 | 679 | int dy; |
RichardAmes | 0:1c44c4ef1245 | 680 | int distance; |
RichardAmes | 0:1c44c4ef1245 | 681 | |
RichardAmes | 0:1c44c4ef1245 | 682 | if ((ship[s].now.x != ship[s].dest.x) || |
RichardAmes | 0:1c44c4ef1245 | 683 | (ship[s].now.y != ship[s].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 684 | { |
RichardAmes | 0:1c44c4ef1245 | 685 | closest = 0; |
RichardAmes | 0:1c44c4ef1245 | 686 | pole_value = 10000; |
RichardAmes | 0:1c44c4ef1245 | 687 | for (i = 0; i < 8; i++) |
RichardAmes | 0:1c44c4ef1245 | 688 | { |
RichardAmes | 0:1c44c4ef1245 | 689 | dx = ship[s].now.x + budge[i].x - ship[s].dest.x; |
RichardAmes | 0:1c44c4ef1245 | 690 | dy = ship[s].now.y + budge[i].y - ship[s].dest.y; |
RichardAmes | 0:1c44c4ef1245 | 691 | distance = dx * dx + dy * dy; |
RichardAmes | 0:1c44c4ef1245 | 692 | if (distance < pole_value) |
RichardAmes | 0:1c44c4ef1245 | 693 | { |
RichardAmes | 0:1c44c4ef1245 | 694 | pole_value = distance; |
RichardAmes | 0:1c44c4ef1245 | 695 | closest = i; |
RichardAmes | 0:1c44c4ef1245 | 696 | } |
RichardAmes | 0:1c44c4ef1245 | 697 | } |
RichardAmes | 0:1c44c4ef1245 | 698 | ship[s].now.x += budge[closest].x; |
RichardAmes | 0:1c44c4ef1245 | 699 | ship[s].now.y += budge[closest].y; |
RichardAmes | 0:1c44c4ef1245 | 700 | } |
RichardAmes | 0:1c44c4ef1245 | 701 | } |
RichardAmes | 0:1c44c4ef1245 | 702 | |
RichardAmes | 1:7962cd90f0b3 | 703 | /* Draw initial game state, with ships ready to be deployed */ |
RichardAmes | 0:1c44c4ef1245 | 704 | void setup_game(void) |
RichardAmes | 0:1c44c4ef1245 | 705 | { |
RichardAmes | 0:1c44c4ef1245 | 706 | int i; |
RichardAmes | 0:1c44c4ef1245 | 707 | int j; |
RichardAmes | 0:1c44c4ef1245 | 708 | int in_motion; |
RichardAmes | 0:1c44c4ef1245 | 709 | int sn; |
RichardAmes | 0:1c44c4ef1245 | 710 | |
RichardAmes | 0:1c44c4ef1245 | 711 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 712 | |
RichardAmes | 0:1c44c4ef1245 | 713 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 714 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 715 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 716 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 717 | |
RichardAmes | 0:1c44c4ef1245 | 718 | in_motion = 0; |
RichardAmes | 0:1c44c4ef1245 | 719 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 0:1c44c4ef1245 | 720 | if ((ship[sn].now.x != ship[sn].dest.x) || |
RichardAmes | 0:1c44c4ef1245 | 721 | (ship[sn].now.y != ship[sn].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 722 | { |
RichardAmes | 0:1c44c4ef1245 | 723 | snd.playTone(1, 33+3*sn, 255, 1, 0); |
RichardAmes | 0:1c44c4ef1245 | 724 | for (i = 0; i < 3; i++) |
RichardAmes | 0:1c44c4ef1245 | 725 | pull_ship(sn); |
RichardAmes | 0:1c44c4ef1245 | 726 | in_motion = 1; |
RichardAmes | 0:1c44c4ef1245 | 727 | break; |
RichardAmes | 0:1c44c4ef1245 | 728 | } |
RichardAmes | 0:1c44c4ef1245 | 729 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 1:7962cd90f0b3 | 730 | display_ship(sn); |
RichardAmes | 0:1c44c4ef1245 | 731 | if (!in_motion) |
RichardAmes | 0:1c44c4ef1245 | 732 | { |
RichardAmes | 0:1c44c4ef1245 | 733 | snd.playTone(1, 400, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 734 | game_state = PLACE; |
RichardAmes | 0:1c44c4ef1245 | 735 | } |
RichardAmes | 0:1c44c4ef1245 | 736 | } |
RichardAmes | 0:1c44c4ef1245 | 737 | |
RichardAmes | 2:b96bb2a68c81 | 738 | /* Allow player to place ships in player grid */ |
RichardAmes | 0:1c44c4ef1245 | 739 | void place_ships(void) |
RichardAmes | 0:1c44c4ef1245 | 740 | { |
RichardAmes | 0:1c44c4ef1245 | 741 | int i; |
RichardAmes | 0:1c44c4ef1245 | 742 | int j; |
RichardAmes | 0:1c44c4ef1245 | 743 | static int flasher; |
RichardAmes | 0:1c44c4ef1245 | 744 | static int closest; |
RichardAmes | 0:1c44c4ef1245 | 745 | flasher++; |
RichardAmes | 0:1c44c4ef1245 | 746 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 747 | |
RichardAmes | 0:1c44c4ef1245 | 748 | game.display.color = 10; |
RichardAmes | 0:1c44c4ef1245 | 749 | |
RichardAmes | 1:7962cd90f0b3 | 750 | if (game.buttons.upBtn()) |
RichardAmes | 1:7962cd90f0b3 | 751 | { |
RichardAmes | 1:7962cd90f0b3 | 752 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 753 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 754 | if (cursy >= 1) |
RichardAmes | 1:7962cd90f0b3 | 755 | cursy--; |
RichardAmes | 1:7962cd90f0b3 | 756 | } |
RichardAmes | 1:7962cd90f0b3 | 757 | else if (game.buttons.downBtn()) |
RichardAmes | 1:7962cd90f0b3 | 758 | { |
RichardAmes | 1:7962cd90f0b3 | 759 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 760 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 761 | if (cursy < 16) |
RichardAmes | 1:7962cd90f0b3 | 762 | cursy++; |
RichardAmes | 1:7962cd90f0b3 | 763 | } |
RichardAmes | 1:7962cd90f0b3 | 764 | else if (game.buttons.leftBtn()) |
RichardAmes | 1:7962cd90f0b3 | 765 | { |
RichardAmes | 1:7962cd90f0b3 | 766 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 767 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 768 | if (cursx >= 1) |
RichardAmes | 1:7962cd90f0b3 | 769 | cursx--; |
RichardAmes | 1:7962cd90f0b3 | 770 | } |
RichardAmes | 1:7962cd90f0b3 | 771 | else if (game.buttons.rightBtn()) |
RichardAmes | 1:7962cd90f0b3 | 772 | { |
RichardAmes | 1:7962cd90f0b3 | 773 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 774 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 775 | if (cursx < 21) |
RichardAmes | 1:7962cd90f0b3 | 776 | cursx++; |
RichardAmes | 1:7962cd90f0b3 | 777 | } |
RichardAmes | 1:7962cd90f0b3 | 778 | else |
RichardAmes | 1:7962cd90f0b3 | 779 | bdelay = 0; |
RichardAmes | 0:1c44c4ef1245 | 780 | if (game.buttons.released(BTN_A)) |
RichardAmes | 0:1c44c4ef1245 | 781 | if (place_state == PLACING) |
RichardAmes | 0:1c44c4ef1245 | 782 | { |
RichardAmes | 0:1c44c4ef1245 | 783 | place_state = NOT_SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 784 | ship[closest].state &= ~SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 785 | setOSC(&osc1,0,WTRI,400,255,500); |
RichardAmes | 0:1c44c4ef1245 | 786 | } |
RichardAmes | 0:1c44c4ef1245 | 787 | else |
RichardAmes | 0:1c44c4ef1245 | 788 | { |
RichardAmes | 1:7962cd90f0b3 | 789 | if ((cursx == 15) && (cursy == 15)) |
RichardAmes | 1:7962cd90f0b3 | 790 | { |
RichardAmes | 1:7962cd90f0b3 | 791 | cursx = 6; |
RichardAmes | 1:7962cd90f0b3 | 792 | cursy = 8; |
RichardAmes | 0:1c44c4ef1245 | 793 | game_state = ENGAGE; |
RichardAmes | 1:7962cd90f0b3 | 794 | } |
RichardAmes | 0:1c44c4ef1245 | 795 | else |
RichardAmes | 0:1c44c4ef1245 | 796 | { |
RichardAmes | 0:1c44c4ef1245 | 797 | snd.playTone(1, 400, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 798 | closest = closest_ship(cursx0(), cursy0()); |
RichardAmes | 0:1c44c4ef1245 | 799 | ship[closest].state |= SELECTED | DEPLOYING; |
RichardAmes | 0:1c44c4ef1245 | 800 | place_state = PLACING; |
RichardAmes | 0:1c44c4ef1245 | 801 | } |
RichardAmes | 0:1c44c4ef1245 | 802 | } |
RichardAmes | 0:1c44c4ef1245 | 803 | if (game.buttons.released(BTN_B)) |
RichardAmes | 0:1c44c4ef1245 | 804 | if (place_state == PLACING) |
RichardAmes | 0:1c44c4ef1245 | 805 | { |
RichardAmes | 0:1c44c4ef1245 | 806 | ship[closest].vert = 1 - ship[closest].vert; |
RichardAmes | 0:1c44c4ef1245 | 807 | snd.playTone(3, 100, 255, 100); |
RichardAmes | 0:1c44c4ef1245 | 808 | } |
RichardAmes | 0:1c44c4ef1245 | 809 | |
RichardAmes | 0:1c44c4ef1245 | 810 | game.display.setCursor(5, 5); |
RichardAmes | 0:1c44c4ef1245 | 811 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 812 | game.display.print("Deploy Ships"); |
RichardAmes | 1:7962cd90f0b3 | 813 | game.display.setCursor(5, 72); |
RichardAmes | 1:7962cd90f0b3 | 814 | game.display.print("A - Select"); |
RichardAmes | 1:7962cd90f0b3 | 815 | game.display.setCursor(5, 80); |
RichardAmes | 1:7962cd90f0b3 | 816 | game.display.print("B - Rotate"); |
RichardAmes | 0:1c44c4ef1245 | 817 | |
RichardAmes | 0:1c44c4ef1245 | 818 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 819 | |
RichardAmes | 0:1c44c4ef1245 | 820 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 821 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 822 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 823 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 824 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 825 | |
RichardAmes | 0:1c44c4ef1245 | 826 | flasher = flasher++ % MUXCOUNT; |
RichardAmes | 0:1c44c4ef1245 | 827 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 828 | { |
RichardAmes | 0:1c44c4ef1245 | 829 | if (ship[i].state & SELECTED) |
RichardAmes | 0:1c44c4ef1245 | 830 | { |
RichardAmes | 0:1c44c4ef1245 | 831 | ship[i].dest.x = cursx0(); |
RichardAmes | 0:1c44c4ef1245 | 832 | ship[i].dest.y = cursy0(); |
RichardAmes | 0:1c44c4ef1245 | 833 | } |
RichardAmes | 0:1c44c4ef1245 | 834 | pull_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 835 | if ((ship[i].state & DEPLOYING) && !(ship[i].state & SELECTED) && |
RichardAmes | 0:1c44c4ef1245 | 836 | (ship[i].now.x == ship[i].dest.x) && |
RichardAmes | 0:1c44c4ef1245 | 837 | (ship[i].now.y == ship[i].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 838 | ship[i].state &= ~DEPLOYING; |
RichardAmes | 0:1c44c4ef1245 | 839 | |
RichardAmes | 0:1c44c4ef1245 | 840 | if ((ship[i].state & SELECTED) && (flasher < MUXCOUNT / 2)) |
RichardAmes | 0:1c44c4ef1245 | 841 | ; |
RichardAmes | 0:1c44c4ef1245 | 842 | else |
RichardAmes | 1:7962cd90f0b3 | 843 | display_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 844 | } |
RichardAmes | 0:1c44c4ef1245 | 845 | |
RichardAmes | 0:1c44c4ef1245 | 846 | if (check_pgrid()) |
RichardAmes | 0:1c44c4ef1245 | 847 | { |
RichardAmes | 1:7962cd90f0b3 | 848 | game.display.setCursor(82, 72); |
RichardAmes | 0:1c44c4ef1245 | 849 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 850 | game.display.print("Done"); |
RichardAmes | 1:7962cd90f0b3 | 851 | game.display.drawRect(73, 72, 6, 7); |
RichardAmes | 0:1c44c4ef1245 | 852 | } |
RichardAmes | 0:1c44c4ef1245 | 853 | } |
RichardAmes | 0:1c44c4ef1245 | 854 | |
RichardAmes | 1:7962cd90f0b3 | 855 | /* Allow player to select target in computer grid */ |
RichardAmes | 0:1c44c4ef1245 | 856 | void engage_ships(void) |
RichardAmes | 0:1c44c4ef1245 | 857 | { |
RichardAmes | 0:1c44c4ef1245 | 858 | int m1x; |
RichardAmes | 0:1c44c4ef1245 | 859 | int m1y; |
RichardAmes | 0:1c44c4ef1245 | 860 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 861 | |
RichardAmes | 0:1c44c4ef1245 | 862 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 863 | |
RichardAmes | 0:1c44c4ef1245 | 864 | game.display.color = 10; |
RichardAmes | 1:7962cd90f0b3 | 865 | |
RichardAmes | 1:7962cd90f0b3 | 866 | if (game.buttons.upBtn()) |
RichardAmes | 1:7962cd90f0b3 | 867 | { |
RichardAmes | 1:7962cd90f0b3 | 868 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 869 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 870 | if (cursy >= 1) |
RichardAmes | 1:7962cd90f0b3 | 871 | cursy--; |
RichardAmes | 1:7962cd90f0b3 | 872 | } |
RichardAmes | 1:7962cd90f0b3 | 873 | else if (game.buttons.downBtn()) |
RichardAmes | 1:7962cd90f0b3 | 874 | { |
RichardAmes | 1:7962cd90f0b3 | 875 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 876 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 877 | if (cursy < 16) |
RichardAmes | 1:7962cd90f0b3 | 878 | cursy++; |
RichardAmes | 1:7962cd90f0b3 | 879 | } |
RichardAmes | 1:7962cd90f0b3 | 880 | else if (game.buttons.leftBtn()) |
RichardAmes | 1:7962cd90f0b3 | 881 | { |
RichardAmes | 1:7962cd90f0b3 | 882 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 883 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 884 | if (cursx >= 1) |
RichardAmes | 1:7962cd90f0b3 | 885 | cursx--; |
RichardAmes | 1:7962cd90f0b3 | 886 | } |
RichardAmes | 1:7962cd90f0b3 | 887 | else if (game.buttons.rightBtn()) |
RichardAmes | 1:7962cd90f0b3 | 888 | { |
RichardAmes | 1:7962cd90f0b3 | 889 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 890 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 891 | if (cursx < 21) |
RichardAmes | 1:7962cd90f0b3 | 892 | cursx++; |
RichardAmes | 1:7962cd90f0b3 | 893 | } |
RichardAmes | 1:7962cd90f0b3 | 894 | else |
RichardAmes | 1:7962cd90f0b3 | 895 | bdelay = 0; |
RichardAmes | 1:7962cd90f0b3 | 896 | |
RichardAmes | 0:1c44c4ef1245 | 897 | if (game.buttons.released(BTN_A)) |
RichardAmes | 0:1c44c4ef1245 | 898 | { |
RichardAmes | 0:1c44c4ef1245 | 899 | if (cursx >= 1 && cursx <= 10 && |
RichardAmes | 0:1c44c4ef1245 | 900 | cursy >= 4 && cursy <= 13) |
RichardAmes | 0:1c44c4ef1245 | 901 | { |
RichardAmes | 0:1c44c4ef1245 | 902 | snd.playTone(1, 200, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 903 | shipno = rand() % numships; |
RichardAmes | 0:1c44c4ef1245 | 904 | mx = ship[shipno].now.x; |
RichardAmes | 0:1c44c4ef1245 | 905 | my = ship[shipno].now.y; |
RichardAmes | 0:1c44c4ef1245 | 906 | |
RichardAmes | 0:1c44c4ef1245 | 907 | /* The goal here is to fly a parabolic arc from the selected */ |
RichardAmes | 0:1c44c4ef1245 | 908 | /* ship to the cursor position. This calculation might be */ |
RichardAmes | 0:1c44c4ef1245 | 909 | /* returning the wrong values for a nice parabola, but it works */ |
RichardAmes | 0:1c44c4ef1245 | 910 | m1x = cursx0(); |
RichardAmes | 0:1c44c4ef1245 | 911 | m1y = cursy0(); |
RichardAmes | 0:1c44c4ef1245 | 912 | a_num = m1y - my; |
RichardAmes | 0:1c44c4ef1245 | 913 | a_den = (m1x * m1x) - (mx * mx); |
RichardAmes | 0:1c44c4ef1245 | 914 | arc_c = m1y - ((a_num * m1x * m1x) / a_den); |
RichardAmes | 0:1c44c4ef1245 | 915 | game_state = FLY_MISSILE; |
RichardAmes | 0:1c44c4ef1245 | 916 | } |
RichardAmes | 0:1c44c4ef1245 | 917 | } |
RichardAmes | 0:1c44c4ef1245 | 918 | |
RichardAmes | 0:1c44c4ef1245 | 919 | game.display.setCursor(5, 5); |
RichardAmes | 0:1c44c4ef1245 | 920 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 921 | game.display.print("Select Target"); |
RichardAmes | 0:1c44c4ef1245 | 922 | |
RichardAmes | 0:1c44c4ef1245 | 923 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 924 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 925 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 926 | } |
RichardAmes | 0:1c44c4ef1245 | 927 | |
RichardAmes | 0:1c44c4ef1245 | 928 | void computer_plays(void) |
RichardAmes | 0:1c44c4ef1245 | 929 | { |
RichardAmes | 0:1c44c4ef1245 | 930 | int m1x; |
RichardAmes | 0:1c44c4ef1245 | 931 | int m1y; |
RichardAmes | 0:1c44c4ef1245 | 932 | |
RichardAmes | 0:1c44c4ef1245 | 933 | game.display.fillScreen(3); |
RichardAmes | 1:7962cd90f0b3 | 934 | |
RichardAmes | 1:7962cd90f0b3 | 935 | game.display.setCursor(5, 5); |
RichardAmes | 1:7962cd90f0b3 | 936 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 937 | game.display.print("Computer shoots"); |
RichardAmes | 1:7962cd90f0b3 | 938 | |
RichardAmes | 0:1c44c4ef1245 | 939 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 940 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 941 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 942 | |
RichardAmes | 1:7962cd90f0b3 | 943 | target_pgrid(); |
RichardAmes | 1:7962cd90f0b3 | 944 | snd.playTone(1, 200 + 10 * cursx, 255, 200); |
RichardAmes | 1:7962cd90f0b3 | 945 | computer_guessing++; |
RichardAmes | 1:7962cd90f0b3 | 946 | if (computer_guessing > 10) |
RichardAmes | 0:1c44c4ef1245 | 947 | { |
RichardAmes | 1:7962cd90f0b3 | 948 | snd.playTone(1, 200, 255, 200); |
RichardAmes | 1:7962cd90f0b3 | 949 | mx = 20; |
RichardAmes | 1:7962cd90f0b3 | 950 | my = 20; |
RichardAmes | 1:7962cd90f0b3 | 951 | m1x = cursx0(); |
RichardAmes | 1:7962cd90f0b3 | 952 | m1y = cursy0(); |
RichardAmes | 1:7962cd90f0b3 | 953 | a_num = m1y - my; |
RichardAmes | 1:7962cd90f0b3 | 954 | a_den = (m1x * m1x) - (mx * mx); |
RichardAmes | 1:7962cd90f0b3 | 955 | arc_c = m1y - ((a_num * m1x * m1x) / a_den); |
RichardAmes | 1:7962cd90f0b3 | 956 | computer_playing = 1; |
RichardAmes | 1:7962cd90f0b3 | 957 | game_state = FLY_MISSILE; |
RichardAmes | 0:1c44c4ef1245 | 958 | } |
RichardAmes | 0:1c44c4ef1245 | 959 | } |
RichardAmes | 0:1c44c4ef1245 | 960 | |
RichardAmes | 1:7962cd90f0b3 | 961 | /* Animate missile flying from source to target at cursor */ |
RichardAmes | 0:1c44c4ef1245 | 962 | void fly_missile(void) |
RichardAmes | 0:1c44c4ef1245 | 963 | { |
RichardAmes | 0:1c44c4ef1245 | 964 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 965 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 966 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 967 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 968 | if (computer_playing) |
RichardAmes | 0:1c44c4ef1245 | 969 | { |
RichardAmes | 0:1c44c4ef1245 | 970 | mx++; |
RichardAmes | 0:1c44c4ef1245 | 971 | if (mx >= cursx0()) |
RichardAmes | 0:1c44c4ef1245 | 972 | { |
RichardAmes | 0:1c44c4ef1245 | 973 | pgrid[cursx - 12][cursy - 4] |= GRID_SHOT; |
RichardAmes | 0:1c44c4ef1245 | 974 | cursx = oldx; |
RichardAmes | 0:1c44c4ef1245 | 975 | cursy = oldy; |
RichardAmes | 0:1c44c4ef1245 | 976 | computer_playing = 0; |
RichardAmes | 0:1c44c4ef1245 | 977 | /* How to set noise with playTone()? */ |
RichardAmes | 0:1c44c4ef1245 | 978 | setOSC(&osc1,1,4,400,255,500); |
RichardAmes | 1:7962cd90f0b3 | 979 | if (check_winner()) |
RichardAmes | 1:7962cd90f0b3 | 980 | game_state = WINNER; |
RichardAmes | 1:7962cd90f0b3 | 981 | else |
RichardAmes | 1:7962cd90f0b3 | 982 | game_state = ENGAGE; |
RichardAmes | 0:1c44c4ef1245 | 983 | } |
RichardAmes | 0:1c44c4ef1245 | 984 | } |
RichardAmes | 0:1c44c4ef1245 | 985 | else |
RichardAmes | 0:1c44c4ef1245 | 986 | { |
RichardAmes | 0:1c44c4ef1245 | 987 | mx--; |
RichardAmes | 0:1c44c4ef1245 | 988 | if (mx <= cursx0()) |
RichardAmes | 0:1c44c4ef1245 | 989 | { |
RichardAmes | 0:1c44c4ef1245 | 990 | cgrid[cursx - 1][cursy - 4] |= GRID_SHOT; |
RichardAmes | 0:1c44c4ef1245 | 991 | oldx = cursx; |
RichardAmes | 0:1c44c4ef1245 | 992 | oldy = cursy; |
RichardAmes | 0:1c44c4ef1245 | 993 | cursx = 12; |
RichardAmes | 0:1c44c4ef1245 | 994 | cursy = 4; |
RichardAmes | 0:1c44c4ef1245 | 995 | setOSC(&osc1,1,4,400,255,500); |
RichardAmes | 1:7962cd90f0b3 | 996 | computer_guessing = 0; |
RichardAmes | 1:7962cd90f0b3 | 997 | if (check_winner()) |
RichardAmes | 1:7962cd90f0b3 | 998 | game_state = WINNER; |
RichardAmes | 1:7962cd90f0b3 | 999 | else |
RichardAmes | 1:7962cd90f0b3 | 1000 | game_state = COMPUTER_PLAYS; |
RichardAmes | 0:1c44c4ef1245 | 1001 | } |
RichardAmes | 0:1c44c4ef1245 | 1002 | } |
RichardAmes | 0:1c44c4ef1245 | 1003 | my = (mx * mx * a_num) / a_den + arc_c; |
RichardAmes | 0:1c44c4ef1245 | 1004 | game.display.drawBitmap(mx, my, missile); |
RichardAmes | 0:1c44c4ef1245 | 1005 | } |
RichardAmes | 0:1c44c4ef1245 | 1006 | |
RichardAmes | 1:7962cd90f0b3 | 1007 | /* Display winner screen */ |
RichardAmes | 1:7962cd90f0b3 | 1008 | void winner(void) |
RichardAmes | 1:7962cd90f0b3 | 1009 | { |
RichardAmes | 1:7962cd90f0b3 | 1010 | game.display.fillScreen(3); |
RichardAmes | 1:7962cd90f0b3 | 1011 | show_cursor(); |
RichardAmes | 1:7962cd90f0b3 | 1012 | draw_cgrid(); |
RichardAmes | 1:7962cd90f0b3 | 1013 | draw_pgrid(); |
RichardAmes | 1:7962cd90f0b3 | 1014 | |
RichardAmes | 1:7962cd90f0b3 | 1015 | game.display.setCursor(5, 5); |
RichardAmes | 1:7962cd90f0b3 | 1016 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 1017 | if (check_winner() == 2) |
RichardAmes | 1:7962cd90f0b3 | 1018 | game.display.print("Computer Wins!"); |
RichardAmes | 1:7962cd90f0b3 | 1019 | else |
RichardAmes | 1:7962cd90f0b3 | 1020 | game.display.print("You Win!"); |
RichardAmes | 1:7962cd90f0b3 | 1021 | game.display.setCursor(5, 72); |
RichardAmes | 1:7962cd90f0b3 | 1022 | game.display.print("A to play again"); |
RichardAmes | 1:7962cd90f0b3 | 1023 | |
RichardAmes | 1:7962cd90f0b3 | 1024 | if (game.buttons.released(BTN_A)) |
RichardAmes | 1:7962cd90f0b3 | 1025 | { |
RichardAmes | 1:7962cd90f0b3 | 1026 | reset_game(); |
RichardAmes | 1:7962cd90f0b3 | 1027 | } |
RichardAmes | 1:7962cd90f0b3 | 1028 | } |
RichardAmes | 1:7962cd90f0b3 | 1029 | |
RichardAmes | 1:7962cd90f0b3 | 1030 | /* Main loop */ |
RichardAmes | 0:1c44c4ef1245 | 1031 | int main () |
RichardAmes | 0:1c44c4ef1245 | 1032 | { |
RichardAmes | 0:1c44c4ef1245 | 1033 | reset_game(); |
RichardAmes | 0:1c44c4ef1245 | 1034 | game.begin(); |
RichardAmes | 0:1c44c4ef1245 | 1035 | game.display.width = 110; |
RichardAmes | 0:1c44c4ef1245 | 1036 | game.display.height = 88; |
RichardAmes | 0:1c44c4ef1245 | 1037 | game.display.invisiblecolor = 14; |
RichardAmes | 0:1c44c4ef1245 | 1038 | game.display.bgcolor = 3; |
RichardAmes | 0:1c44c4ef1245 | 1039 | game.display.setFont(font5x7); |
RichardAmes | 0:1c44c4ef1245 | 1040 | srand(game.getTime()); |
RichardAmes | 0:1c44c4ef1245 | 1041 | |
RichardAmes | 0:1c44c4ef1245 | 1042 | game.display.loadRGBPalette(palettePico); |
RichardAmes | 0:1c44c4ef1245 | 1043 | game.setFrameRate(30); |
RichardAmes | 0:1c44c4ef1245 | 1044 | while (game.isRunning()) { |
RichardAmes | 1:7962cd90f0b3 | 1045 | // show_debug(); |
RichardAmes | 0:1c44c4ef1245 | 1046 | |
RichardAmes | 0:1c44c4ef1245 | 1047 | if (game.update()) { |
RichardAmes | 0:1c44c4ef1245 | 1048 | switch (game_state) |
RichardAmes | 0:1c44c4ef1245 | 1049 | { |
RichardAmes | 0:1c44c4ef1245 | 1050 | case SPLASH: |
RichardAmes | 0:1c44c4ef1245 | 1051 | splash_screen(); |
RichardAmes | 0:1c44c4ef1245 | 1052 | break; |
RichardAmes | 0:1c44c4ef1245 | 1053 | case SETUP: |
RichardAmes | 0:1c44c4ef1245 | 1054 | setup_game(); |
RichardAmes | 0:1c44c4ef1245 | 1055 | break; |
RichardAmes | 0:1c44c4ef1245 | 1056 | case PLACE: |
RichardAmes | 0:1c44c4ef1245 | 1057 | place_ships(); |
RichardAmes | 0:1c44c4ef1245 | 1058 | break; |
RichardAmes | 0:1c44c4ef1245 | 1059 | case ENGAGE: |
RichardAmes | 0:1c44c4ef1245 | 1060 | engage_ships(); |
RichardAmes | 0:1c44c4ef1245 | 1061 | break; |
RichardAmes | 0:1c44c4ef1245 | 1062 | case FLY_MISSILE: |
RichardAmes | 0:1c44c4ef1245 | 1063 | fly_missile(); |
RichardAmes | 0:1c44c4ef1245 | 1064 | break; |
RichardAmes | 0:1c44c4ef1245 | 1065 | case COMPUTER_PLAYS: |
RichardAmes | 0:1c44c4ef1245 | 1066 | computer_plays(); |
RichardAmes | 0:1c44c4ef1245 | 1067 | break; |
RichardAmes | 1:7962cd90f0b3 | 1068 | case WINNER: |
RichardAmes | 1:7962cd90f0b3 | 1069 | winner(); |
RichardAmes | 1:7962cd90f0b3 | 1070 | break; |
RichardAmes | 0:1c44c4ef1245 | 1071 | } |
RichardAmes | 0:1c44c4ef1245 | 1072 | } |
RichardAmes | 0:1c44c4ef1245 | 1073 | } |
RichardAmes | 1:7962cd90f0b3 | 1074 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 1075 | } |