Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem TextLCD mbed-rtos mbed wave_player FATFileSystem
MbedModules/main.cpp@0:6dff7b3b161d, 2014-12-26 (annotated)
- Committer:
- ywang627
- Date:
- Fri Dec 26 13:38:44 2014 +0000
- Revision:
- 0:6dff7b3b161d
Battleship Game
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ywang627 | 0:6dff7b3b161d | 1 | /********************************** |
| ywang627 | 0:6dff7b3b161d | 2 | * Author: Clifton Thomas |
| ywang627 | 0:6dff7b3b161d | 3 | * Date: 3/28/13 |
| ywang627 | 0:6dff7b3b161d | 4 | * Institution: Georgia Tech |
| ywang627 | 0:6dff7b3b161d | 5 | * |
| ywang627 | 0:6dff7b3b161d | 6 | * Title: MAIN |
| ywang627 | 0:6dff7b3b161d | 7 | * Class: ECE2035 |
| ywang627 | 0:6dff7b3b161d | 8 | * Assignment: Project 2 |
| ywang627 | 0:6dff7b3b161d | 9 | * Student: Yingyan Samantha Wang |
| ywang627 | 0:6dff7b3b161d | 10 | **********************************/ |
| ywang627 | 0:6dff7b3b161d | 11 | |
| ywang627 | 0:6dff7b3b161d | 12 | //includes |
| ywang627 | 0:6dff7b3b161d | 13 | #include <string.h> |
| ywang627 | 0:6dff7b3b161d | 14 | #include <cstdarg> |
| ywang627 | 0:6dff7b3b161d | 15 | #include "mbed.h" |
| ywang627 | 0:6dff7b3b161d | 16 | #include "rtos.h" |
| ywang627 | 0:6dff7b3b161d | 17 | #include "TextLCD.h" |
| ywang627 | 0:6dff7b3b161d | 18 | #include "SDFileSystem.h" |
| ywang627 | 0:6dff7b3b161d | 19 | #include "CommModule.h" |
| ywang627 | 0:6dff7b3b161d | 20 | #include "wave_player.h" |
| ywang627 | 0:6dff7b3b161d | 21 | #include "FATFileSystem.h" |
| ywang627 | 0:6dff7b3b161d | 22 | |
| ywang627 | 0:6dff7b3b161d | 23 | |
| ywang627 | 0:6dff7b3b161d | 24 | //defines |
| ywang627 | 0:6dff7b3b161d | 25 | #define BAUDRATE 9600 |
| ywang627 | 0:6dff7b3b161d | 26 | #define BUFFSIZE 100 |
| ywang627 | 0:6dff7b3b161d | 27 | #define BOMB_WAVFILE "/sd/wavfiles/bomb.wav" |
| ywang627 | 0:6dff7b3b161d | 28 | #define ACK "status-ack" |
| ywang627 | 0:6dff7b3b161d | 29 | #define STATUS_KEY "status" |
| ywang627 | 0:6dff7b3b161d | 30 | #define HIT_KEY "hit" |
| ywang627 | 0:6dff7b3b161d | 31 | #define MISS_KEY "miss" |
| ywang627 | 0:6dff7b3b161d | 32 | #define SANK_KEY "sank" |
| ywang627 | 0:6dff7b3b161d | 33 | |
| ywang627 | 0:6dff7b3b161d | 34 | |
| ywang627 | 0:6dff7b3b161d | 35 | //function prototypes |
| ywang627 | 0:6dff7b3b161d | 36 | void lowerCase(char *src); |
| ywang627 | 0:6dff7b3b161d | 37 | void startGame(void); |
| ywang627 | 0:6dff7b3b161d | 38 | void waitForAck(void); |
| ywang627 | 0:6dff7b3b161d | 39 | int bomb(int rowIndex, int colIndex); |
| ywang627 | 0:6dff7b3b161d | 40 | int** init(int** mark); |
| ywang627 | 0:6dff7b3b161d | 41 | int* find(int** mark); |
| ywang627 | 0:6dff7b3b161d | 42 | int col_ship(int row, int col, int **mark); |
| ywang627 | 0:6dff7b3b161d | 43 | int row_ship(int row, int col, int **mark); |
| ywang627 | 0:6dff7b3b161d | 44 | //void playBombSound(void); |
| ywang627 | 0:6dff7b3b161d | 45 | void print(const char *format, ...); |
| ywang627 | 0:6dff7b3b161d | 46 | |
| ywang627 | 0:6dff7b3b161d | 47 | |
| ywang627 | 0:6dff7b3b161d | 48 | //declare functions (assembly subroutines) |
| ywang627 | 0:6dff7b3b161d | 49 | extern "C" void setup_sequence(void); |
| ywang627 | 0:6dff7b3b161d | 50 | extern "C" void seg_driver_initialize(void); |
| ywang627 | 0:6dff7b3b161d | 51 | extern "C" void seg_driver(int value); |
| ywang627 | 0:6dff7b3b161d | 52 | |
| ywang627 | 0:6dff7b3b161d | 53 | |
| ywang627 | 0:6dff7b3b161d | 54 | //initialize hardware |
| ywang627 | 0:6dff7b3b161d | 55 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs |
| ywang627 | 0:6dff7b3b161d | 56 | TextLCD lcd(p26, p25, p24, p23, p22, p21); // rs, e, d4-d7 |
| ywang627 | 0:6dff7b3b161d | 57 | AnalogOut DACout(p18); |
| ywang627 | 0:6dff7b3b161d | 58 | wave_player waver(&DACout); |
| ywang627 | 0:6dff7b3b161d | 59 | |
| ywang627 | 0:6dff7b3b161d | 60 | |
| ywang627 | 0:6dff7b3b161d | 61 | //communication device |
| ywang627 | 0:6dff7b3b161d | 62 | commSerial serDevice(USBTX, USBRX, BAUDRATE); //tx, rx |
| ywang627 | 0:6dff7b3b161d | 63 | |
| ywang627 | 0:6dff7b3b161d | 64 | int times; |
| ywang627 | 0:6dff7b3b161d | 65 | |
| ywang627 | 0:6dff7b3b161d | 66 | //main |
| ywang627 | 0:6dff7b3b161d | 67 | int main() { |
| ywang627 | 0:6dff7b3b161d | 68 | //initialize and clear 7-Segment Display (assembly subroutine) |
| ywang627 | 0:6dff7b3b161d | 69 | setup_sequence(); |
| ywang627 | 0:6dff7b3b161d | 70 | seg_driver_initialize(); |
| ywang627 | 0:6dff7b3b161d | 71 | int seg_times; |
| ywang627 | 0:6dff7b3b161d | 72 | for (seg_times=0;seg_times<10;seg_times++){ |
| ywang627 | 0:6dff7b3b161d | 73 | seg_driver(seg_times); |
| ywang627 | 0:6dff7b3b161d | 74 | lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 75 | lcd.printf("%d",seg_times); |
| ywang627 | 0:6dff7b3b161d | 76 | wait(0.5); |
| ywang627 | 0:6dff7b3b161d | 77 | } |
| ywang627 | 0:6dff7b3b161d | 78 | //check for wav file |
| ywang627 | 0:6dff7b3b161d | 79 | lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 80 | lcd.printf("Locating WAV file..."); |
| ywang627 | 0:6dff7b3b161d | 81 | FILE *test_file; |
| ywang627 | 0:6dff7b3b161d | 82 | /*while(1) { |
| ywang627 | 0:6dff7b3b161d | 83 | test_file=fopen(BOMB_WAVFILE,"r"); |
| ywang627 | 0:6dff7b3b161d | 84 | if(test_file != NULL) {break;} |
| ywang627 | 0:6dff7b3b161d | 85 | wait(0.5); |
| ywang627 | 0:6dff7b3b161d | 86 | } |
| ywang627 | 0:6dff7b3b161d | 87 | fclose(test_file);*/ |
| ywang627 | 0:6dff7b3b161d | 88 | |
| ywang627 | 0:6dff7b3b161d | 89 | //notification |
| ywang627 | 0:6dff7b3b161d | 90 | lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 91 | lcd.printf("Battleship"); |
| ywang627 | 0:6dff7b3b161d | 92 | wait(1); |
| ywang627 | 0:6dff7b3b161d | 93 | |
| ywang627 | 0:6dff7b3b161d | 94 | //loop |
| ywang627 | 0:6dff7b3b161d | 95 | while(1) { |
| ywang627 | 0:6dff7b3b161d | 96 | //synchronize front end display |
| ywang627 | 0:6dff7b3b161d | 97 | startGame(); |
| ywang627 | 0:6dff7b3b161d | 98 | seg_driver(0); |
| ywang627 | 0:6dff7b3b161d | 99 | /**** BEGIN - your code goes here ****/ |
| ywang627 | 0:6dff7b3b161d | 100 | //temp variables |
| ywang627 | 0:6dff7b3b161d | 101 | int i,j,k,end_row,end_col,ret,tempret; |
| ywang627 | 0:6dff7b3b161d | 102 | int **mark; |
| ywang627 | 0:6dff7b3b161d | 103 | int *ndx; |
| ywang627 | 0:6dff7b3b161d | 104 | //allocate a 10 by 10 array to keep track of tiles that are |
| ywang627 | 0:6dff7b3b161d | 105 | //either checked,unchecked or no need to check |
| ywang627 | 0:6dff7b3b161d | 106 | mark = (int **)malloc(10 * sizeof(int *)); |
| ywang627 | 0:6dff7b3b161d | 107 | if(mark == NULL){ |
| ywang627 | 0:6dff7b3b161d | 108 | fprintf(stderr, "out of memory\n"); |
| ywang627 | 0:6dff7b3b161d | 109 | return; |
| ywang627 | 0:6dff7b3b161d | 110 | } |
| ywang627 | 0:6dff7b3b161d | 111 | for(i = 0; i < 10; i++){ |
| ywang627 | 0:6dff7b3b161d | 112 | mark[i] = (int *)malloc(10 * sizeof(int)); |
| ywang627 | 0:6dff7b3b161d | 113 | if(mark[i] == NULL){ |
| ywang627 | 0:6dff7b3b161d | 114 | fprintf(stderr, "out of memory\n"); |
| ywang627 | 0:6dff7b3b161d | 115 | return; |
| ywang627 | 0:6dff7b3b161d | 116 | } |
| ywang627 | 0:6dff7b3b161d | 117 | } |
| ywang627 | 0:6dff7b3b161d | 118 | mark=init(mark); |
| ywang627 | 0:6dff7b3b161d | 119 | i=0; |
| ywang627 | 0:6dff7b3b161d | 120 | j=0; |
| ywang627 | 0:6dff7b3b161d | 121 | k=0; |
| ywang627 | 0:6dff7b3b161d | 122 | times=0; |
| ywang627 | 0:6dff7b3b161d | 123 | //debug statements |
| ywang627 | 0:6dff7b3b161d | 124 | print("testing"); |
| ywang627 | 0:6dff7b3b161d | 125 | print("string: %s\nstring2: %s", "hello", "world"); |
| ywang627 | 0:6dff7b3b161d | 126 | print("int: %d", 8); |
| ywang627 | 0:6dff7b3b161d | 127 | |
| ywang627 | 0:6dff7b3b161d | 128 | while (k!=5){ |
| ywang627 | 0:6dff7b3b161d | 129 | ret=bomb(i,j); |
| ywang627 | 0:6dff7b3b161d | 130 | //mark tiles already checked |
| ywang627 | 0:6dff7b3b161d | 131 | mark[i][j]=1; |
| ywang627 | 0:6dff7b3b161d | 132 | //tiles no need to check |
| ywang627 | 0:6dff7b3b161d | 133 | if (i+1<10){ |
| ywang627 | 0:6dff7b3b161d | 134 | mark[i+1][j]=2; |
| ywang627 | 0:6dff7b3b161d | 135 | //mark[i+2][j]=2; |
| ywang627 | 0:6dff7b3b161d | 136 | } |
| ywang627 | 0:6dff7b3b161d | 137 | if (j+1<10){ |
| ywang627 | 0:6dff7b3b161d | 138 | mark[i][j+1]=2; |
| ywang627 | 0:6dff7b3b161d | 139 | //mark[i][j+2]=2; |
| ywang627 | 0:6dff7b3b161d | 140 | } |
| ywang627 | 0:6dff7b3b161d | 141 | //when a boat is hit |
| ywang627 | 0:6dff7b3b161d | 142 | if (ret==1){ |
| ywang627 | 0:6dff7b3b161d | 143 | //row ship |
| ywang627 | 0:6dff7b3b161d | 144 | mark[i][j+1]=1; |
| ywang627 | 0:6dff7b3b161d | 145 | tempret=bomb(i,j+1); |
| ywang627 | 0:6dff7b3b161d | 146 | if (tempret==1){ |
| ywang627 | 0:6dff7b3b161d | 147 | end_col=row_ship(i,j+1,mark); |
| ywang627 | 0:6dff7b3b161d | 148 | if(i<9){ |
| ywang627 | 0:6dff7b3b161d | 149 | mark[i+1][j]=1; |
| ywang627 | 0:6dff7b3b161d | 150 | mark[i+1][j+1]=1; |
| ywang627 | 0:6dff7b3b161d | 151 | } |
| ywang627 | 0:6dff7b3b161d | 152 | if (end_col+1<10){ |
| ywang627 | 0:6dff7b3b161d | 153 | mark[i][end_col+1]=1; |
| ywang627 | 0:6dff7b3b161d | 154 | } |
| ywang627 | 0:6dff7b3b161d | 155 | } |
| ywang627 | 0:6dff7b3b161d | 156 | //vertical ship |
| ywang627 | 0:6dff7b3b161d | 157 | else if (tempret!=2){ |
| ywang627 | 0:6dff7b3b161d | 158 | if (bomb(i,j-1)==0||j==0){ |
| ywang627 | 0:6dff7b3b161d | 159 | end_row=col_ship(i,j,mark); |
| ywang627 | 0:6dff7b3b161d | 160 | if(end_row+1<10){ |
| ywang627 | 0:6dff7b3b161d | 161 | mark[end_row+1][j]=1; |
| ywang627 | 0:6dff7b3b161d | 162 | } |
| ywang627 | 0:6dff7b3b161d | 163 | } |
| ywang627 | 0:6dff7b3b161d | 164 | } |
| ywang627 | 0:6dff7b3b161d | 165 | k++; |
| ywang627 | 0:6dff7b3b161d | 166 | seg_driver(k); |
| ywang627 | 0:6dff7b3b161d | 167 | |
| ywang627 | 0:6dff7b3b161d | 168 | } |
| ywang627 | 0:6dff7b3b161d | 169 | ndx=find(mark); |
| ywang627 | 0:6dff7b3b161d | 170 | i=ndx[0]; |
| ywang627 | 0:6dff7b3b161d | 171 | j=ndx[1]; |
| ywang627 | 0:6dff7b3b161d | 172 | } |
| ywang627 | 0:6dff7b3b161d | 173 | |
| ywang627 | 0:6dff7b3b161d | 174 | free(mark); |
| ywang627 | 0:6dff7b3b161d | 175 | |
| ywang627 | 0:6dff7b3b161d | 176 | //have fun... |
| ywang627 | 0:6dff7b3b161d | 177 | |
| ywang627 | 0:6dff7b3b161d | 178 | /**** END - your code stops here ****/ |
| ywang627 | 0:6dff7b3b161d | 179 | } |
| ywang627 | 0:6dff7b3b161d | 180 | } |
| ywang627 | 0:6dff7b3b161d | 181 | |
| ywang627 | 0:6dff7b3b161d | 182 | //init mask; |
| ywang627 | 0:6dff7b3b161d | 183 | int** init(int **mark){ |
| ywang627 | 0:6dff7b3b161d | 184 | int i,j; |
| ywang627 | 0:6dff7b3b161d | 185 | for (i=0;i<10;i++){ |
| ywang627 | 0:6dff7b3b161d | 186 | for (j=0;j<10;j++){ |
| ywang627 | 0:6dff7b3b161d | 187 | mark[i][j]=0; |
| ywang627 | 0:6dff7b3b161d | 188 | } |
| ywang627 | 0:6dff7b3b161d | 189 | } |
| ywang627 | 0:6dff7b3b161d | 190 | return mark; |
| ywang627 | 0:6dff7b3b161d | 191 | } |
| ywang627 | 0:6dff7b3b161d | 192 | |
| ywang627 | 0:6dff7b3b161d | 193 | //find the first unchecked tile |
| ywang627 | 0:6dff7b3b161d | 194 | int* find(int **mark){ |
| ywang627 | 0:6dff7b3b161d | 195 | int i,j,a; |
| ywang627 | 0:6dff7b3b161d | 196 | int *ndx; |
| ywang627 | 0:6dff7b3b161d | 197 | ndx = (int *)malloc(2 * sizeof(int )); |
| ywang627 | 0:6dff7b3b161d | 198 | a=0; |
| ywang627 | 0:6dff7b3b161d | 199 | for (i=0;i<10;i++){ |
| ywang627 | 0:6dff7b3b161d | 200 | for (j=0;j<10;j++){ |
| ywang627 | 0:6dff7b3b161d | 201 | if (mark[i][j]==0){ |
| ywang627 | 0:6dff7b3b161d | 202 | a=1; |
| ywang627 | 0:6dff7b3b161d | 203 | break; |
| ywang627 | 0:6dff7b3b161d | 204 | } |
| ywang627 | 0:6dff7b3b161d | 205 | } |
| ywang627 | 0:6dff7b3b161d | 206 | if (a==1){ |
| ywang627 | 0:6dff7b3b161d | 207 | break; |
| ywang627 | 0:6dff7b3b161d | 208 | } |
| ywang627 | 0:6dff7b3b161d | 209 | } |
| ywang627 | 0:6dff7b3b161d | 210 | ndx[0]=i; |
| ywang627 | 0:6dff7b3b161d | 211 | ndx[1]=j; |
| ywang627 | 0:6dff7b3b161d | 212 | return ndx; |
| ywang627 | 0:6dff7b3b161d | 213 | } |
| ywang627 | 0:6dff7b3b161d | 214 | |
| ywang627 | 0:6dff7b3b161d | 215 | //bomb the entire vertical ship |
| ywang627 | 0:6dff7b3b161d | 216 | int col_ship(int row,int col, int **mark){ |
| ywang627 | 0:6dff7b3b161d | 217 | int backtrack=0; |
| ywang627 | 0:6dff7b3b161d | 218 | int tempret=1; |
| ywang627 | 0:6dff7b3b161d | 219 | int temprow; |
| ywang627 | 0:6dff7b3b161d | 220 | temprow=row; |
| ywang627 | 0:6dff7b3b161d | 221 | while (tempret!=2){ |
| ywang627 | 0:6dff7b3b161d | 222 | if(tempret==1 && row<9 && backtrack==0){ |
| ywang627 | 0:6dff7b3b161d | 223 | row++; |
| ywang627 | 0:6dff7b3b161d | 224 | } |
| ywang627 | 0:6dff7b3b161d | 225 | else if ((tempret==0||row==9) && backtrack==0){ |
| ywang627 | 0:6dff7b3b161d | 226 | row=temprow-1; |
| ywang627 | 0:6dff7b3b161d | 227 | backtrack=1; |
| ywang627 | 0:6dff7b3b161d | 228 | } |
| ywang627 | 0:6dff7b3b161d | 229 | else if (backtrack==1){ |
| ywang627 | 0:6dff7b3b161d | 230 | row--; |
| ywang627 | 0:6dff7b3b161d | 231 | } |
| ywang627 | 0:6dff7b3b161d | 232 | tempret=bomb(row,col); |
| ywang627 | 0:6dff7b3b161d | 233 | mark[row][col]=1; |
| ywang627 | 0:6dff7b3b161d | 234 | if (col+1<10){ |
| ywang627 | 0:6dff7b3b161d | 235 | mark[row][col+1]=1; |
| ywang627 | 0:6dff7b3b161d | 236 | } |
| ywang627 | 0:6dff7b3b161d | 237 | if (col-1>=0){ |
| ywang627 | 0:6dff7b3b161d | 238 | mark[row][col-1]=1; |
| ywang627 | 0:6dff7b3b161d | 239 | } |
| ywang627 | 0:6dff7b3b161d | 240 | //lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 241 | //lcd.printf("Ret: %d", tempret); |
| ywang627 | 0:6dff7b3b161d | 242 | } |
| ywang627 | 0:6dff7b3b161d | 243 | return row; |
| ywang627 | 0:6dff7b3b161d | 244 | } |
| ywang627 | 0:6dff7b3b161d | 245 | |
| ywang627 | 0:6dff7b3b161d | 246 | //bomb the entire horizontal ship |
| ywang627 | 0:6dff7b3b161d | 247 | int row_ship(int row,int col,int **mark){ |
| ywang627 | 0:6dff7b3b161d | 248 | int backtrack=0; |
| ywang627 | 0:6dff7b3b161d | 249 | int tempret=1; |
| ywang627 | 0:6dff7b3b161d | 250 | int tempcol; |
| ywang627 | 0:6dff7b3b161d | 251 | tempcol=col; |
| ywang627 | 0:6dff7b3b161d | 252 | while (tempret!=2){ |
| ywang627 | 0:6dff7b3b161d | 253 | //continue to bomb the horizontal ship |
| ywang627 | 0:6dff7b3b161d | 254 | if (tempret==1 && col<9 && backtrack==0){ |
| ywang627 | 0:6dff7b3b161d | 255 | col++; |
| ywang627 | 0:6dff7b3b161d | 256 | } |
| ywang627 | 0:6dff7b3b161d | 257 | //bomb the first tile of the ship |
| ywang627 | 0:6dff7b3b161d | 258 | else if ((tempret==0||col==9) && backtrack==0){ |
| ywang627 | 0:6dff7b3b161d | 259 | col=tempcol-2; |
| ywang627 | 0:6dff7b3b161d | 260 | backtrack=1; |
| ywang627 | 0:6dff7b3b161d | 261 | } |
| ywang627 | 0:6dff7b3b161d | 262 | else if (backtrack==1){ |
| ywang627 | 0:6dff7b3b161d | 263 | col--; |
| ywang627 | 0:6dff7b3b161d | 264 | } |
| ywang627 | 0:6dff7b3b161d | 265 | tempret=bomb(row,col); |
| ywang627 | 0:6dff7b3b161d | 266 | mark[row][col]=1; |
| ywang627 | 0:6dff7b3b161d | 267 | //the tiles below the ship are no need to check |
| ywang627 | 0:6dff7b3b161d | 268 | if(row+1<10){ |
| ywang627 | 0:6dff7b3b161d | 269 | mark[row+1][col]=2; |
| ywang627 | 0:6dff7b3b161d | 270 | } |
| ywang627 | 0:6dff7b3b161d | 271 | //lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 272 | //lcd.printf("Ret: %d", tempret); |
| ywang627 | 0:6dff7b3b161d | 273 | } |
| ywang627 | 0:6dff7b3b161d | 274 | return col; |
| ywang627 | 0:6dff7b3b161d | 275 | } |
| ywang627 | 0:6dff7b3b161d | 276 | |
| ywang627 | 0:6dff7b3b161d | 277 | |
| ywang627 | 0:6dff7b3b161d | 278 | //fcn to get acknowledgement from serial peripheral |
| ywang627 | 0:6dff7b3b161d | 279 | void waitForAck(void) { |
| ywang627 | 0:6dff7b3b161d | 280 | //get acknowlegement |
| ywang627 | 0:6dff7b3b161d | 281 | char buffer[BUFFSIZE]; |
| ywang627 | 0:6dff7b3b161d | 282 | while(1) { |
| ywang627 | 0:6dff7b3b161d | 283 | serDevice.receiveData(buffer); |
| ywang627 | 0:6dff7b3b161d | 284 | lowerCase(buffer); |
| ywang627 | 0:6dff7b3b161d | 285 | if(strcmp(ACK, buffer) == 0) { |
| ywang627 | 0:6dff7b3b161d | 286 | break; |
| ywang627 | 0:6dff7b3b161d | 287 | } |
| ywang627 | 0:6dff7b3b161d | 288 | memset(&buffer[0],0,strlen(buffer)); |
| ywang627 | 0:6dff7b3b161d | 289 | } |
| ywang627 | 0:6dff7b3b161d | 290 | return; |
| ywang627 | 0:6dff7b3b161d | 291 | } |
| ywang627 | 0:6dff7b3b161d | 292 | |
| ywang627 | 0:6dff7b3b161d | 293 | //fcn to initialize the frontend display |
| ywang627 | 0:6dff7b3b161d | 294 | void startGame(void) { |
| ywang627 | 0:6dff7b3b161d | 295 | //temp variables |
| ywang627 | 0:6dff7b3b161d | 296 | char buffer[BUFFSIZE]; |
| ywang627 | 0:6dff7b3b161d | 297 | //construct message |
| ywang627 | 0:6dff7b3b161d | 298 | sprintf(buffer, "start"); |
| ywang627 | 0:6dff7b3b161d | 299 | |
| ywang627 | 0:6dff7b3b161d | 300 | //send message |
| ywang627 | 0:6dff7b3b161d | 301 | serDevice.sendData(buffer); |
| ywang627 | 0:6dff7b3b161d | 302 | |
| ywang627 | 0:6dff7b3b161d | 303 | //wait for acknowledgement |
| ywang627 | 0:6dff7b3b161d | 304 | waitForAck(); |
| ywang627 | 0:6dff7b3b161d | 305 | } |
| ywang627 | 0:6dff7b3b161d | 306 | |
| ywang627 | 0:6dff7b3b161d | 307 | //fcn to bomb a given coordinate |
| ywang627 | 0:6dff7b3b161d | 308 | int bomb(int rowIndex, int colIndex) { |
| ywang627 | 0:6dff7b3b161d | 309 | //temp variables |
| ywang627 | 0:6dff7b3b161d | 310 | char buffer[BUFFSIZE]; |
| ywang627 | 0:6dff7b3b161d | 311 | //check if coordinate is valid |
| ywang627 | 0:6dff7b3b161d | 312 | times++; |
| ywang627 | 0:6dff7b3b161d | 313 | lcd.cls(); |
| ywang627 | 0:6dff7b3b161d | 314 | lcd.printf("Bomb Used: %d", times); |
| ywang627 | 0:6dff7b3b161d | 315 | if((rowIndex >= 0) && (rowIndex <= 9) && (colIndex >= 0) && (colIndex <= 9)) { |
| ywang627 | 0:6dff7b3b161d | 316 | //construct message |
| ywang627 | 0:6dff7b3b161d | 317 | sprintf(buffer, "bomb-%d-%d", rowIndex, colIndex); |
| ywang627 | 0:6dff7b3b161d | 318 | //send message |
| ywang627 | 0:6dff7b3b161d | 319 | serDevice.sendData(buffer); |
| ywang627 | 0:6dff7b3b161d | 320 | |
| ywang627 | 0:6dff7b3b161d | 321 | //wait for status response |
| ywang627 | 0:6dff7b3b161d | 322 | while(1) { |
| ywang627 | 0:6dff7b3b161d | 323 | //temp variables |
| ywang627 | 0:6dff7b3b161d | 324 | memset(&buffer[0],0,strlen(buffer)); |
| ywang627 | 0:6dff7b3b161d | 325 | char *ptr = NULL; |
| ywang627 | 0:6dff7b3b161d | 326 | |
| ywang627 | 0:6dff7b3b161d | 327 | //receive status response |
| ywang627 | 0:6dff7b3b161d | 328 | serDevice.receiveData(buffer); |
| ywang627 | 0:6dff7b3b161d | 329 | |
| ywang627 | 0:6dff7b3b161d | 330 | //parse string to extract status key |
| ywang627 | 0:6dff7b3b161d | 331 | ptr = strstr(buffer, STATUS_KEY); |
| ywang627 | 0:6dff7b3b161d | 332 | if(ptr == NULL) {continue;} |
| ywang627 | 0:6dff7b3b161d | 333 | |
| ywang627 | 0:6dff7b3b161d | 334 | //if status key found, parse string to extract status message |
| ywang627 | 0:6dff7b3b161d | 335 | ptr+=(strlen(STATUS_KEY)+1); |
| ywang627 | 0:6dff7b3b161d | 336 | if(strcmp(ptr, HIT_KEY) == 0) { |
| ywang627 | 0:6dff7b3b161d | 337 | //playBombSound(); |
| ywang627 | 0:6dff7b3b161d | 338 | return(1); |
| ywang627 | 0:6dff7b3b161d | 339 | } |
| ywang627 | 0:6dff7b3b161d | 340 | else if(strcmp(ptr, MISS_KEY) == 0) { |
| ywang627 | 0:6dff7b3b161d | 341 | return(0); |
| ywang627 | 0:6dff7b3b161d | 342 | } |
| ywang627 | 0:6dff7b3b161d | 343 | else if(strcmp(ptr, SANK_KEY) == 0) { |
| ywang627 | 0:6dff7b3b161d | 344 | //playBombSound(); |
| ywang627 | 0:6dff7b3b161d | 345 | return(2); |
| ywang627 | 0:6dff7b3b161d | 346 | } |
| ywang627 | 0:6dff7b3b161d | 347 | else { |
| ywang627 | 0:6dff7b3b161d | 348 | return(-1); |
| ywang627 | 0:6dff7b3b161d | 349 | } |
| ywang627 | 0:6dff7b3b161d | 350 | } |
| ywang627 | 0:6dff7b3b161d | 351 | } |
| ywang627 | 0:6dff7b3b161d | 352 | return(-1); |
| ywang627 | 0:6dff7b3b161d | 353 | } |
| ywang627 | 0:6dff7b3b161d | 354 | |
| ywang627 | 0:6dff7b3b161d | 355 | //fcn to play bomb noise |
| ywang627 | 0:6dff7b3b161d | 356 | /*void playBombSound(void) { |
| ywang627 | 0:6dff7b3b161d | 357 | //open wav file |
| ywang627 | 0:6dff7b3b161d | 358 | FILE *wave_file; |
| ywang627 | 0:6dff7b3b161d | 359 | wave_file=fopen(BOMB_WAVFILE,"r"); |
| ywang627 | 0:6dff7b3b161d | 360 | |
| ywang627 | 0:6dff7b3b161d | 361 | //play wav file |
| ywang627 | 0:6dff7b3b161d | 362 | waver.play(wave_file); |
| ywang627 | 0:6dff7b3b161d | 363 | |
| ywang627 | 0:6dff7b3b161d | 364 | //close wav file |
| ywang627 | 0:6dff7b3b161d | 365 | fclose(wave_file); |
| ywang627 | 0:6dff7b3b161d | 366 | }*/ |
| ywang627 | 0:6dff7b3b161d | 367 | |
| ywang627 | 0:6dff7b3b161d | 368 | //fcn to print to console |
| ywang627 | 0:6dff7b3b161d | 369 | void print(const char *format, ...) { |
| ywang627 | 0:6dff7b3b161d | 370 | //temp variables |
| ywang627 | 0:6dff7b3b161d | 371 | char buffer[BUFFSIZE]; |
| ywang627 | 0:6dff7b3b161d | 372 | char temp[BUFFSIZE-6]; |
| ywang627 | 0:6dff7b3b161d | 373 | |
| ywang627 | 0:6dff7b3b161d | 374 | //construct message part 1 |
| ywang627 | 0:6dff7b3b161d | 375 | sprintf(buffer, "print-"); |
| ywang627 | 0:6dff7b3b161d | 376 | |
| ywang627 | 0:6dff7b3b161d | 377 | //construct message part 2 |
| ywang627 | 0:6dff7b3b161d | 378 | va_list arguments; |
| ywang627 | 0:6dff7b3b161d | 379 | va_start(arguments, format); |
| ywang627 | 0:6dff7b3b161d | 380 | vsnprintf(temp, BUFFSIZE-7, format, arguments); |
| ywang627 | 0:6dff7b3b161d | 381 | va_end(arguments); |
| ywang627 | 0:6dff7b3b161d | 382 | |
| ywang627 | 0:6dff7b3b161d | 383 | //concatenate parts |
| ywang627 | 0:6dff7b3b161d | 384 | strcat(buffer, temp); |
| ywang627 | 0:6dff7b3b161d | 385 | |
| ywang627 | 0:6dff7b3b161d | 386 | //send message |
| ywang627 | 0:6dff7b3b161d | 387 | serDevice.sendData(buffer); |
| ywang627 | 0:6dff7b3b161d | 388 | |
| ywang627 | 0:6dff7b3b161d | 389 | //wait for acknowledgement |
| ywang627 | 0:6dff7b3b161d | 390 | waitForAck(); |
| ywang627 | 0:6dff7b3b161d | 391 | } |
| ywang627 | 0:6dff7b3b161d | 392 | |
| ywang627 | 0:6dff7b3b161d | 393 | //fcn to convert string to lowercase |
| ywang627 | 0:6dff7b3b161d | 394 | void lowerCase(char *src) { |
| ywang627 | 0:6dff7b3b161d | 395 | int i=0;; |
| ywang627 | 0:6dff7b3b161d | 396 | while(src[i] != '\0') { |
| ywang627 | 0:6dff7b3b161d | 397 | if((src[i] > 64) && (src[i] < 91)) { |
| ywang627 | 0:6dff7b3b161d | 398 | src[i]+=32; |
| ywang627 | 0:6dff7b3b161d | 399 | } |
| ywang627 | 0:6dff7b3b161d | 400 | i++; |
| ywang627 | 0:6dff7b3b161d | 401 | } |
| ywang627 | 0:6dff7b3b161d | 402 | return; |
| ywang627 | 0:6dff7b3b161d | 403 | } |