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 18:06:00 2018 +0000
Revision:
2:b96bb2a68c81
Parent:
1:7962cd90f0b3
Updated AI

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