Grid-based Pokitto game that challenges the player to deploy ships and then destroy the hidden ships of the computer.
main.cpp@1:7962cd90f0b3, 2018-01-02 (annotated)
- Committer:
- RichardAmes
- Date:
- Tue Jan 02 03:23:47 2018 +0000
- Revision:
- 1:7962cd90f0b3
- Parent:
- 0:1c44c4ef1245
- Child:
- 2:b96bb2a68c81
Added end game detection, now playable
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 | 0:1c44c4ef1245 | 223 | int debug1; |
RichardAmes | 0:1c44c4ef1245 | 224 | int debug2; |
RichardAmes | 0:1c44c4ef1245 | 225 | int mx; |
RichardAmes | 0:1c44c4ef1245 | 226 | int my; |
RichardAmes | 0:1c44c4ef1245 | 227 | int a_num; |
RichardAmes | 0:1c44c4ef1245 | 228 | int a_den; |
RichardAmes | 0:1c44c4ef1245 | 229 | int arc_c; |
RichardAmes | 0:1c44c4ef1245 | 230 | char pgrid[10][10]; |
RichardAmes | 0:1c44c4ef1245 | 231 | char cgrid[10][10]; |
RichardAmes | 0:1c44c4ef1245 | 232 | int computer_playing; |
RichardAmes | 1:7962cd90f0b3 | 233 | int computer_guessing; |
RichardAmes | 0:1c44c4ef1245 | 234 | int computerx; |
RichardAmes | 0:1c44c4ef1245 | 235 | int computery; |
RichardAmes | 0:1c44c4ef1245 | 236 | int oldx; |
RichardAmes | 0:1c44c4ef1245 | 237 | int oldy; |
RichardAmes | 1:7962cd90f0b3 | 238 | int bdelay; |
RichardAmes | 0:1c44c4ef1245 | 239 | |
RichardAmes | 0:1c44c4ef1245 | 240 | void show_debug(void) |
RichardAmes | 0:1c44c4ef1245 | 241 | { |
RichardAmes | 0:1c44c4ef1245 | 242 | game.display.setCursor(60, 80); |
RichardAmes | 0:1c44c4ef1245 | 243 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 244 | sprintf(str1, "%d %d", debug1, debug2); |
RichardAmes | 0:1c44c4ef1245 | 245 | game.display.print(str1); |
RichardAmes | 0:1c44c4ef1245 | 246 | } |
RichardAmes | 0:1c44c4ef1245 | 247 | |
RichardAmes | 0:1c44c4ef1245 | 248 | /* Convert from coarse grid to fine grid */ |
RichardAmes | 0:1c44c4ef1245 | 249 | int cursx0(void) |
RichardAmes | 0:1c44c4ef1245 | 250 | { |
RichardAmes | 0:1c44c4ef1245 | 251 | return cursx * 5 - 1; |
RichardAmes | 0:1c44c4ef1245 | 252 | } |
RichardAmes | 0:1c44c4ef1245 | 253 | |
RichardAmes | 0:1c44c4ef1245 | 254 | /* Convert from coarse grid to fine grid */ |
RichardAmes | 0:1c44c4ef1245 | 255 | int cursy0(void) |
RichardAmes | 0:1c44c4ef1245 | 256 | { |
RichardAmes | 0:1c44c4ef1245 | 257 | return cursy * 5 - 2; |
RichardAmes | 0:1c44c4ef1245 | 258 | } |
RichardAmes | 0:1c44c4ef1245 | 259 | |
RichardAmes | 1:7962cd90f0b3 | 260 | /* Show yellow box cursor */ |
RichardAmes | 0:1c44c4ef1245 | 261 | void show_cursor(void) |
RichardAmes | 0:1c44c4ef1245 | 262 | { |
RichardAmes | 0:1c44c4ef1245 | 263 | game.display.color = 10; |
RichardAmes | 0:1c44c4ef1245 | 264 | game.display.fillRectangle(cursx0(), cursy0(), 5, 5); |
RichardAmes | 0:1c44c4ef1245 | 265 | } |
RichardAmes | 0:1c44c4ef1245 | 266 | |
RichardAmes | 1:7962cd90f0b3 | 267 | /* Updated ship on screen. Could probably be rewritten as one case */ |
RichardAmes | 1:7962cd90f0b3 | 268 | void display_ship(int index) |
RichardAmes | 0:1c44c4ef1245 | 269 | { |
RichardAmes | 0:1c44c4ef1245 | 270 | switch (ship[index].type) |
RichardAmes | 0:1c44c4ef1245 | 271 | { |
RichardAmes | 0:1c44c4ef1245 | 272 | case DESTROYER: |
RichardAmes | 0:1c44c4ef1245 | 273 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 274 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship2); |
RichardAmes | 0:1c44c4ef1245 | 275 | else |
RichardAmes | 0:1c44c4ef1245 | 276 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship2v); |
RichardAmes | 0:1c44c4ef1245 | 277 | break; |
RichardAmes | 0:1c44c4ef1245 | 278 | case CRUISER: |
RichardAmes | 0:1c44c4ef1245 | 279 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 280 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship3); |
RichardAmes | 0:1c44c4ef1245 | 281 | else |
RichardAmes | 0:1c44c4ef1245 | 282 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship3v); |
RichardAmes | 0:1c44c4ef1245 | 283 | break; |
RichardAmes | 0:1c44c4ef1245 | 284 | case BATTLESHIP: |
RichardAmes | 0:1c44c4ef1245 | 285 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 286 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship4); |
RichardAmes | 0:1c44c4ef1245 | 287 | else |
RichardAmes | 0:1c44c4ef1245 | 288 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship4v); |
RichardAmes | 0:1c44c4ef1245 | 289 | break; |
RichardAmes | 0:1c44c4ef1245 | 290 | case CARRIER: |
RichardAmes | 0:1c44c4ef1245 | 291 | if (ship[index].vert == 0) |
RichardAmes | 0:1c44c4ef1245 | 292 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship5); |
RichardAmes | 0:1c44c4ef1245 | 293 | else |
RichardAmes | 0:1c44c4ef1245 | 294 | game.display.drawBitmap(ship[index].now.x, ship[index].now.y, ship5v); |
RichardAmes | 0:1c44c4ef1245 | 295 | break; |
RichardAmes | 0:1c44c4ef1245 | 296 | } |
RichardAmes | 0:1c44c4ef1245 | 297 | } |
RichardAmes | 0:1c44c4ef1245 | 298 | |
RichardAmes | 1:7962cd90f0b3 | 299 | /* Draw computer grid on display. Include hits and misses */ |
RichardAmes | 0:1c44c4ef1245 | 300 | void draw_cgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 301 | { |
RichardAmes | 0:1c44c4ef1245 | 302 | int i; |
RichardAmes | 0:1c44c4ef1245 | 303 | int j; |
RichardAmes | 0:1c44c4ef1245 | 304 | int checkval; |
RichardAmes | 0:1c44c4ef1245 | 305 | |
RichardAmes | 0:1c44c4ef1245 | 306 | game.display.color = 11; |
RichardAmes | 0:1c44c4ef1245 | 307 | /* Draw grid for computer's ships */ |
RichardAmes | 0:1c44c4ef1245 | 308 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 309 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 310 | { |
RichardAmes | 0:1c44c4ef1245 | 311 | game.display.fillRectangle(5 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 312 | checkval = cgrid[i][j] & (GRID_SHIP | GRID_SHOT); |
RichardAmes | 0:1c44c4ef1245 | 313 | if (checkval == (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 0:1c44c4ef1245 | 314 | game.display.drawBitmap(5 + i * 5, 19 + j * 5, missile); |
RichardAmes | 0:1c44c4ef1245 | 315 | else if (checkval == GRID_SHOT) |
RichardAmes | 0:1c44c4ef1245 | 316 | game.display.drawBitmap(5 + i * 5, 19 + j * 5, splash); |
RichardAmes | 0:1c44c4ef1245 | 317 | } |
RichardAmes | 0:1c44c4ef1245 | 318 | } |
RichardAmes | 0:1c44c4ef1245 | 319 | |
RichardAmes | 1:7962cd90f0b3 | 320 | /* Draw player grid on screen. Include hits and misses */ |
RichardAmes | 0:1c44c4ef1245 | 321 | void draw_pgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 322 | { |
RichardAmes | 0:1c44c4ef1245 | 323 | int i; |
RichardAmes | 0:1c44c4ef1245 | 324 | int j; |
RichardAmes | 0:1c44c4ef1245 | 325 | int checkval; |
RichardAmes | 0:1c44c4ef1245 | 326 | |
RichardAmes | 0:1c44c4ef1245 | 327 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 328 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 329 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 330 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 331 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 332 | |
RichardAmes | 0:1c44c4ef1245 | 333 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 334 | { |
RichardAmes | 1:7962cd90f0b3 | 335 | display_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 336 | } |
RichardAmes | 0:1c44c4ef1245 | 337 | |
RichardAmes | 0:1c44c4ef1245 | 338 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 339 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 340 | { |
RichardAmes | 0:1c44c4ef1245 | 341 | checkval = pgrid[i][j] & (GRID_SHIP | GRID_SHOT); |
RichardAmes | 0:1c44c4ef1245 | 342 | if (checkval == (GRID_SHIP | GRID_SHOT)) |
RichardAmes | 0:1c44c4ef1245 | 343 | game.display.drawBitmap(60 + i * 5, 19 + j * 5, missile); |
RichardAmes | 0:1c44c4ef1245 | 344 | else if (checkval == GRID_SHOT) |
RichardAmes | 0:1c44c4ef1245 | 345 | game.display.drawBitmap(60 + i * 5, 19 + j * 5, splash); |
RichardAmes | 0:1c44c4ef1245 | 346 | } |
RichardAmes | 0:1c44c4ef1245 | 347 | } |
RichardAmes | 0:1c44c4ef1245 | 348 | |
RichardAmes | 0:1c44c4ef1245 | 349 | /* Check if player's ships are inside grid. Return 1 if OK */ |
RichardAmes | 0:1c44c4ef1245 | 350 | int check_pgrid(void) |
RichardAmes | 0:1c44c4ef1245 | 351 | { |
RichardAmes | 0:1c44c4ef1245 | 352 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 353 | struct ship *s; |
RichardAmes | 0:1c44c4ef1245 | 354 | int endpoint; |
RichardAmes | 0:1c44c4ef1245 | 355 | int x; |
RichardAmes | 0:1c44c4ef1245 | 356 | int y; |
RichardAmes | 0:1c44c4ef1245 | 357 | int i; |
RichardAmes | 0:1c44c4ef1245 | 358 | |
RichardAmes | 0:1c44c4ef1245 | 359 | /* Clear player grid ship placement info */ |
RichardAmes | 0:1c44c4ef1245 | 360 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 0:1c44c4ef1245 | 361 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 0:1c44c4ef1245 | 362 | pgrid[x][y] &= ~GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 363 | |
RichardAmes | 0:1c44c4ef1245 | 364 | for (shipno = 0; shipno < numships; shipno++) |
RichardAmes | 0:1c44c4ef1245 | 365 | { |
RichardAmes | 1:7962cd90f0b3 | 366 | |
RichardAmes | 0:1c44c4ef1245 | 367 | s = &ship[shipno]; |
RichardAmes | 0:1c44c4ef1245 | 368 | /* Set up coarse coordinates */ |
RichardAmes | 0:1c44c4ef1245 | 369 | x = (s->now.x + 1) / 5; |
RichardAmes | 0:1c44c4ef1245 | 370 | y = (s->now.y + 2) / 5; |
RichardAmes | 0:1c44c4ef1245 | 371 | /* Check first end point */ |
RichardAmes | 0:1c44c4ef1245 | 372 | if ((x < 12) || (x > 21) || |
RichardAmes | 0:1c44c4ef1245 | 373 | (y < 4) || (y > 13)) |
RichardAmes | 0:1c44c4ef1245 | 374 | { |
RichardAmes | 0:1c44c4ef1245 | 375 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 376 | } |
RichardAmes | 0:1c44c4ef1245 | 377 | /* Check second end point */ |
RichardAmes | 0:1c44c4ef1245 | 378 | if (s->vert) |
RichardAmes | 0:1c44c4ef1245 | 379 | { |
RichardAmes | 0:1c44c4ef1245 | 380 | endpoint = y + shiplen[s->type] - 1; |
RichardAmes | 0:1c44c4ef1245 | 381 | if ((endpoint < 4) || (endpoint > 13)) |
RichardAmes | 0:1c44c4ef1245 | 382 | { |
RichardAmes | 0:1c44c4ef1245 | 383 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 384 | } |
RichardAmes | 0:1c44c4ef1245 | 385 | } |
RichardAmes | 0:1c44c4ef1245 | 386 | else |
RichardAmes | 0:1c44c4ef1245 | 387 | { |
RichardAmes | 0:1c44c4ef1245 | 388 | endpoint = x + shiplen[s->type] - 1; |
RichardAmes | 0:1c44c4ef1245 | 389 | if ((endpoint < 12) || (endpoint > 21)) |
RichardAmes | 0:1c44c4ef1245 | 390 | { |
RichardAmes | 0:1c44c4ef1245 | 391 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 392 | } |
RichardAmes | 0:1c44c4ef1245 | 393 | } |
RichardAmes | 0:1c44c4ef1245 | 394 | /* Convert to pgrid relative offsets */ |
RichardAmes | 0:1c44c4ef1245 | 395 | x = x - 12; |
RichardAmes | 0:1c44c4ef1245 | 396 | y = y - 4; |
RichardAmes | 0:1c44c4ef1245 | 397 | for (i = 0; i < shiplen[s->type]; i++) |
RichardAmes | 0:1c44c4ef1245 | 398 | if (s->vert) |
RichardAmes | 0:1c44c4ef1245 | 399 | if (pgrid[x][y + i] & GRID_SHIP) |
RichardAmes | 0:1c44c4ef1245 | 400 | { |
RichardAmes | 0:1c44c4ef1245 | 401 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 402 | } |
RichardAmes | 0:1c44c4ef1245 | 403 | else |
RichardAmes | 0:1c44c4ef1245 | 404 | pgrid[x][y + i] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 405 | else |
RichardAmes | 0:1c44c4ef1245 | 406 | if (pgrid[x + i][y] & GRID_SHIP) |
RichardAmes | 0:1c44c4ef1245 | 407 | { |
RichardAmes | 0:1c44c4ef1245 | 408 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 409 | } |
RichardAmes | 0:1c44c4ef1245 | 410 | else |
RichardAmes | 0:1c44c4ef1245 | 411 | pgrid[x + i][y] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 412 | } |
RichardAmes | 0:1c44c4ef1245 | 413 | return 1; |
RichardAmes | 0:1c44c4ef1245 | 414 | } |
RichardAmes | 0:1c44c4ef1245 | 415 | |
RichardAmes | 1:7962cd90f0b3 | 416 | /* Randomly place ships in computer grid, clear player grid */ |
RichardAmes | 1:7962cd90f0b3 | 417 | void fill_grids(void) |
RichardAmes | 0:1c44c4ef1245 | 418 | { |
RichardAmes | 0:1c44c4ef1245 | 419 | int x; |
RichardAmes | 0:1c44c4ef1245 | 420 | int y; |
RichardAmes | 0:1c44c4ef1245 | 421 | int len; |
RichardAmes | 0:1c44c4ef1245 | 422 | int dir; |
RichardAmes | 0:1c44c4ef1245 | 423 | int i; |
RichardAmes | 0:1c44c4ef1245 | 424 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 425 | int inplace; |
RichardAmes | 0:1c44c4ef1245 | 426 | |
RichardAmes | 0:1c44c4ef1245 | 427 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 0:1c44c4ef1245 | 428 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 429 | { |
RichardAmes | 0:1c44c4ef1245 | 430 | cgrid[x][y] = 0; |
RichardAmes | 1:7962cd90f0b3 | 431 | pgrid[x][y] = 0; |
RichardAmes | 1:7962cd90f0b3 | 432 | } |
RichardAmes | 1:7962cd90f0b3 | 433 | |
RichardAmes | 1:7962cd90f0b3 | 434 | for (shipno = 0; shipno < sizeof(shipinfo) / sizeof(int); ) |
RichardAmes | 0:1c44c4ef1245 | 435 | { |
RichardAmes | 0:1c44c4ef1245 | 436 | x = rand() % 10; |
RichardAmes | 0:1c44c4ef1245 | 437 | y = rand() % 10; |
RichardAmes | 0:1c44c4ef1245 | 438 | dir = rand() % 2; |
RichardAmes | 0:1c44c4ef1245 | 439 | len = shipinfo[shipno]; |
RichardAmes | 0:1c44c4ef1245 | 440 | |
RichardAmes | 1:7962cd90f0b3 | 441 | if ((dir == 0) && (x + len < GRID_SIZE)) |
RichardAmes | 0:1c44c4ef1245 | 442 | { |
RichardAmes | 0:1c44c4ef1245 | 443 | inplace = 0; |
RichardAmes | 0:1c44c4ef1245 | 444 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 445 | inplace += cgrid[x + i][y] & GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 446 | if (inplace == 0) |
RichardAmes | 0:1c44c4ef1245 | 447 | { |
RichardAmes | 0:1c44c4ef1245 | 448 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 449 | cgrid[x + i][y] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 450 | shipno++; |
RichardAmes | 0:1c44c4ef1245 | 451 | } |
RichardAmes | 0:1c44c4ef1245 | 452 | } |
RichardAmes | 1:7962cd90f0b3 | 453 | else if (y + len < GRID_SIZE) |
RichardAmes | 0:1c44c4ef1245 | 454 | { |
RichardAmes | 0:1c44c4ef1245 | 455 | inplace = 0; |
RichardAmes | 0:1c44c4ef1245 | 456 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 457 | inplace += cgrid[x][y + i] & GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 458 | if (inplace == 0) |
RichardAmes | 0:1c44c4ef1245 | 459 | { |
RichardAmes | 0:1c44c4ef1245 | 460 | for (i = 0; i < len; i++) |
RichardAmes | 0:1c44c4ef1245 | 461 | cgrid[x][y + i] |= GRID_SHIP; |
RichardAmes | 0:1c44c4ef1245 | 462 | shipno++; |
RichardAmes | 0:1c44c4ef1245 | 463 | } |
RichardAmes | 0:1c44c4ef1245 | 464 | } |
RichardAmes | 0:1c44c4ef1245 | 465 | } |
RichardAmes | 1:7962cd90f0b3 | 466 | } |
RichardAmes | 1:7962cd90f0b3 | 467 | |
RichardAmes | 1:7962cd90f0b3 | 468 | /* Indicate if gridpoint is next to hit */ |
RichardAmes | 1:7962cd90f0b3 | 469 | int next_to_hit(int x, int y) |
RichardAmes | 1:7962cd90f0b3 | 470 | { |
RichardAmes | 1:7962cd90f0b3 | 471 | int i; |
RichardAmes | 1:7962cd90f0b3 | 472 | int j; |
RichardAmes | 1:7962cd90f0b3 | 473 | |
RichardAmes | 1:7962cd90f0b3 | 474 | for (i = -1; i <= 1; i++) |
RichardAmes | 1:7962cd90f0b3 | 475 | for (j = -1; j <= 1; j++) |
RichardAmes | 1:7962cd90f0b3 | 476 | if ((x + i >= 0) && (x + i < GRID_SIZE) && |
RichardAmes | 1:7962cd90f0b3 | 477 | (j + i >= 0) && (j + i < GRID_SIZE) && |
RichardAmes | 1:7962cd90f0b3 | 478 | ((pgrid[i][j] & (GRID_SHIP | GRID_SHOT)) == |
RichardAmes | 1:7962cd90f0b3 | 479 | GRID_SHIP | GRID_SHOT)) |
RichardAmes | 1:7962cd90f0b3 | 480 | return 1; |
RichardAmes | 1:7962cd90f0b3 | 481 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 482 | } |
RichardAmes | 0:1c44c4ef1245 | 483 | |
RichardAmes | 1:7962cd90f0b3 | 484 | /* Computer selects target. TODO: more sophisticated logic. Can experiment */ |
RichardAmes | 1:7962cd90f0b3 | 485 | /* with retries. Sets cursx and cursy */ |
RichardAmes | 1:7962cd90f0b3 | 486 | void target_pgrid(void) |
RichardAmes | 1:7962cd90f0b3 | 487 | { |
RichardAmes | 1:7962cd90f0b3 | 488 | int x; |
RichardAmes | 1:7962cd90f0b3 | 489 | int y; |
RichardAmes | 1:7962cd90f0b3 | 490 | int retries; |
RichardAmes | 1:7962cd90f0b3 | 491 | |
RichardAmes | 1:7962cd90f0b3 | 492 | do |
RichardAmes | 1:7962cd90f0b3 | 493 | { |
RichardAmes | 1:7962cd90f0b3 | 494 | retries = 0; |
RichardAmes | 1:7962cd90f0b3 | 495 | do |
RichardAmes | 1:7962cd90f0b3 | 496 | { |
RichardAmes | 1:7962cd90f0b3 | 497 | x = rand() % GRID_SIZE; |
RichardAmes | 1:7962cd90f0b3 | 498 | y = rand() % GRID_SIZE; |
RichardAmes | 1:7962cd90f0b3 | 499 | } |
RichardAmes | 1:7962cd90f0b3 | 500 | while (pgrid[x][y] & GRID_SHOT); |
RichardAmes | 1:7962cd90f0b3 | 501 | } |
RichardAmes | 1:7962cd90f0b3 | 502 | while (!next_to_hit(x, y) && (retries++ < 16)); |
RichardAmes | 1:7962cd90f0b3 | 503 | cursx = x + 12; |
RichardAmes | 1:7962cd90f0b3 | 504 | cursy = y + 4; |
RichardAmes | 1:7962cd90f0b3 | 505 | } |
RichardAmes | 1:7962cd90f0b3 | 506 | |
RichardAmes | 1:7962cd90f0b3 | 507 | /* Check for winner. Returns 0 - none, 1 - computer, 2 - player */ |
RichardAmes | 1:7962cd90f0b3 | 508 | int check_winner(void) |
RichardAmes | 1:7962cd90f0b3 | 509 | { |
RichardAmes | 1:7962cd90f0b3 | 510 | int x; |
RichardAmes | 1:7962cd90f0b3 | 511 | int y; |
RichardAmes | 1:7962cd90f0b3 | 512 | int misses; |
RichardAmes | 1:7962cd90f0b3 | 513 | |
RichardAmes | 1:7962cd90f0b3 | 514 | misses = 0; |
RichardAmes | 1:7962cd90f0b3 | 515 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 1:7962cd90f0b3 | 516 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 517 | { |
RichardAmes | 1:7962cd90f0b3 | 518 | if (cgrid[x][y] & GRID_SHIP) |
RichardAmes | 1:7962cd90f0b3 | 519 | { |
RichardAmes | 1:7962cd90f0b3 | 520 | if (!(cgrid[x][y] & GRID_SHOT)) |
RichardAmes | 1:7962cd90f0b3 | 521 | misses++; |
RichardAmes | 1:7962cd90f0b3 | 522 | } |
RichardAmes | 1:7962cd90f0b3 | 523 | } |
RichardAmes | 1:7962cd90f0b3 | 524 | if (misses == 0) |
RichardAmes | 1:7962cd90f0b3 | 525 | return 1; |
RichardAmes | 1:7962cd90f0b3 | 526 | |
RichardAmes | 1:7962cd90f0b3 | 527 | misses = 0; |
RichardAmes | 1:7962cd90f0b3 | 528 | for (x = 0; x < GRID_SIZE; x++) |
RichardAmes | 1:7962cd90f0b3 | 529 | for (y = 0; y < GRID_SIZE; y++) |
RichardAmes | 1:7962cd90f0b3 | 530 | { |
RichardAmes | 1:7962cd90f0b3 | 531 | if (pgrid[x][y] & GRID_SHIP) |
RichardAmes | 1:7962cd90f0b3 | 532 | { |
RichardAmes | 1:7962cd90f0b3 | 533 | if (!(pgrid[x][y] & GRID_SHOT)) |
RichardAmes | 1:7962cd90f0b3 | 534 | misses++; |
RichardAmes | 1:7962cd90f0b3 | 535 | } |
RichardAmes | 1:7962cd90f0b3 | 536 | } |
RichardAmes | 1:7962cd90f0b3 | 537 | if (misses == 0) |
RichardAmes | 1:7962cd90f0b3 | 538 | return 2; |
RichardAmes | 1:7962cd90f0b3 | 539 | |
RichardAmes | 1:7962cd90f0b3 | 540 | return 0; |
RichardAmes | 1:7962cd90f0b3 | 541 | } |
RichardAmes | 1:7962cd90f0b3 | 542 | |
RichardAmes | 1:7962cd90f0b3 | 543 | /* Initialize globals so game can be restarted */ |
RichardAmes | 0:1c44c4ef1245 | 544 | void reset_game(void) |
RichardAmes | 0:1c44c4ef1245 | 545 | { |
RichardAmes | 0:1c44c4ef1245 | 546 | int sn; |
RichardAmes | 0:1c44c4ef1245 | 547 | |
RichardAmes | 0:1c44c4ef1245 | 548 | game_state = SPLASH; |
RichardAmes | 0:1c44c4ef1245 | 549 | place_state = NOT_SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 550 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 0:1c44c4ef1245 | 551 | { |
RichardAmes | 1:7962cd90f0b3 | 552 | ship[sn].vert = 0; |
RichardAmes | 0:1c44c4ef1245 | 553 | ship[sn].now.x = 55; |
RichardAmes | 0:1c44c4ef1245 | 554 | ship[sn].now.y = 0; |
RichardAmes | 0:1c44c4ef1245 | 555 | ship[sn].dest.x = ship[sn].home.x; |
RichardAmes | 0:1c44c4ef1245 | 556 | ship[sn].dest.y = ship[sn].home.y; |
RichardAmes | 0:1c44c4ef1245 | 557 | } |
RichardAmes | 0:1c44c4ef1245 | 558 | state_ctr = 0; |
RichardAmes | 0:1c44c4ef1245 | 559 | cursx = 5; |
RichardAmes | 0:1c44c4ef1245 | 560 | cursy = 5; |
RichardAmes | 1:7962cd90f0b3 | 561 | fill_grids(); |
RichardAmes | 0:1c44c4ef1245 | 562 | } |
RichardAmes | 0:1c44c4ef1245 | 563 | |
RichardAmes | 1:7962cd90f0b3 | 564 | /* Display splash screen */ |
RichardAmes | 0:1c44c4ef1245 | 565 | void splash_screen(void) |
RichardAmes | 0:1c44c4ef1245 | 566 | { |
RichardAmes | 0:1c44c4ef1245 | 567 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 568 | game.display.setCursor(10, 10); |
RichardAmes | 0:1c44c4ef1245 | 569 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 570 | game.display.print("Naval Battle"); |
RichardAmes | 0:1c44c4ef1245 | 571 | state_ctr++; |
RichardAmes | 0:1c44c4ef1245 | 572 | if (state_ctr > 30) |
RichardAmes | 0:1c44c4ef1245 | 573 | game_state = SETUP; |
RichardAmes | 0:1c44c4ef1245 | 574 | } |
RichardAmes | 0:1c44c4ef1245 | 575 | |
RichardAmes | 1:7962cd90f0b3 | 576 | /* Find ship closest to cursor, returns index of ship */ |
RichardAmes | 0:1c44c4ef1245 | 577 | int closest_ship(int x, int y) |
RichardAmes | 0:1c44c4ef1245 | 578 | { |
RichardAmes | 0:1c44c4ef1245 | 579 | int i; |
RichardAmes | 0:1c44c4ef1245 | 580 | int pole_value; |
RichardAmes | 0:1c44c4ef1245 | 581 | int distance; |
RichardAmes | 0:1c44c4ef1245 | 582 | int closest; |
RichardAmes | 0:1c44c4ef1245 | 583 | |
RichardAmes | 0:1c44c4ef1245 | 584 | closest = 0; |
RichardAmes | 0:1c44c4ef1245 | 585 | pole_value = 10000; |
RichardAmes | 0:1c44c4ef1245 | 586 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 587 | { |
RichardAmes | 0:1c44c4ef1245 | 588 | distance = (ship[i].now.x - x) * (ship[i].now.x - x) + |
RichardAmes | 0:1c44c4ef1245 | 589 | (ship[i].now.y - y) * (ship[i].now.y - y); |
RichardAmes | 0:1c44c4ef1245 | 590 | if (distance < pole_value) |
RichardAmes | 0:1c44c4ef1245 | 591 | { |
RichardAmes | 0:1c44c4ef1245 | 592 | pole_value = distance; |
RichardAmes | 0:1c44c4ef1245 | 593 | closest = i; |
RichardAmes | 0:1c44c4ef1245 | 594 | } |
RichardAmes | 0:1c44c4ef1245 | 595 | } |
RichardAmes | 0:1c44c4ef1245 | 596 | return closest; |
RichardAmes | 0:1c44c4ef1245 | 597 | } |
RichardAmes | 0:1c44c4ef1245 | 598 | |
RichardAmes | 1:7962cd90f0b3 | 599 | /* Pull ship in the direction of the cursor */ |
RichardAmes | 0:1c44c4ef1245 | 600 | void pull_ship(int s) |
RichardAmes | 0:1c44c4ef1245 | 601 | { |
RichardAmes | 0:1c44c4ef1245 | 602 | int i; |
RichardAmes | 0:1c44c4ef1245 | 603 | int closest; |
RichardAmes | 0:1c44c4ef1245 | 604 | int pole_value; |
RichardAmes | 0:1c44c4ef1245 | 605 | int dx; |
RichardAmes | 0:1c44c4ef1245 | 606 | int dy; |
RichardAmes | 0:1c44c4ef1245 | 607 | int distance; |
RichardAmes | 0:1c44c4ef1245 | 608 | |
RichardAmes | 0:1c44c4ef1245 | 609 | if ((ship[s].now.x != ship[s].dest.x) || |
RichardAmes | 0:1c44c4ef1245 | 610 | (ship[s].now.y != ship[s].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 611 | { |
RichardAmes | 0:1c44c4ef1245 | 612 | closest = 0; |
RichardAmes | 0:1c44c4ef1245 | 613 | pole_value = 10000; |
RichardAmes | 0:1c44c4ef1245 | 614 | for (i = 0; i < 8; i++) |
RichardAmes | 0:1c44c4ef1245 | 615 | { |
RichardAmes | 0:1c44c4ef1245 | 616 | dx = ship[s].now.x + budge[i].x - ship[s].dest.x; |
RichardAmes | 0:1c44c4ef1245 | 617 | dy = ship[s].now.y + budge[i].y - ship[s].dest.y; |
RichardAmes | 0:1c44c4ef1245 | 618 | distance = dx * dx + dy * dy; |
RichardAmes | 0:1c44c4ef1245 | 619 | if (distance < pole_value) |
RichardAmes | 0:1c44c4ef1245 | 620 | { |
RichardAmes | 0:1c44c4ef1245 | 621 | pole_value = distance; |
RichardAmes | 0:1c44c4ef1245 | 622 | closest = i; |
RichardAmes | 0:1c44c4ef1245 | 623 | } |
RichardAmes | 0:1c44c4ef1245 | 624 | } |
RichardAmes | 0:1c44c4ef1245 | 625 | ship[s].now.x += budge[closest].x; |
RichardAmes | 0:1c44c4ef1245 | 626 | ship[s].now.y += budge[closest].y; |
RichardAmes | 0:1c44c4ef1245 | 627 | } |
RichardAmes | 0:1c44c4ef1245 | 628 | } |
RichardAmes | 0:1c44c4ef1245 | 629 | |
RichardAmes | 1:7962cd90f0b3 | 630 | /* Draw initial game state, with ships ready to be deployed */ |
RichardAmes | 0:1c44c4ef1245 | 631 | void setup_game(void) |
RichardAmes | 0:1c44c4ef1245 | 632 | { |
RichardAmes | 0:1c44c4ef1245 | 633 | int i; |
RichardAmes | 0:1c44c4ef1245 | 634 | int j; |
RichardAmes | 0:1c44c4ef1245 | 635 | int in_motion; |
RichardAmes | 0:1c44c4ef1245 | 636 | int sn; |
RichardAmes | 0:1c44c4ef1245 | 637 | |
RichardAmes | 0:1c44c4ef1245 | 638 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 639 | |
RichardAmes | 0:1c44c4ef1245 | 640 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 641 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 642 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 643 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 644 | |
RichardAmes | 0:1c44c4ef1245 | 645 | in_motion = 0; |
RichardAmes | 0:1c44c4ef1245 | 646 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 0:1c44c4ef1245 | 647 | if ((ship[sn].now.x != ship[sn].dest.x) || |
RichardAmes | 0:1c44c4ef1245 | 648 | (ship[sn].now.y != ship[sn].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 649 | { |
RichardAmes | 0:1c44c4ef1245 | 650 | snd.playTone(1, 33+3*sn, 255, 1, 0); |
RichardAmes | 0:1c44c4ef1245 | 651 | for (i = 0; i < 3; i++) |
RichardAmes | 0:1c44c4ef1245 | 652 | pull_ship(sn); |
RichardAmes | 0:1c44c4ef1245 | 653 | in_motion = 1; |
RichardAmes | 0:1c44c4ef1245 | 654 | break; |
RichardAmes | 0:1c44c4ef1245 | 655 | } |
RichardAmes | 0:1c44c4ef1245 | 656 | for (sn = 0; sn < numships; sn++) |
RichardAmes | 1:7962cd90f0b3 | 657 | display_ship(sn); |
RichardAmes | 0:1c44c4ef1245 | 658 | if (!in_motion) |
RichardAmes | 0:1c44c4ef1245 | 659 | { |
RichardAmes | 0:1c44c4ef1245 | 660 | snd.playTone(1, 400, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 661 | game_state = PLACE; |
RichardAmes | 0:1c44c4ef1245 | 662 | } |
RichardAmes | 0:1c44c4ef1245 | 663 | } |
RichardAmes | 0:1c44c4ef1245 | 664 | |
RichardAmes | 1:7962cd90f0b3 | 665 | /* Allow player to play ships in player grid */ |
RichardAmes | 0:1c44c4ef1245 | 666 | void place_ships(void) |
RichardAmes | 0:1c44c4ef1245 | 667 | { |
RichardAmes | 0:1c44c4ef1245 | 668 | int i; |
RichardAmes | 0:1c44c4ef1245 | 669 | int j; |
RichardAmes | 0:1c44c4ef1245 | 670 | static int flasher; |
RichardAmes | 0:1c44c4ef1245 | 671 | static int closest; |
RichardAmes | 0:1c44c4ef1245 | 672 | flasher++; |
RichardAmes | 0:1c44c4ef1245 | 673 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 674 | |
RichardAmes | 0:1c44c4ef1245 | 675 | game.display.color = 10; |
RichardAmes | 0:1c44c4ef1245 | 676 | |
RichardAmes | 1:7962cd90f0b3 | 677 | if (game.buttons.upBtn()) |
RichardAmes | 1:7962cd90f0b3 | 678 | { |
RichardAmes | 1:7962cd90f0b3 | 679 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 680 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 681 | if (cursy >= 1) |
RichardAmes | 1:7962cd90f0b3 | 682 | cursy--; |
RichardAmes | 1:7962cd90f0b3 | 683 | } |
RichardAmes | 1:7962cd90f0b3 | 684 | else if (game.buttons.downBtn()) |
RichardAmes | 1:7962cd90f0b3 | 685 | { |
RichardAmes | 1:7962cd90f0b3 | 686 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 687 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 688 | if (cursy < 16) |
RichardAmes | 1:7962cd90f0b3 | 689 | cursy++; |
RichardAmes | 1:7962cd90f0b3 | 690 | } |
RichardAmes | 1:7962cd90f0b3 | 691 | else if (game.buttons.leftBtn()) |
RichardAmes | 1:7962cd90f0b3 | 692 | { |
RichardAmes | 1:7962cd90f0b3 | 693 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 694 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 695 | if (cursx >= 1) |
RichardAmes | 1:7962cd90f0b3 | 696 | cursx--; |
RichardAmes | 1:7962cd90f0b3 | 697 | } |
RichardAmes | 1:7962cd90f0b3 | 698 | else if (game.buttons.rightBtn()) |
RichardAmes | 1:7962cd90f0b3 | 699 | { |
RichardAmes | 1:7962cd90f0b3 | 700 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 701 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 702 | if (cursx < 21) |
RichardAmes | 1:7962cd90f0b3 | 703 | cursx++; |
RichardAmes | 1:7962cd90f0b3 | 704 | } |
RichardAmes | 1:7962cd90f0b3 | 705 | else |
RichardAmes | 1:7962cd90f0b3 | 706 | bdelay = 0; |
RichardAmes | 0:1c44c4ef1245 | 707 | if (game.buttons.released(BTN_A)) |
RichardAmes | 0:1c44c4ef1245 | 708 | if (place_state == PLACING) |
RichardAmes | 0:1c44c4ef1245 | 709 | { |
RichardAmes | 0:1c44c4ef1245 | 710 | place_state = NOT_SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 711 | ship[closest].state &= ~SELECTED; |
RichardAmes | 0:1c44c4ef1245 | 712 | setOSC(&osc1,0,WTRI,400,255,500); |
RichardAmes | 0:1c44c4ef1245 | 713 | } |
RichardAmes | 0:1c44c4ef1245 | 714 | else |
RichardAmes | 0:1c44c4ef1245 | 715 | { |
RichardAmes | 1:7962cd90f0b3 | 716 | if ((cursx == 15) && (cursy == 15)) |
RichardAmes | 1:7962cd90f0b3 | 717 | { |
RichardAmes | 1:7962cd90f0b3 | 718 | cursx = 6; |
RichardAmes | 1:7962cd90f0b3 | 719 | cursy = 8; |
RichardAmes | 0:1c44c4ef1245 | 720 | game_state = ENGAGE; |
RichardAmes | 1:7962cd90f0b3 | 721 | } |
RichardAmes | 0:1c44c4ef1245 | 722 | else |
RichardAmes | 0:1c44c4ef1245 | 723 | { |
RichardAmes | 0:1c44c4ef1245 | 724 | snd.playTone(1, 400, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 725 | closest = closest_ship(cursx0(), cursy0()); |
RichardAmes | 0:1c44c4ef1245 | 726 | ship[closest].state |= SELECTED | DEPLOYING; |
RichardAmes | 0:1c44c4ef1245 | 727 | place_state = PLACING; |
RichardAmes | 0:1c44c4ef1245 | 728 | } |
RichardAmes | 0:1c44c4ef1245 | 729 | } |
RichardAmes | 0:1c44c4ef1245 | 730 | if (game.buttons.released(BTN_B)) |
RichardAmes | 0:1c44c4ef1245 | 731 | if (place_state == PLACING) |
RichardAmes | 0:1c44c4ef1245 | 732 | { |
RichardAmes | 0:1c44c4ef1245 | 733 | ship[closest].vert = 1 - ship[closest].vert; |
RichardAmes | 0:1c44c4ef1245 | 734 | snd.playTone(3, 100, 255, 100); |
RichardAmes | 0:1c44c4ef1245 | 735 | } |
RichardAmes | 0:1c44c4ef1245 | 736 | |
RichardAmes | 0:1c44c4ef1245 | 737 | game.display.setCursor(5, 5); |
RichardAmes | 0:1c44c4ef1245 | 738 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 739 | game.display.print("Deploy Ships"); |
RichardAmes | 1:7962cd90f0b3 | 740 | game.display.setCursor(5, 72); |
RichardAmes | 1:7962cd90f0b3 | 741 | game.display.print("A - Select"); |
RichardAmes | 1:7962cd90f0b3 | 742 | game.display.setCursor(5, 80); |
RichardAmes | 1:7962cd90f0b3 | 743 | game.display.print("B - Rotate"); |
RichardAmes | 0:1c44c4ef1245 | 744 | |
RichardAmes | 0:1c44c4ef1245 | 745 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 746 | |
RichardAmes | 0:1c44c4ef1245 | 747 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 748 | /* Draw grid for ship placement */ |
RichardAmes | 0:1c44c4ef1245 | 749 | for (j = 0; j < 10; j++) |
RichardAmes | 0:1c44c4ef1245 | 750 | for (i = 0; i < 10; i++) |
RichardAmes | 0:1c44c4ef1245 | 751 | game.display.fillRectangle(60 + i * 5, 19 + j * 5, 3, 3); |
RichardAmes | 0:1c44c4ef1245 | 752 | |
RichardAmes | 0:1c44c4ef1245 | 753 | flasher = flasher++ % MUXCOUNT; |
RichardAmes | 0:1c44c4ef1245 | 754 | for (i = 0; i < numships; i++) |
RichardAmes | 0:1c44c4ef1245 | 755 | { |
RichardAmes | 0:1c44c4ef1245 | 756 | if (ship[i].state & SELECTED) |
RichardAmes | 0:1c44c4ef1245 | 757 | { |
RichardAmes | 0:1c44c4ef1245 | 758 | ship[i].dest.x = cursx0(); |
RichardAmes | 0:1c44c4ef1245 | 759 | ship[i].dest.y = cursy0(); |
RichardAmes | 0:1c44c4ef1245 | 760 | } |
RichardAmes | 0:1c44c4ef1245 | 761 | pull_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 762 | if ((ship[i].state & DEPLOYING) && !(ship[i].state & SELECTED) && |
RichardAmes | 0:1c44c4ef1245 | 763 | (ship[i].now.x == ship[i].dest.x) && |
RichardAmes | 0:1c44c4ef1245 | 764 | (ship[i].now.y == ship[i].dest.y)) |
RichardAmes | 0:1c44c4ef1245 | 765 | ship[i].state &= ~DEPLOYING; |
RichardAmes | 0:1c44c4ef1245 | 766 | |
RichardAmes | 0:1c44c4ef1245 | 767 | if ((ship[i].state & SELECTED) && (flasher < MUXCOUNT / 2)) |
RichardAmes | 0:1c44c4ef1245 | 768 | ; |
RichardAmes | 0:1c44c4ef1245 | 769 | else |
RichardAmes | 1:7962cd90f0b3 | 770 | display_ship(i); |
RichardAmes | 0:1c44c4ef1245 | 771 | } |
RichardAmes | 0:1c44c4ef1245 | 772 | |
RichardAmes | 0:1c44c4ef1245 | 773 | if (check_pgrid()) |
RichardAmes | 0:1c44c4ef1245 | 774 | { |
RichardAmes | 1:7962cd90f0b3 | 775 | game.display.setCursor(82, 72); |
RichardAmes | 0:1c44c4ef1245 | 776 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 777 | game.display.print("Done"); |
RichardAmes | 1:7962cd90f0b3 | 778 | game.display.drawRect(73, 72, 6, 7); |
RichardAmes | 0:1c44c4ef1245 | 779 | } |
RichardAmes | 0:1c44c4ef1245 | 780 | } |
RichardAmes | 0:1c44c4ef1245 | 781 | |
RichardAmes | 1:7962cd90f0b3 | 782 | /* Allow player to select target in computer grid */ |
RichardAmes | 0:1c44c4ef1245 | 783 | void engage_ships(void) |
RichardAmes | 0:1c44c4ef1245 | 784 | { |
RichardAmes | 0:1c44c4ef1245 | 785 | int m1x; |
RichardAmes | 0:1c44c4ef1245 | 786 | int m1y; |
RichardAmes | 0:1c44c4ef1245 | 787 | int shipno; |
RichardAmes | 0:1c44c4ef1245 | 788 | |
RichardAmes | 0:1c44c4ef1245 | 789 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 790 | |
RichardAmes | 0:1c44c4ef1245 | 791 | game.display.color = 10; |
RichardAmes | 1:7962cd90f0b3 | 792 | |
RichardAmes | 1:7962cd90f0b3 | 793 | if (game.buttons.upBtn()) |
RichardAmes | 1:7962cd90f0b3 | 794 | { |
RichardAmes | 1:7962cd90f0b3 | 795 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 796 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 797 | if (cursy >= 1) |
RichardAmes | 1:7962cd90f0b3 | 798 | cursy--; |
RichardAmes | 1:7962cd90f0b3 | 799 | } |
RichardAmes | 1:7962cd90f0b3 | 800 | else if (game.buttons.downBtn()) |
RichardAmes | 1:7962cd90f0b3 | 801 | { |
RichardAmes | 1:7962cd90f0b3 | 802 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 803 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 804 | if (cursy < 16) |
RichardAmes | 1:7962cd90f0b3 | 805 | cursy++; |
RichardAmes | 1:7962cd90f0b3 | 806 | } |
RichardAmes | 1:7962cd90f0b3 | 807 | else if (game.buttons.leftBtn()) |
RichardAmes | 1:7962cd90f0b3 | 808 | { |
RichardAmes | 1:7962cd90f0b3 | 809 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 810 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 811 | if (cursx >= 1) |
RichardAmes | 1:7962cd90f0b3 | 812 | cursx--; |
RichardAmes | 1:7962cd90f0b3 | 813 | } |
RichardAmes | 1:7962cd90f0b3 | 814 | else if (game.buttons.rightBtn()) |
RichardAmes | 1:7962cd90f0b3 | 815 | { |
RichardAmes | 1:7962cd90f0b3 | 816 | bdelay++; |
RichardAmes | 1:7962cd90f0b3 | 817 | if (bdelay > BTHRESH) |
RichardAmes | 1:7962cd90f0b3 | 818 | if (cursx < 21) |
RichardAmes | 1:7962cd90f0b3 | 819 | cursx++; |
RichardAmes | 1:7962cd90f0b3 | 820 | } |
RichardAmes | 1:7962cd90f0b3 | 821 | else |
RichardAmes | 1:7962cd90f0b3 | 822 | bdelay = 0; |
RichardAmes | 1:7962cd90f0b3 | 823 | |
RichardAmes | 0:1c44c4ef1245 | 824 | if (game.buttons.released(BTN_A)) |
RichardAmes | 0:1c44c4ef1245 | 825 | { |
RichardAmes | 0:1c44c4ef1245 | 826 | if (cursx >= 1 && cursx <= 10 && |
RichardAmes | 0:1c44c4ef1245 | 827 | cursy >= 4 && cursy <= 13) |
RichardAmes | 0:1c44c4ef1245 | 828 | { |
RichardAmes | 0:1c44c4ef1245 | 829 | snd.playTone(1, 200, 255, 200); |
RichardAmes | 0:1c44c4ef1245 | 830 | shipno = rand() % numships; |
RichardAmes | 0:1c44c4ef1245 | 831 | mx = ship[shipno].now.x; |
RichardAmes | 0:1c44c4ef1245 | 832 | my = ship[shipno].now.y; |
RichardAmes | 0:1c44c4ef1245 | 833 | |
RichardAmes | 0:1c44c4ef1245 | 834 | /* The goal here is to fly a parabolic arc from the selected */ |
RichardAmes | 0:1c44c4ef1245 | 835 | /* ship to the cursor position. This calculation might be */ |
RichardAmes | 0:1c44c4ef1245 | 836 | /* returning the wrong values for a nice parabola, but it works */ |
RichardAmes | 0:1c44c4ef1245 | 837 | m1x = cursx0(); |
RichardAmes | 0:1c44c4ef1245 | 838 | m1y = cursy0(); |
RichardAmes | 0:1c44c4ef1245 | 839 | a_num = m1y - my; |
RichardAmes | 0:1c44c4ef1245 | 840 | a_den = (m1x * m1x) - (mx * mx); |
RichardAmes | 0:1c44c4ef1245 | 841 | arc_c = m1y - ((a_num * m1x * m1x) / a_den); |
RichardAmes | 0:1c44c4ef1245 | 842 | game_state = FLY_MISSILE; |
RichardAmes | 0:1c44c4ef1245 | 843 | } |
RichardAmes | 0:1c44c4ef1245 | 844 | } |
RichardAmes | 0:1c44c4ef1245 | 845 | |
RichardAmes | 0:1c44c4ef1245 | 846 | game.display.setCursor(5, 5); |
RichardAmes | 0:1c44c4ef1245 | 847 | game.display.color = 12; |
RichardAmes | 0:1c44c4ef1245 | 848 | game.display.print("Select Target"); |
RichardAmes | 0:1c44c4ef1245 | 849 | |
RichardAmes | 0:1c44c4ef1245 | 850 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 851 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 852 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 853 | } |
RichardAmes | 0:1c44c4ef1245 | 854 | |
RichardAmes | 0:1c44c4ef1245 | 855 | void computer_plays(void) |
RichardAmes | 0:1c44c4ef1245 | 856 | { |
RichardAmes | 0:1c44c4ef1245 | 857 | int m1x; |
RichardAmes | 0:1c44c4ef1245 | 858 | int m1y; |
RichardAmes | 0:1c44c4ef1245 | 859 | |
RichardAmes | 0:1c44c4ef1245 | 860 | game.display.fillScreen(3); |
RichardAmes | 1:7962cd90f0b3 | 861 | |
RichardAmes | 1:7962cd90f0b3 | 862 | game.display.setCursor(5, 5); |
RichardAmes | 1:7962cd90f0b3 | 863 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 864 | game.display.print("Computer shoots"); |
RichardAmes | 1:7962cd90f0b3 | 865 | |
RichardAmes | 0:1c44c4ef1245 | 866 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 867 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 868 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 869 | |
RichardAmes | 1:7962cd90f0b3 | 870 | target_pgrid(); |
RichardAmes | 1:7962cd90f0b3 | 871 | snd.playTone(1, 200 + 10 * cursx, 255, 200); |
RichardAmes | 1:7962cd90f0b3 | 872 | computer_guessing++; |
RichardAmes | 1:7962cd90f0b3 | 873 | if (computer_guessing > 10) |
RichardAmes | 0:1c44c4ef1245 | 874 | { |
RichardAmes | 1:7962cd90f0b3 | 875 | snd.playTone(1, 200, 255, 200); |
RichardAmes | 1:7962cd90f0b3 | 876 | mx = 20; |
RichardAmes | 1:7962cd90f0b3 | 877 | my = 20; |
RichardAmes | 1:7962cd90f0b3 | 878 | m1x = cursx0(); |
RichardAmes | 1:7962cd90f0b3 | 879 | m1y = cursy0(); |
RichardAmes | 1:7962cd90f0b3 | 880 | a_num = m1y - my; |
RichardAmes | 1:7962cd90f0b3 | 881 | a_den = (m1x * m1x) - (mx * mx); |
RichardAmes | 1:7962cd90f0b3 | 882 | arc_c = m1y - ((a_num * m1x * m1x) / a_den); |
RichardAmes | 1:7962cd90f0b3 | 883 | computer_playing = 1; |
RichardAmes | 1:7962cd90f0b3 | 884 | game_state = FLY_MISSILE; |
RichardAmes | 0:1c44c4ef1245 | 885 | } |
RichardAmes | 0:1c44c4ef1245 | 886 | } |
RichardAmes | 0:1c44c4ef1245 | 887 | |
RichardAmes | 1:7962cd90f0b3 | 888 | /* Animate missile flying from source to target at cursor */ |
RichardAmes | 0:1c44c4ef1245 | 889 | void fly_missile(void) |
RichardAmes | 0:1c44c4ef1245 | 890 | { |
RichardAmes | 0:1c44c4ef1245 | 891 | game.display.fillScreen(3); |
RichardAmes | 0:1c44c4ef1245 | 892 | show_cursor(); |
RichardAmes | 0:1c44c4ef1245 | 893 | draw_cgrid(); |
RichardAmes | 0:1c44c4ef1245 | 894 | draw_pgrid(); |
RichardAmes | 0:1c44c4ef1245 | 895 | if (computer_playing) |
RichardAmes | 0:1c44c4ef1245 | 896 | { |
RichardAmes | 0:1c44c4ef1245 | 897 | mx++; |
RichardAmes | 0:1c44c4ef1245 | 898 | if (mx >= cursx0()) |
RichardAmes | 0:1c44c4ef1245 | 899 | { |
RichardAmes | 0:1c44c4ef1245 | 900 | pgrid[cursx - 12][cursy - 4] |= GRID_SHOT; |
RichardAmes | 0:1c44c4ef1245 | 901 | cursx = oldx; |
RichardAmes | 0:1c44c4ef1245 | 902 | cursy = oldy; |
RichardAmes | 0:1c44c4ef1245 | 903 | computer_playing = 0; |
RichardAmes | 0:1c44c4ef1245 | 904 | /* How to set noise with playTone()? */ |
RichardAmes | 0:1c44c4ef1245 | 905 | setOSC(&osc1,1,4,400,255,500); |
RichardAmes | 1:7962cd90f0b3 | 906 | if (check_winner()) |
RichardAmes | 1:7962cd90f0b3 | 907 | game_state = WINNER; |
RichardAmes | 1:7962cd90f0b3 | 908 | else |
RichardAmes | 1:7962cd90f0b3 | 909 | game_state = ENGAGE; |
RichardAmes | 0:1c44c4ef1245 | 910 | } |
RichardAmes | 0:1c44c4ef1245 | 911 | } |
RichardAmes | 0:1c44c4ef1245 | 912 | else |
RichardAmes | 0:1c44c4ef1245 | 913 | { |
RichardAmes | 0:1c44c4ef1245 | 914 | mx--; |
RichardAmes | 0:1c44c4ef1245 | 915 | if (mx <= cursx0()) |
RichardAmes | 0:1c44c4ef1245 | 916 | { |
RichardAmes | 0:1c44c4ef1245 | 917 | cgrid[cursx - 1][cursy - 4] |= GRID_SHOT; |
RichardAmes | 0:1c44c4ef1245 | 918 | oldx = cursx; |
RichardAmes | 0:1c44c4ef1245 | 919 | oldy = cursy; |
RichardAmes | 0:1c44c4ef1245 | 920 | cursx = 12; |
RichardAmes | 0:1c44c4ef1245 | 921 | cursy = 4; |
RichardAmes | 0:1c44c4ef1245 | 922 | setOSC(&osc1,1,4,400,255,500); |
RichardAmes | 1:7962cd90f0b3 | 923 | computer_guessing = 0; |
RichardAmes | 1:7962cd90f0b3 | 924 | if (check_winner()) |
RichardAmes | 1:7962cd90f0b3 | 925 | game_state = WINNER; |
RichardAmes | 1:7962cd90f0b3 | 926 | else |
RichardAmes | 1:7962cd90f0b3 | 927 | game_state = COMPUTER_PLAYS; |
RichardAmes | 0:1c44c4ef1245 | 928 | } |
RichardAmes | 0:1c44c4ef1245 | 929 | } |
RichardAmes | 0:1c44c4ef1245 | 930 | my = (mx * mx * a_num) / a_den + arc_c; |
RichardAmes | 0:1c44c4ef1245 | 931 | game.display.drawBitmap(mx, my, missile); |
RichardAmes | 0:1c44c4ef1245 | 932 | } |
RichardAmes | 0:1c44c4ef1245 | 933 | |
RichardAmes | 1:7962cd90f0b3 | 934 | /* Display winner screen */ |
RichardAmes | 1:7962cd90f0b3 | 935 | void winner(void) |
RichardAmes | 1:7962cd90f0b3 | 936 | { |
RichardAmes | 1:7962cd90f0b3 | 937 | game.display.fillScreen(3); |
RichardAmes | 1:7962cd90f0b3 | 938 | show_cursor(); |
RichardAmes | 1:7962cd90f0b3 | 939 | draw_cgrid(); |
RichardAmes | 1:7962cd90f0b3 | 940 | draw_pgrid(); |
RichardAmes | 1:7962cd90f0b3 | 941 | |
RichardAmes | 1:7962cd90f0b3 | 942 | game.display.setCursor(5, 5); |
RichardAmes | 1:7962cd90f0b3 | 943 | game.display.color = 12; |
RichardAmes | 1:7962cd90f0b3 | 944 | if (check_winner() == 2) |
RichardAmes | 1:7962cd90f0b3 | 945 | game.display.print("Computer Wins!"); |
RichardAmes | 1:7962cd90f0b3 | 946 | else |
RichardAmes | 1:7962cd90f0b3 | 947 | game.display.print("You Win!"); |
RichardAmes | 1:7962cd90f0b3 | 948 | game.display.setCursor(5, 72); |
RichardAmes | 1:7962cd90f0b3 | 949 | game.display.print("A to play again"); |
RichardAmes | 1:7962cd90f0b3 | 950 | |
RichardAmes | 1:7962cd90f0b3 | 951 | if (game.buttons.released(BTN_A)) |
RichardAmes | 1:7962cd90f0b3 | 952 | { |
RichardAmes | 1:7962cd90f0b3 | 953 | reset_game(); |
RichardAmes | 1:7962cd90f0b3 | 954 | } |
RichardAmes | 1:7962cd90f0b3 | 955 | } |
RichardAmes | 1:7962cd90f0b3 | 956 | |
RichardAmes | 1:7962cd90f0b3 | 957 | /* Main loop */ |
RichardAmes | 0:1c44c4ef1245 | 958 | int main () |
RichardAmes | 0:1c44c4ef1245 | 959 | { |
RichardAmes | 0:1c44c4ef1245 | 960 | reset_game(); |
RichardAmes | 0:1c44c4ef1245 | 961 | game.begin(); |
RichardAmes | 0:1c44c4ef1245 | 962 | game.display.width = 110; |
RichardAmes | 0:1c44c4ef1245 | 963 | game.display.height = 88; |
RichardAmes | 0:1c44c4ef1245 | 964 | game.display.invisiblecolor = 14; |
RichardAmes | 0:1c44c4ef1245 | 965 | game.display.bgcolor = 3; |
RichardAmes | 0:1c44c4ef1245 | 966 | game.display.setFont(font5x7); |
RichardAmes | 0:1c44c4ef1245 | 967 | srand(game.getTime()); |
RichardAmes | 0:1c44c4ef1245 | 968 | |
RichardAmes | 0:1c44c4ef1245 | 969 | game.display.loadRGBPalette(palettePico); |
RichardAmes | 0:1c44c4ef1245 | 970 | game.setFrameRate(30); |
RichardAmes | 0:1c44c4ef1245 | 971 | while (game.isRunning()) { |
RichardAmes | 0:1c44c4ef1245 | 972 | |
RichardAmes | 1:7962cd90f0b3 | 973 | // show_debug(); |
RichardAmes | 0:1c44c4ef1245 | 974 | |
RichardAmes | 0:1c44c4ef1245 | 975 | if (game.update()) { |
RichardAmes | 0:1c44c4ef1245 | 976 | switch (game_state) |
RichardAmes | 0:1c44c4ef1245 | 977 | { |
RichardAmes | 0:1c44c4ef1245 | 978 | case SPLASH: |
RichardAmes | 0:1c44c4ef1245 | 979 | splash_screen(); |
RichardAmes | 0:1c44c4ef1245 | 980 | break; |
RichardAmes | 0:1c44c4ef1245 | 981 | case SETUP: |
RichardAmes | 0:1c44c4ef1245 | 982 | setup_game(); |
RichardAmes | 0:1c44c4ef1245 | 983 | break; |
RichardAmes | 0:1c44c4ef1245 | 984 | case PLACE: |
RichardAmes | 0:1c44c4ef1245 | 985 | place_ships(); |
RichardAmes | 0:1c44c4ef1245 | 986 | break; |
RichardAmes | 0:1c44c4ef1245 | 987 | case ENGAGE: |
RichardAmes | 0:1c44c4ef1245 | 988 | engage_ships(); |
RichardAmes | 0:1c44c4ef1245 | 989 | break; |
RichardAmes | 0:1c44c4ef1245 | 990 | case FLY_MISSILE: |
RichardAmes | 0:1c44c4ef1245 | 991 | fly_missile(); |
RichardAmes | 0:1c44c4ef1245 | 992 | break; |
RichardAmes | 0:1c44c4ef1245 | 993 | case COMPUTER_PLAYS: |
RichardAmes | 0:1c44c4ef1245 | 994 | computer_plays(); |
RichardAmes | 0:1c44c4ef1245 | 995 | break; |
RichardAmes | 1:7962cd90f0b3 | 996 | case WINNER: |
RichardAmes | 1:7962cd90f0b3 | 997 | winner(); |
RichardAmes | 1:7962cd90f0b3 | 998 | break; |
RichardAmes | 0:1c44c4ef1245 | 999 | } |
RichardAmes | 0:1c44c4ef1245 | 1000 | } |
RichardAmes | 0:1c44c4ef1245 | 1001 | } |
RichardAmes | 1:7962cd90f0b3 | 1002 | return 0; |
RichardAmes | 0:1c44c4ef1245 | 1003 | } |