Play battleship against another mbed over an ethernet internet connection
Dependencies: 4DGL-uLCD-SE EthernetInterface mbed-rtos mbed
Fork of Working_Get_Example_Ethernet by
Diff: main.cpp
- Revision:
- 18:ac354cf138dd
- Parent:
- 17:46186f7da7eb
--- a/main.cpp Tue Dec 08 00:10:57 2015 +0000 +++ b/main.cpp Tue Dec 08 06:11:55 2015 +0000 @@ -1,6 +1,7 @@ #include "mbed.h" #include "EthernetInterface.h" #include <string> +#include "uLCD_4DGL.h" Serial pc(USBTX,USBRX); @@ -16,6 +17,348 @@ }; +//int main() { +// pc.baud(9600); +// pc.printf("Running\n"); +// EthernetInterface eth; +// eth.init(); //Use DHCP +// wait(15); +// eth.connect(); +// wait(15); +// pc.printf("MAC is %s\n", eth.getMACAddress()); +// pc.printf("IP Address is %s\n", eth.getIPAddress()); +// +// TCPSocketConnection sock; +// sock.connect("192.184.82.3", 5000); +// +// char http_cmd[300] = "GET /create_board?playerNum=1&gameNum=144&board=1111000000000000000000000000000000000000000000000000000000000000 HTTP/1.0\n\n"; +// sock.send_all(http_cmd, sizeof(http_cmd)-1); +// +// //Instead of printing here, do what you did before to convert the string, and just append buffer to a string (below the break), +// // replacing pc.printf +// //Then we can do string find to snipe the values we want (have to do math to grab the right amount) +// //Implemented example here, testStr now holds the received text (so you can search it) +// string testStr = ""; +// char buffer[600]; +// int ret; +// while (true) { +// ret = sock.receive(buffer, sizeof(buffer)-1); +// if (ret <= 0) +// break; +// buffer[ret] = '\0'; +// pc.printf("Received %d chars from server:\n%s\n", ret, buffer); +// string conv(buffer); +// testStr = testStr + conv; +// } +// pc.printf("Stringified %s\n", testStr); +// sock.close(); +// wait(0.2); +// sock.connect("192.184.82.3", 5000); +// wait(0.2); +// strcpy(http_cmd, "GET /create_board?playerNum=2&gameNum=144&board=1111000000000000000000000000000000000000000000000000000000000000 HTTP/1.0\n\n"); +// pc.printf("Command is %s", http_cmd); +// sock.send_all(http_cmd, sizeof(http_cmd)-1); +// +// while (true) { +// ret = sock.receive(buffer, sizeof(buffer)-1); +// if (ret <= 0) +// break; +// buffer[ret] = '\0'; +// pc.printf("Received %d chars from server:\n%s\n", ret, buffer); +// } +// +// sock.close(); +// wait(0.2); +// sock.connect("192.184.82.3", 5000); +// wait(0.2); +// strcpy(http_cmd, "GET /polling?gameNum=144&playerNum=1 HTTP/1.0\n\n"); +// pc.printf("Command is %s", http_cmd); +// sock.send_all(http_cmd, sizeof(http_cmd)-1); +// +// while (true) { +// ret = sock.receive(buffer, sizeof(buffer)-1); +// if (ret <= 0) +// break; +// buffer[ret] = '\0'; +// pc.printf("Received %d chars from server:\n%s\n", ret, buffer); +// } +// +// sock.close(); +// wait(0.2); +// sock.connect("192.184.82.3", 5000); +// wait(0.2); +// strcpy(http_cmd, "GET /fire?playerNum=1&gameNum=144&x=1&y=0 HTTP/1.0\n\n"); +// pc.printf("Command is %s", http_cmd); +// sock.send_all(http_cmd, sizeof(http_cmd)-1); +// +// while (true) { +// ret = sock.receive(buffer, sizeof(buffer)-1); +// if (ret <= 0) +// break; +// buffer[ret] = '\0'; +// pc.printf("Received %d chars from server:\n%s\n", ret, buffer); +// } +// +// sock.close(); +// eth.disconnect(); +// +// while(1) {} +//} + +uLCD_4DGL lcd(p28,p27,p29); +DigitalOut myled(LED1); + +AnalogIn sliderh(p17); +AnalogIn sliderv(p19); +DigitalIn pb1(p21); +bool down = false; +string gameID = ""; +string myBoard = ""; +string targetBoard = ""; +int size=7;//board square size in pixels +int cx=0,cy=0;//cursor position +int playerNum; + +//If button is pressed, print only once +bool check_button() { + if(pb1 == 0 && !down) { + return true; + } + if(pb1 == 1) { + down = false; + } + return false; +} + +void emptyBoards() { + myBoard=""; + targetBoard=""; + for (int i=0;i<64;i++) { + myBoard+="0"; + targetBoard+="0"; + } +} + +//0: nothing +//1: down +//2: up +//3: right +//4: down +//5: button press +int analogStick() { + if(sliderh < 0.2) { + return 1; + } + else if(sliderh > 0.8) { + return 2; + } + else if(sliderv < 0.2) { + return 3; + } + else if(sliderv > 0.8) { + return 4; + } + else if (check_button()){ + return 5; + } + else + return 0; +} + +string playerMenu(){ + lcd.cls(); + wait(0.2); + //lcd.printf("Player Select:"); + lcd.locate(3,0); + lcd.printf("Host a Game"); + lcd.locate(3, 14); + lcd.printf("Join a Game"); + while (1){ + if (analogStick()==2){ + return "1"; + } + else if (analogStick()==1){ + return "2"; + } + } + +} + +void selectMenu(){ + lcd.cls(); + wait(0.2); + lcd.locate(1,0); + lcd.printf("Current GameID:"); + int input; + while (1){ + input = analogStick(); + if (input==5) { + break; + } + else if (input==0) { + lcd.locate(1,0); + lcd.printf("Current GameID: %s",gameID); + continue; + } + char buf[10]; + sprintf(buf,"%d",input); + gameID.append(buf); + wait(0.3); + } +} + +void drawTargetBoard(){ + int x=0; + int y=0; + string s; + for (int i=0;i<64;i++) { + x=7*(i%8); + if (i%8==0 && i!=0) { + y+=size; + } + s = targetBoard.at(i); + if (s.compare("0")==0){ //water + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0x0000FF); + } + else if (s.compare("0")==1){ //unknown opponent ship + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0x0000FF); + } + else if (s.compare("0")==2){ //hit + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0xFF0000); + } + else if (s.compare("0")==3){ //miss + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0xFFFFFF); + } + } +} + +void drawMyBoard(){ + int x=0; + int y=56+16; + string s; + for (int i=0;i<64;i++) { + x=7*(i%8); + if (i%8==0 && i!=0) { + y+=size; + } + s = myBoard.at(i); + if (s.compare("0")==0){ //water + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0x0000FF); + } + else if (s.compare("0")==1){ //my ship + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0x2F4F4F); + } + else if (s.compare("0")==2){ //hit + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0xFF0000); + } + else if (s.compare("0")==3){ //miss + lcd.filled_rectangle(x,y,x+size-1,y+size-1,0xFFFFFF); + } + } +} + +void drawLegend(){ + int startX=64; + int startY=16; + int lSize=5; + int dY=24; + lcd.locate(11,2); + lcd.printf("Water"); + lcd.filled_rectangle(startX,startY,startX+lSize,startY+lSize,0x0000FF); + lcd.locate(11,5); + lcd.printf("Ship"); + lcd.filled_rectangle(startX,startY+dY,startX+lSize,startY+dY+lSize,0x2F4F4F); + lcd.locate(11,8); + lcd.printf("Hit"); + lcd.filled_rectangle(startX,startY+2*dY,startX+lSize,startY+2*dY+lSize,0xFF0000); + lcd.locate(11,11); + lcd.printf("Miss"); + lcd.filled_rectangle(startX,startY+3*dY,startX+lSize,startY+3*dY+lSize,0xFFFFFF); +} + +void drawBoards() { + lcd.cls(); + //wait(0.2); + drawTargetBoard(); + drawMyBoard(); + drawLegend(); +} + +void selectTarget(){//selected x,y coords are stored in global cx/cy coords + drawBoards(); + lcd.filled_rectangle(cx*size,cy*size,cx*size+size-1,cy*size+size-1,0xFFFF00); + int input; + while (1) { + input=analogStick(); + if (input==5) { + return; + } + if (input==1) {//down + if (cy<7) { + cy++; + } + } + if (input==2) {//up + if (cy>0) { + cy--; + } + } + if (input==3) {//right + if (cx<7) { + cx++; + } + } + if (input==4) {//left + if (cx>0) { + cx--; + } + } + if (input!=0) { + drawBoards(); + lcd.filled_rectangle(cx*size,cy*size,cx*size+size-1,cy*size+size-1,0xFFFF00); + } + } +} + +void placeShip(int s){ + for (int i=0;i<s;i++) { + drawBoards(); + lcd.filled_rectangle(cx*size,cy*size+72,cx*size+(size-1)*2,cy*size+72+size-1,0xFFFF00); + int input; + while (1) { + input=analogStick(); + if (input==5) { + break; + } + if (input==1) {//down + if (cy<7) { + cy++; + } + } + if (input==2) {//up + if (cy>0) { + cy--; + } + } + if (input==3) {//right + if (cx<6) { + cx++; + } + } + if (input==4) {//left + if (cx>0) { + cx--; + } + } + if (input!=0) { + drawBoards(); + lcd.filled_rectangle(cx*size,cy*size+72,cx*size+(size-1)*2,cy*size+72+size-1,0xFFFF00); + } + } + myBoard.replace(cy*8+cx,2,"11"); + } +} + int main() { pc.baud(9600); pc.printf("Running\n"); @@ -26,80 +369,177 @@ wait(15); pc.printf("MAC is %s\n", eth.getMACAddress()); pc.printf("IP Address is %s\n", eth.getIPAddress()); - TCPSocketConnection sock; + char http_cmd[300]; + string cmdStr = ""; + string resultStr = ""; + char buffer[600]; + int ret; + std::size_t found; + + emptyBoards(); + pb1.mode(PullUp); + lcd.baudrate(3000000); + lcd.cls(); + //lcd.printf("%d",analogStick()); + //lcd.printf("%d",playerMenu()); + string pm = playerMenu(); + wait(0.5); + selectMenu(); + lcd.cls(); + placeShip(2); sock.connect("192.184.82.3", 5000); - - char http_cmd[300] = "GET /create_board?playerNum=1&gameNum=144&board=1111000000000000000000000000000000000000000000000000000000000000 HTTP/1.0\n\n"; + cmdStr = "GET /create_board?playerNum="; + cmdStr += pm; + cmdStr += "&gameNum="; + cmdStr += gameID; + cmdStr += "&board="; + cmdStr += myBoard; + cmdStr += " HTTP/1.0\n\n"; + strcpy(http_cmd, cmdStr.c_str()); + pc.printf(http_cmd); sock.send_all(http_cmd, sizeof(http_cmd)-1); //Instead of printing here, do what you did before to convert the string, and just append buffer to a string (below the break), // replacing pc.printf //Then we can do string find to snipe the values we want (have to do math to grab the right amount) //Implemented example here, testStr now holds the received text (so you can search it) - string testStr = ""; - char buffer[600]; - int ret; - while (true) { - ret = sock.receive(buffer, sizeof(buffer)-1); - if (ret <= 0) - break; - buffer[ret] = '\0'; - pc.printf("Received %d chars from server:\n%s\n", ret, buffer); - string conv(buffer); - testStr = testStr + conv; - } - pc.printf("Stringified %s\n", testStr); - sock.close(); - wait(0.2); - sock.connect("192.184.82.3", 5000); - wait(0.2); - strcpy(http_cmd, "GET /create_board?playerNum=2&gameNum=144&board=1111000000000000000000000000000000000000000000000000000000000000 HTTP/1.0\n\n"); - pc.printf("Command is %s", http_cmd); - sock.send_all(http_cmd, sizeof(http_cmd)-1); - while (true) { ret = sock.receive(buffer, sizeof(buffer)-1); if (ret <= 0) break; buffer[ret] = '\0'; - pc.printf("Received %d chars from server:\n%s\n", ret, buffer); + string conv(buffer); + resultStr = resultStr + conv; + } + sock.close(); + resultStr=""; + wait(0.2);//we have now setup and sent the board + + while (1){ + while (1){ + sock.connect("192.184.82.3", 5000);//start polling to wait for turn + wait(0.2); + cmdStr = "GET /polling?playerNum="; + cmdStr += pm; + cmdStr += "&gameNum="; + cmdStr += gameID; + cmdStr += " HTTP/1.0\n\n"; + strcpy(http_cmd, cmdStr.c_str()); + pc.printf("Command is %s", http_cmd); + sock.send_all(http_cmd, sizeof(http_cmd)-1); + resultStr = ""; + while (true) { + ret = sock.receive(buffer, sizeof(buffer)-1); + if (ret <= 0) + break; + buffer[ret] = '\0'; + string conv(buffer); + resultStr = resultStr + conv; + } + found = resultStr.find("You lose"); + pc.printf("%s",resultStr); + if(found!=std::string::npos){ + wait(3); + sock.close(); + wait(0.2); + lcd.cls(); + drawTargetBoard(); + drawMyBoard(); + lcd.locate(12,5); + lcd.printf("You"); + lcd.locate(12,9); + lcd.printf("Lose!"); + return; + } + found = resultStr.find("Don't go"); + pc.printf("%s",resultStr); + if(found==std::string::npos){ + wait(3); + sock.close(); + wait(0.2); + break; + } + sock.close(); + wait(2); + } + //Now your turn +// if (myBoard.at(cy*8+cx)=='1') { +// targetBoard.replace(cy*8+cx,1,"2"); +// myBoard.replace(cy*8+cx,1,"2"); +// } +// else{ +// targetBoard.replace(cy*8+cx,1,"3"); +// myBoard.replace(cy*8+cx,1,"3"); +// } + string tmp = "player"; + tmp += pm; + tmp += "_board"; +// pc.printf("\nwe printing shit"); +// pc.printf("\ntmp: %s",tmp); + found = resultStr.find(tmp); + pc.printf("\nfound: %d",found); + myBoard = resultStr.substr(found+17,64); + wait(0.5); +// pc.printf("\nmyBoard: %s",myBoard); +// pc.printf("\nresultStr: %s",resultStr); + tmp = "player"; + tmp += pm; + tmp += "_board"; + if (pm.compare("1")==0) + tmp += "_p2"; + else + tmp += "_p1"; + found = resultStr.find(tmp); + targetBoard = resultStr.substr(found+20,64); + drawBoards(); + cx=0,cy=0; + selectTarget(); + sock.connect("192.184.82.3", 5000);//start polling to wait for turn + wait(0.2); + cmdStr = "GET /fire?playerNum="; + cmdStr += pm; + cmdStr += "&gameNum="; + cmdStr += gameID; + cmdStr += "&x="; + char buf[10]; + sprintf(buf,"%d",cx); + cmdStr.append(buf); + cmdStr += "&y="; + char buf2[10]; + sprintf(buf2,"%d",cy); + cmdStr.append(buf2); + cmdStr += " HTTP/1.0\n\n"; + //strcpy(http_cmd, "GET /fire?playerNum=1&gameNum=144&x=1&y=0 HTTP/1.0\n\n"); + strcpy(http_cmd, cmdStr.c_str()); + pc.printf("Command is %s", http_cmd); + sock.send_all(http_cmd, sizeof(http_cmd)-1); + resultStr = ""; + while (true) { + ret = sock.receive(buffer, sizeof(buffer)-1); + if (ret <= 0) + break; + buffer[ret] = '\0'; + string conv(buffer); + resultStr = resultStr + conv; + } + found = resultStr.find("You win"); + pc.printf("%s",resultStr); + if(found!=std::string::npos){ + wait(1.5); + sock.close(); + wait(0.2); + lcd.cls(); + drawTargetBoard(); + drawMyBoard(); + lcd.locate(12,5); + lcd.printf("You"); + lcd.locate(12,9); + lcd.printf("Win!"); + return; + } + sock.close(); + wait(0.5); } - sock.close(); - wait(0.2); - sock.connect("192.184.82.3", 5000); - wait(0.2); - strcpy(http_cmd, "GET /polling?gameNum=144&playerNum=1 HTTP/1.0\n\n"); - pc.printf("Command is %s", http_cmd); - sock.send_all(http_cmd, sizeof(http_cmd)-1); - - while (true) { - ret = sock.receive(buffer, sizeof(buffer)-1); - if (ret <= 0) - break; - buffer[ret] = '\0'; - pc.printf("Received %d chars from server:\n%s\n", ret, buffer); - } - - sock.close(); - wait(0.2); - sock.connect("192.184.82.3", 5000); - wait(0.2); - strcpy(http_cmd, "GET /fire?playerNum=1&gameNum=144&x=1&y=0 HTTP/1.0\n\n"); - pc.printf("Command is %s", http_cmd); - sock.send_all(http_cmd, sizeof(http_cmd)-1); - - while (true) { - ret = sock.receive(buffer, sizeof(buffer)-1); - if (ret <= 0) - break; - buffer[ret] = '\0'; - pc.printf("Received %d chars from server:\n%s\n", ret, buffer); - } - - sock.close(); - eth.disconnect(); - - while(1) {} }