Grid-based Pokitto game that challenges the player to deploy ships and then destroy the hidden ships of the computer.

Dependencies:   PokittoLib

/media/uploads/RichardAmes/naval_battle_2.png

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?

UserRevisionLine numberNew 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 }