From 5adf3531ca25f1c26d03106a1999a4ecd3082de4 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Mon, 12 Oct 2015 17:19:07 -0500 Subject: [PATCH 001/108] Initial Parser commit. --- Parser.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Parser.h | 11 ++++++++++ 2 files changed, 74 insertions(+) create mode 100755 Parser.cpp create mode 100644 Parser.h diff --git a/Parser.cpp b/Parser.cpp new file mode 100755 index 0000000..9e5d94a --- /dev/null +++ b/Parser.cpp @@ -0,0 +1,63 @@ +//#include "main.cpp" +#include +#include +#include +#include + +bool password = true; // temp for a password needed function needed later. +string pass = "admin"; + +void setPassword() +{ + password = !password; +} + +vector tokenize(string ss){ + string tempString; + stringstream lineStream(ss); + vector output; + + while (lineStream >> tempString){ + output.push_back(tempString); + } + return output; +} + +void parseCmd(vector input){ + if(password){ + if(pass == input[0]){ + setPassword(); + cout << "Success." << endl; + } + else{ + cout << "Incorrect Password." << endl; + } + } + + string cmd = toupper(input[0]); + + else if(cmd == ""){ + + } + + else if(cmd == ""){ + + } + + else if(cmd == ""){ + + } + + else if(cmd == ""){ + + } + + else if(cmd == ""){ + + } +} + +void parse(string input){ + vector listOfTokens = tokenize(input); + parseCmd(listOfTokens); +} diff --git a/Parser.h b/Parser.h new file mode 100644 index 0000000..4ad6930 --- /dev/null +++ b/Parser.h @@ -0,0 +1,11 @@ +//#include "main.cpp" +#include +#include +#include +#include + +void setPassword(); +vector tokenize(string ss); +void parseCmd(); +void parse(string input, DBEngine &engine) + From e2d0473857a566d4c5f1b107ce0c8cb439dce49d Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 16:54:10 -0500 Subject: [PATCH 002/108] Create client.C --- client.C | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 client.C diff --git a/client.C b/client.C new file mode 100644 index 0000000..181de35 --- /dev/null +++ b/client.C @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +void error(const char *msg) +{ + perror(msg); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int sockfd, portno, n; + struct sockaddr_in serv_addr; + struct hostent *server; + + char buffer[256]; + if (argc < 3) { + fprintf(stderr,"usage %s hostname port\n", argv[0]); + exit(0); + } + portno = atoi(argv[2]); + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + error("ERROR opening socket"); + server = gethostbyname(argv[1]); + if (server == NULL) { + fprintf(stderr,"ERROR, no such host\n"); + exit(0); + } + bzero((char *) &serv_addr, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + bcopy((char *)server->h_addr, + (char *)&serv_addr.sin_addr.s_addr, + server->h_length); + serv_addr.sin_port = htons(portno); + if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) + error("ERROR connecting"); + printf("Please enter the message: "); + bzero(buffer,256); + fgets(buffer,255,stdin); + n = write(sockfd,buffer,strlen(buffer)); + if (n < 0) + error("ERROR writing to socket"); + bzero(buffer,256); + n = read(sockfd,buffer,255); + if (n < 0) + error("ERROR reading from socket"); + printf("%s\n",buffer); + close(sockfd); + return 0; +} From 66e96797c3b442c6b5091eba73719e0bc999b6ef Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 16:54:46 -0500 Subject: [PATCH 003/108] Create server.C --- server.C | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 server.C diff --git a/server.C b/server.C new file mode 100644 index 0000000..0c61a0e --- /dev/null +++ b/server.C @@ -0,0 +1,83 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ +#include +#include +#include +#include +#include +#include +#include + +void error(const char *msg) +{ + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int sockfd, newsockfd, portno; + socklen_t clilen; + char buffer[256]; + + + struct sockaddr_in serv_addr, cli_addr; + + int n; + + + if (argc < 2) { + fprintf(stderr,"ERROR, no port provided\n"); + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + error("ERROR opening socket"); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + + portno = atoi(argv[1]); + + serv_addr.sin_family = AF_INET; + + serv_addr.sin_addr.s_addr = INADDR_ANY; + + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) + error("ERROR on binding"); + + listen(sockfd,5); + + clilen = sizeof(cli_addr); + + newsockfd = accept(sockfd, + (struct sockaddr *) &cli_addr, + &clilen); + + if (newsockfd < 0) + error("ERROR on accept"); + + bzero(buffer,256); + + n = read(newsockfd,buffer,255); + + + if (n < 0) error("ERROR reading from socket"); + + + printf("Here is the message: %s\n",buffer); + + n = write(newsockfd,"I got your message",18); + + if (n < 0) error("ERROR writing to socket"); + + close(newsockfd); + + close(sockfd); + + return 0; +} From 70e99f7d4ba4c861c877c1f2a40edec44a371a35 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 17:18:23 -0500 Subject: [PATCH 004/108] Update README.md --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index e5895c3..c5a8dbe 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ # Breakthrough Reposity for the second CSCE 315 project + +I included an example of how to do socket programming; this example uses the server.C file and the client.C file attached: + +How to use these files to see example: + +1) open two different putty windows, one of these windows will be used for the client, and the other one for the server +2) compile each file on separatedly and make two object files using g++ command as follows (on either window): + +g++ server.C -o server +g++ client.C -o client + +3) start the server first, run the server object file with a port number (some number between 2000 and 65535) in the server window (just pick one of the two). For example: ./server 51717 + +once the server runs, it will wait for the client to connect. + +4) Start the client in the other putty window with two arguments: the host name (such as linux.cse.tamu.edu) and the port number used to start the server (int this case: 51717). For example: + +./client linux.cse.tamu.edu 51717 + +Once you start the client, the client can send a message to the server. Type a message, enter it, and the server will receive it. Once the server receives the message, it will display it on the server window and terminate. These files can be modified so that it won't terminate after sending only one message. + +Let me know if you have any questions, +William + From a25faded924b519354c2a4136933be7d53f11298 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 18:55:17 -0500 Subject: [PATCH 005/108] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c5a8dbe..239712e 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,10 @@ once the server runs, it will wait for the client to connect. Once you start the client, the client can send a message to the server. Type a message, enter it, and the server will receive it. Once the server receives the message, it will display it on the server window and terminate. These files can be modified so that it won't terminate after sending only one message. -Let me know if you have any questions, -William +*Note:* +If you run the server immediately for the second time using the same port number, the server won't accept this number because it says that it is being used. This is because it takes a couple of minutes for the server to release this port number. So in this case you can either run the server using a different name, or wait a couple of minutes before running the server again with the same port number. + +I hope this helps. Let me know if you have any questions. + +-William From 524b2ac121fda902b0ff858824963eeef3caf206 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 18:55:48 -0500 Subject: [PATCH 006/108] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 239712e..01831ad 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ How to use these files to see example: 2) compile each file on separatedly and make two object files using g++ command as follows (on either window): g++ server.C -o server + g++ client.C -o client 3) start the server first, run the server object file with a port number (some number between 2000 and 65535) in the server window (just pick one of the two). For example: ./server 51717 From 0d7549dd8793aee8a57e90d9d24fca18e6376d24 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 14 Oct 2015 18:56:36 -0500 Subject: [PATCH 007/108] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 01831ad..a779685 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Once you start the client, the client can send a message to the server. Type a m *Note:* If you run the server immediately for the second time using the same port number, the server won't accept this number because it says that it is being used. This is because it takes a couple of minutes for the server to release this port number. So in this case you can either run the server using a different name, or wait a couple of minutes before running the server again with the same port number. + I hope this helps. Let me know if you have any questions. -William From ca090d8898ef723e2b784a006fe4012a30c536d3 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Sat, 17 Oct 2015 17:33:11 -0500 Subject: [PATCH 008/108] Create Example socketProgramming --- Example socketProgramming | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Example socketProgramming diff --git a/Example socketProgramming b/Example socketProgramming new file mode 100644 index 0000000..4901216 --- /dev/null +++ b/Example socketProgramming @@ -0,0 +1,28 @@ +I included an example of how to do socket programming; this example uses the server.C file and the client.C file attached: + +How to use these files to see example: + +1) open two different putty windows, one of these windows will be used for the client, and the other one for the server +2) compile each file on separatedly and make two object files using g++ command as follows (on either window): + +g++ server.C -o server + +g++ client.C -o client + +3) start the server first, run the server object file with a port number (some number between 2000 and 65535) in the server window (just pick one of the two). For example: ./server 51717 + +once the server runs, it will wait for the client to connect. + +4) Start the client in the other putty window with two arguments: the host name (such as linux.cse.tamu.edu) and the port number used to start the server (int this case: 51717). For example: + +./client linux.cse.tamu.edu 51717 + +Once you start the client, the client can send a message to the server. Type a message, enter it, and the server will receive it. Once the server receives the message, it will display it on the server window and terminate. These files can be modified so that it won't terminate after sending only one message. + +*Note:* +If you run the server immediately for the second time using the same port number, the server won't accept this number because it says that it is being used. This is because it takes a couple of minutes for the server to release this port number. So in this case you can either run the server using a different name, or wait a couple of minutes before running the server again with the same port number. + + +I hope this helps. Let me know if you have any questions. + +-William From 922d866e263820593668f8778a75411e719ea548 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Sat, 17 Oct 2015 17:34:19 -0500 Subject: [PATCH 009/108] Create main.cpp --- main.cpp | 595 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 595 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..cdcb791 --- /dev/null +++ b/main.cpp @@ -0,0 +1,595 @@ +#include +#include +#include +#include + + +using namespace std; + +// class piece +// { + // char color; //w for white, b for white, e for empty + // int xpos; + // int ypos; + + // public: + + // piece(int x, int y) + // { + // xpos = x; + // ypos = y; + // } + + // void setColor(char kolor) + // { + // color = kolor; + // } + + // char getColor() + // { + // return color; + // } +// }; + +struct moves +{ + int row; + char column; + string moveType; + + moves(int linea, int columna, string m) + { + row = linea; + column = columna; + moveType = m; + } +}; + +class Board +{ + char boardArray [8][8]; + char turn = 'O'; + //bool winOrLose; + + public: + + Board() + { + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = 'X'; + } + } + + + for (int i = 2; i < 6; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = '_'; + } + } + + + for (int i = 6; i <= 7; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = 'O'; + } + } + + // winOrLose = false; + + } + + moves parse(string input) //needs to be idiot proof + { + + int temp1; + char temp2; + string temp3; + + temp2 = input[0]; + temp1 = input[1] - '0'; + + if (input[3] == 'L') + { + temp3 = "LEFT"; + } + + else if (input[3] == 'R') + { + temp3 = "RIGHT"; + } + + else + { + temp3 = "FWD"; + } + + moves output(temp1,temp2,temp3); + + return output; + + } + + char getTurn() + { + return turn; + } + + bool isGameOver() + { + for (int i = 0; i < 8; ++i) + { + + if (boardArray[0][i] == 'O') + { + cout<<"\n\n\nplayer O wins!\n\n\n"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } + } + + + + + vector viewPossibleMoves() + { + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; + } + + + void dumbassAI() + { + + //1) see all possible movements + + vector listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + cout<<"\n\nMove executed by AI: "< input) +{ + cout<<"\n\nList of possible Moves:"<>move; + b.move(move); + } + + + vector possibleMoves = b.viewPossibleMoves(); + //displayPossibleMoves(possibleMoves); + + + b.dumbassAI(); + + gameOver = b.isGameOver(); + } + +} From cdee60611ec12cbce51d43d0ffb14cb9e7311568 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Sat, 17 Oct 2015 17:48:30 -0500 Subject: [PATCH 010/108] Update README.md --- README.md | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index a779685..f8be7c0 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,12 @@ # Breakthrough Reposity for the second CSCE 315 project -I included an example of how to do socket programming; this example uses the server.C file and the client.C file attached: +The main.cpp file contains all the structure necessary to play breakthrough in a local machine; it has all the classes incorporated to it, and it seems to be bug-free and bulletproof. So far, it only has a simple AI that picks random movements. -How to use these files to see example: +To test it: -1) open two different putty windows, one of these windows will be used for the client, and the other one for the server -2) compile each file on separatedly and make two object files using g++ command as follows (on either window): +- compile using c++11. For example: g++ -std=c++11 main.cpp +- An example of valid command is: B2_FWD, where B is the column letter, 2 is the row number (see board print on screen when running the program), underscore, and either "FWD" for forward, "LEFT" for moving a piece forward (relative to the piece) and left (relative to the board, not the piece), or "RIGHT" (similar to left, but moving right relative to the board). -g++ server.C -o server - -g++ client.C -o client - -3) start the server first, run the server object file with a port number (some number between 2000 and 65535) in the server window (just pick one of the two). For example: ./server 51717 - -once the server runs, it will wait for the client to connect. - -4) Start the client in the other putty window with two arguments: the host name (such as linux.cse.tamu.edu) and the port number used to start the server (int this case: 51717). For example: - -./client linux.cse.tamu.edu 51717 - -Once you start the client, the client can send a message to the server. Type a message, enter it, and the server will receive it. Once the server receives the message, it will display it on the server window and terminate. These files can be modified so that it won't terminate after sending only one message. - -*Note:* -If you run the server immediately for the second time using the same port number, the server won't accept this number because it says that it is being used. This is because it takes a couple of minutes for the server to release this port number. So in this case you can either run the server using a different name, or wait a couple of minutes before running the server again with the same port number. - - -I hope this helps. Let me know if you have any questions. - --William +As of now, the program will automatically terminate once either player wins. From 406547118b7e5dd90c6015b72ddffab63313b661 Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Sat, 17 Oct 2015 19:18:47 -0500 Subject: [PATCH 011/108] Update main.cpp --- main.cpp | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index cdcb791..e365e5b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include using namespace std; @@ -31,6 +31,35 @@ using namespace std; // } // }; + +string myToUpper(string input) +{ + string output; + + for (int i = 0 ; i < input.size(); ++i) + { + int numeric; + + if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) + { + numeric = input[i] - 32; + output.push_back((char)numeric);// = 'Q';//(char) numeric; + } + else output.push_back(input[i]); + } + + for (int i = 0; i < output.size(); ++i) + { + cout< possibleMoves = b.viewPossibleMoves(); - //displayPossibleMoves(possibleMoves); + //displayPossibleMoves(possibleMoves); for debugging purposes - AI - b.dumbassAI(); + b.easyAI(); gameOver = b.isGameOver(); } From d64552743a65318da557d6ec156f1032b11aebaf Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Mon, 19 Oct 2015 15:36:20 -0500 Subject: [PATCH 012/108] restructuring main.cpp --- Board.cpp | 500 ++++++++++++++++++++++++++++++++++++++++++ Board.h | 390 +++++++++++++++++++++++++++++++++ GameEngine.cpp | 560 +++++++++++++++++++++++++++++++++++++++++++++++ GameEngine.h | 34 +++ a.out | Bin 0 -> 37669 bytes main.cpp | 583 +------------------------------------------------ 6 files changed, 1485 insertions(+), 582 deletions(-) create mode 100755 Board.cpp create mode 100755 Board.h create mode 100755 GameEngine.cpp create mode 100755 GameEngine.h create mode 100755 a.out diff --git a/Board.cpp b/Board.cpp new file mode 100755 index 0000000..78b82b3 --- /dev/null +++ b/Board.cpp @@ -0,0 +1,500 @@ +class Board +{ + char boardArray [8][8]; + char turn = 'O'; + + public: + + Board() + { + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = 'X'; + } + } + + + for (int i = 2; i < 6; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = '_'; + } + } + + + for (int i = 6; i <= 7; ++i) + { + for (int j = 0; j < 8; ++j) + { + boardArray[i][j] = 'O'; + } + } + + + + } + + moves parse(string input) + { + + input = myToUpper(input); + + cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } + } + + + + + vector viewPossibleMoves() + { + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; + } + + + void easyAI() + { + + //1) see all possible movements + + vector listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } + } + + + + + vector viewPossibleMoves() + { + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; + } + + + void easyAI() + { + + //1) see all possible movements + + vector listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "< +#include +#include +#include +#include "GameEngine.h" + +using namespace std; + +string myToUpper(string input) +{ + string output; + + for (int i = 0 ; i < input.size(); ++i) + { + int numeric; + + if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) + { + numeric = input[i] - 32; + output.push_back((char)numeric);// = 'Q';//(char) numeric; + } + else output.push_back(input[i]); + } + + for (int i = 0; i < output.size(); ++i) + { + cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } + } + + + + + vector viewPossibleMoves() + { + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; + } + + + void easyAI() + { + + //1) see all possible movements + + vector listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "< input) +{ + cout<<"\n\nList of possible Moves:"< +#include "Board.h" + +using namespace std; + +string myToUpper(string input); + +struct moves +{ + int row; + char column; + string moveType; + + moves(int linea, int columna, string m) + { + row = linea; + column = columna; + moveType = m; + } +}; + + + + +void displayPossibleMoves(vector input) +{ + cout<<"\n\nList of possible Moves:"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

ph~#er7Ahc`Boa$B8xOQsB|CpMX-a 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 agQ*)%^Gvl2EQ?q(+R5iLw71%G8UF`gqZph3 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index e365e5b..6e8a8e0 100644 --- a/main.cpp +++ b/main.cpp @@ -2,591 +2,10 @@ #include #include #include - +#include "GameEngine.h" using namespace std; -// class piece -// { - // char color; //w for white, b for white, e for empty - // int xpos; - // int ypos; - - // public: - - // piece(int x, int y) - // { - // xpos = x; - // ypos = y; - // } - - // void setColor(char kolor) - // { - // color = kolor; - // } - - // char getColor() - // { - // return color; - // } -// }; - - -string myToUpper(string input) -{ - string output; - - for (int i = 0 ; i < input.size(); ++i) - { - int numeric; - - if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) - { - numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; - } - else output.push_back(input[i]); - } - - for (int i = 0; i < output.size(); ++i) - { - cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - - else return false; - } - } - - - - - vector viewPossibleMoves() - { - vector output; - - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } - } - - return output; - } - - - void easyAI() - { - - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< input) -{ - cout<<"\n\nList of possible Moves:"< Date: Mon, 19 Oct 2015 15:45:41 -0500 Subject: [PATCH 013/108] finished restructuring --- Board.cpp | 837 +++++++++++++++++++++++++++--------------------------- Board.h | 395 ++------------------------ 2 files changed, 439 insertions(+), 793 deletions(-) diff --git a/Board.cpp b/Board.cpp index 78b82b3..2ad164b 100755 --- a/Board.cpp +++ b/Board.cpp @@ -1,500 +1,499 @@ -class Board +#include "Board.h" + +Board::Board() { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'X'; + } + } + + + for (int i = 2; i < 6; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = '_'; + } + } + + + for (int i = 6; i <= 7; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'O'; + } + } +} + +moves Board::parse(string input) { - char boardArray [8][8]; - char turn = 'O'; - public: + input = myToUpper(input); - Board() + cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) { - if (turn == 'O') turn = 'X'; - else turn = 'O'; + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + + if (temp == 'O') { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - + else if (moveType == "RIGHT") + { + if (boardArray[r+reflector][c+1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; else return false; } - } - - - - - vector viewPossibleMoves() - { - vector output; - for (int r = 0; r < 8; ++r) + else if (moveType == "LEFT") { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; } - return output; + else return false; } +} + + + + +vector Board::viewPossibleMoves() +{ + vector output; - - void easyAI() + for (int r = 0; r < 8; ++r) { - - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "<= 97) && (input[i] - 0 <= 122)) + { + numeric = input[i] - 32; + output.push_back((char)numeric);// = 'Q';//(char) numeric; + } + else output.push_back(input[i]); + } + + for (int i = 0; i < output.size(); ++i) + { + cout< input) +{ + cout<<"\n\nList of possible Moves:"< listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - - else return false; - } - } - - - - - vector viewPossibleMoves() - { - vector output; - - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } - } - - return output; - } - - - void easyAI() - { - - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< viewPossibleMoves(); + string myToUpper(string input); + void displayPossibleMoves(vector input); + void easyAI(); }; \ No newline at end of file From 78c5605d4c586227019d0d7b31da946f02058e5d Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Mon, 19 Oct 2015 15:51:48 -0500 Subject: [PATCH 014/108] undo command works --- main.cpp | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 154 insertions(+), 12 deletions(-) diff --git a/main.cpp b/main.cpp index e365e5b..4566296 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ #include + using namespace std; // class piece @@ -31,7 +32,6 @@ using namespace std; // } // }; - string myToUpper(string input) { string output; @@ -72,8 +72,14 @@ struct moves column = columna; moveType = m; } + + void display() + { + cout<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + if (boardArray[r+reflector][c+1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) + { + return true; + } else return false; } else if (moveType == "LEFT") { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) + { + return true; + } else return false; } @@ -525,6 +551,7 @@ class Board { if (boardArray[r][c] == turn) { + if (isThisMovePossible(r,c,"FWD")) { moves temp(8-r,intToCharColumn(c+1),"FWD"); @@ -547,6 +574,11 @@ class Board } } + // cout<<"\nnumber of possible choices: "< record; + +void undo(Board& tablero) +{ + if (record.size() < 2) + { + cout<<"nothing to undo"< input) @@ -585,13 +666,43 @@ void displayPossibleMoves(vector input) } } +void snapshot(vector& inputVec, Board inputBoard) +{ + if (inputVec.size() == 10) + { + inputVec.erase(inputVec.begin()); + } + + else if (inputVec.size() > 10) + { + cout<<"QUEUE OVERFLOW!"<>choice; + + if (choice == 1) cout<<"playing with AI..."<>move; - b.move(move); + interpret(move,b); } vector possibleMoves = b.viewPossibleMoves(); //displayPossibleMoves(possibleMoves); for debugging purposes - AI + if (choice == 1) + { + b.easyAI(); + } + + else + { + while(b.getTurn() == 'X' ) + { + b.displayBoard(); + cout<<"\nEnter command: "; + cin>>move; + interpret(move,b); + } + } - b.easyAI(); - + //b.snapshot(); gameOver = b.isGameOver(); + + snapshot(record,b); } + //for debugging purposes + cout<<"Record:"< Date: Mon, 19 Oct 2015 15:56:21 -0500 Subject: [PATCH 015/108] completely finished board restructure --- Board.cpp | 6 +++++- Board.h | 3 +++ a.out | Bin 37669 -> 41954 bytes test.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100755 test.cpp diff --git a/Board.cpp b/Board.cpp index 2ad164b..0571348 100755 --- a/Board.cpp +++ b/Board.cpp @@ -1,5 +1,9 @@ +#include +#include #include "Board.h" +using namespace std; + Board::Board() { for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { @@ -82,7 +86,7 @@ void Board::changeTurns() else turn = 'O'; } -void BoarddisplayBoard() +void Board::displayBoard() { cout<<"\n\n"; cout<<" A B C D E F G H"< +#include + using namespace std; struct moves { diff --git a/a.out b/a.out index 32beef92fb87a4020ba9cd7a240480f6d646485f..02b097697816e35bab25ad3ac1fec8e4049c3814 100755 GIT binary patch delta 13081 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 delta 12594 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 diff --git a/test.cpp b/test.cpp new file mode 100755 index 0000000..4d6518a --- /dev/null +++ b/test.cpp @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include "Board.h" + +using namespace std; + +int main() +{ + cout<<"Welcome to Breakthrough\n"<>move; + b.move(move); + } + + + vector possibleMoves = b.viewPossibleMoves(); + //displayPossibleMoves(possibleMoves); for debugging purposes - AI + + + b.easyAI(); + + gameOver = b.isGameOver(); + } + +} From ed598d0c8b6db12d90fc7465844023dc4a2cf721 Mon Sep 17 00:00:00 2001 From: scho4077 Date: Mon, 19 Oct 2015 16:31:22 -0500 Subject: [PATCH 016/108] Delete GameEngine.cpp --- GameEngine.cpp | 560 ------------------------------------------------- 1 file changed, 560 deletions(-) delete mode 100755 GameEngine.cpp diff --git a/GameEngine.cpp b/GameEngine.cpp deleted file mode 100755 index a5c7506..0000000 --- a/GameEngine.cpp +++ /dev/null @@ -1,560 +0,0 @@ -#include -#include -#include -#include -#include "GameEngine.h" - -using namespace std; - -string myToUpper(string input) -{ - string output; - - for (int i = 0 ; i < input.size(); ++i) - { - int numeric; - - if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) - { - numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; - } - else output.push_back(input[i]); - } - - for (int i = 0; i < output.size(); ++i) - { - cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - - else return false; - } - } - - - - - vector viewPossibleMoves() - { - vector output; - - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } - } - - return output; - } - - - void easyAI() - { - - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< input) -{ - cout<<"\n\nList of possible Moves:"< Date: Mon, 19 Oct 2015 16:31:31 -0500 Subject: [PATCH 017/108] Delete GameEngine.h --- GameEngine.h | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100755 GameEngine.h diff --git a/GameEngine.h b/GameEngine.h deleted file mode 100755 index ec74850..0000000 --- a/GameEngine.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include "Board.h" - -using namespace std; - -string myToUpper(string input); - -struct moves -{ - int row; - char column; - string moveType; - - moves(int linea, int columna, string m) - { - row = linea; - column = columna; - moveType = m; - } -}; - - - - -void displayPossibleMoves(vector input) -{ - cout<<"\n\nList of possible Moves:"< Date: Mon, 19 Oct 2015 16:37:58 -0500 Subject: [PATCH 018/108] final restructure --- GameEngine.cpp | 560 ------------------------------------------------- GameEngine.h | 34 --- 2 files changed, 594 deletions(-) delete mode 100755 GameEngine.cpp delete mode 100755 GameEngine.h diff --git a/GameEngine.cpp b/GameEngine.cpp deleted file mode 100755 index a5c7506..0000000 --- a/GameEngine.cpp +++ /dev/null @@ -1,560 +0,0 @@ -#include -#include -#include -#include -#include "GameEngine.h" - -using namespace std; - -string myToUpper(string input) -{ - string output; - - for (int i = 0 ; i < input.size(); ++i) - { - int numeric; - - if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) - { - numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; - } - else output.push_back(input[i]); - } - - for (int i = 0; i < output.size(); ++i) - { - cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - - else return false; - } - } - - - - - vector viewPossibleMoves() - { - vector output; - - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } - } - - return output; - } - - - void easyAI() - { - - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< input) -{ - cout<<"\n\nList of possible Moves:"< -#include "Board.h" - -using namespace std; - -string myToUpper(string input); - -struct moves -{ - int row; - char column; - string moveType; - - moves(int linea, int columna, string m) - { - row = linea; - column = columna; - moveType = m; - } -}; - - - - -void displayPossibleMoves(vector input) -{ - cout<<"\n\nList of possible Moves:"< Date: Mon, 19 Oct 2015 16:45:38 -0500 Subject: [PATCH 019/108] merge and restructure --- Board.cpp | 1 + Board.h | 2 ++ a.out | Bin 41954 -> 57395 bytes main.cpp | 13 +++++++------ test.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/Board.cpp b/Board.cpp index 0cd08d1..e765e82 100755 --- a/Board.cpp +++ b/Board.cpp @@ -504,6 +504,7 @@ void Board::undo(Board& tablero) void Board::interpret(string input, Board& tablero) //determines what kind of command its input is { + vector record; input = myToUpper(input); if (input == "UNDO") diff --git a/Board.h b/Board.h index 921455b..d98c0f3 100755 --- a/Board.h +++ b/Board.h @@ -23,6 +23,8 @@ class Board { public: Board(); + char elementAt(int r, int k) { return boardArray[r][k]; } + void modifyAt(int r, int k, char input) { boardArray[r][k] = input; } moves parse(string input); char getTurn() { return turn; } bool isGameOver(); diff --git a/a.out b/a.out index 02b097697816e35bab25ad3ac1fec8e4049c3814..2e926353058f6a17cd79da4d0792e161f058a5e6 100755 GIT binary patch literal 57395 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 z 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 delta 14759 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 diff --git a/main.cpp b/main.cpp index 37212b1..d4e940a 100644 --- a/main.cpp +++ b/main.cpp @@ -8,7 +8,6 @@ using namespace std; int main() { - cout<<"\n----------------------------"<>choice; + cin >> choice; if (choice == 1) cout<<"playing with AI..."< record; + + b.snapshot(record,b); while (gameOver != true) { @@ -40,7 +41,7 @@ int main() b.displayBoard(); cout<<"\nEnter command: "; cin>>move; - interpret(move,b); + b.interpret(move,b); } @@ -59,14 +60,14 @@ int main() b.displayBoard(); cout<<"\nEnter command: "; cin>>move; - interpret(move,b); + b.interpret(move,b); } } //b.snapshot(); gameOver = b.isGameOver(); - snapshot(record,b); + b.snapshot(record,b); } //for debugging purposes diff --git a/test.cpp b/test.cpp index 4d6518a..d4e940a 100755 --- a/test.cpp +++ b/test.cpp @@ -8,8 +8,19 @@ using namespace std; int main() { + cout<<"\n----------------------------"<> choice; + + if (choice == 1) cout<<"playing with AI..."< record; + + b.snapshot(record,b); + while (gameOver != true) { gameOver = b.isGameOver(); - while(b.getTurn() == 'O') + while(b.getTurn() == 'O' ) { b.displayBoard(); - cout<<"\nEnter move: "; + cout<<"\nEnter command: "; cin>>move; - b.move(move); + b.interpret(move,b); } vector possibleMoves = b.viewPossibleMoves(); //displayPossibleMoves(possibleMoves); for debugging purposes - AI + if (choice == 1) + { + b.easyAI(); + } + + else + { + while(b.getTurn() == 'X' ) + { + b.displayBoard(); + cout<<"\nEnter command: "; + cin>>move; + b.interpret(move,b); + } + } - b.easyAI(); - + //b.snapshot(); gameOver = b.isGameOver(); + + b.snapshot(record,b); } + //for debugging purposes + cout<<"Record:"< Date: Mon, 19 Oct 2015 16:47:14 -0500 Subject: [PATCH 020/108] merge and restructure --- main.cpp | 82 -------------------------------------------------------- 1 file changed, 82 deletions(-) delete mode 100644 main.cpp diff --git a/main.cpp b/main.cpp deleted file mode 100644 index d4e940a..0000000 --- a/main.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include -#include -#include -#include "Board.h" - -using namespace std; - -int main() -{ - cout<<"\n----------------------------"<> choice; - - if (choice == 1) cout<<"playing with AI..."< record; - - b.snapshot(record,b); - - while (gameOver != true) - { - gameOver = b.isGameOver(); - - while(b.getTurn() == 'O' ) - { - b.displayBoard(); - cout<<"\nEnter command: "; - cin>>move; - b.interpret(move,b); - } - - - vector possibleMoves = b.viewPossibleMoves(); - //displayPossibleMoves(possibleMoves); for debugging purposes - AI - - if (choice == 1) - { - b.easyAI(); - } - - else - { - while(b.getTurn() == 'X' ) - { - b.displayBoard(); - cout<<"\nEnter command: "; - cin>>move; - b.interpret(move,b); - } - } - - //b.snapshot(); - gameOver = b.isGameOver(); - - b.snapshot(record,b); - } - - //for debugging purposes - cout<<"Record:"< Date: Mon, 19 Oct 2015 17:02:56 -0500 Subject: [PATCH 021/108] fixed board output --- Board.cpp | 18 +++++++----------- a.out | Bin 57395 -> 57395 bytes test.cpp | 18 ++++++------------ 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/Board.cpp b/Board.cpp index e765e82..479dfd1 100755 --- a/Board.cpp +++ b/Board.cpp @@ -89,16 +89,16 @@ void Board::changeTurns() void Board::displayBoard() { cout<<"\n\n"; - cout<<" A B C D E F G H"< Board::viewPossibleMoves() { vector output; @@ -541,7 +536,8 @@ void Board::snapshot(vector& inputVec, Board inputBoard) inputVec.push_back(inputBoard); } - + +//move this to its own file void Board::easyAI() { diff --git a/a.out b/a.out index 2e926353058f6a17cd79da4d0792e161f058a5e6..20d22fc48711798618affec8fb2f0efec2968857 100755 GIT binary patch delta 10431 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 Mf6OqCJ>3}me-C}@h5!Hn diff --git a/test.cpp b/test.cpp index d4e940a..368e689 100755 --- a/test.cpp +++ b/test.cpp @@ -8,28 +8,22 @@ using namespace std; int main() { - cout<<"\n----------------------------"<> choice; - - if (choice == 1) cout<<"playing with AI..."< record; - b.snapshot(record,b); while (gameOver != true) From 9d209a61a0eef2a996da186a58d1dbcbfaf97004 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Mon, 19 Oct 2015 20:10:12 -0500 Subject: [PATCH 022/108] Client can join a game and play against AI on server --- Client.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Client.cpp diff --git a/Client.cpp b/Client.cpp new file mode 100644 index 0000000..a4901c4 --- /dev/null +++ b/Client.cpp @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Board.h" +using namespace std; + +void error(const char *msg) +{ + perror(msg); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int sockfd, portno, n; + struct sockaddr_in serv_addr; + struct hostent *server; + + + if (argc < 3) { + fprintf(stderr,"usage %s hostname port\n", argv[0]); + exit(0); + } + portno = atoi(argv[2]); + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + error("ERROR opening socket"); + server = gethostbyname(argv[1]); + if (server == NULL) { + fprintf(stderr,"ERROR, no such host\n"); + exit(0); + } + bzero((char *) &serv_addr, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + bcopy((char *)server->h_addr, + (char *)&serv_addr.sin_addr.s_addr, + server->h_length); + serv_addr.sin_port = htons(portno); + if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) + error("ERROR connecting"); + + char buffer[256]; + char info[256]; + + while(true) { + + bzero(buffer,256); //resets the input stream + n = read(sockfd,buffer,255); //Receives the board from server + printf("%s\n",buffer);//Prints the received message + + printf("Please enter a move: "); + bzero(buffer,256); //resets input stream + fgets(buffer,255,stdin); //Enter a move + n = write(sockfd,buffer,strlen(buffer)); //Sends an input to the server + + bzero(info,256); //resets input stream + n = read(sockfd,info,255); + string ref = info; + if(ref == "Game_Over") { + cout << "GAME OVER!!!" << endl; + break; + } + else if() + + } + close(sockfd); + return 0; +} From df39863877e418271470817c54df62c2d8d04f13 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Mon, 19 Oct 2015 20:10:56 -0500 Subject: [PATCH 023/108] Included Board Class, made a boardToString function --- Board.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Board.h diff --git a/Board.h b/Board.h new file mode 100644 index 0000000..cad2497 --- /dev/null +++ b/Board.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +using namespace std; + +struct moves { + int row; + char column; + string moveType; + + moves(int linea, int columna, string m) { + row = linea; + column = columna; + moveType = m; + } +}; + +class Board { + char boardArray [8][8]; + char turn = 'O'; + +public: + Board(); + char elementAt(int r, int k) { return boardArray[r][k]; } + void modifyAt(int r, int k, char input) { boardArray[r][k] = input; } + moves parse(string input); + char getTurn() { return turn; } + bool isGameOver(); + void changeTurns(); + void displayBoard(); + int charToIntColumn(char input); + char intToCharColumn(int input); + void move(string inputMove); + void move(moves jugada); + bool isThisMovePossible(int r, int c, string moveType); + vector viewPossibleMoves(); + string myToUpper(string input); + void displayPossibleMoves(vector input); + void undo(Board& tablero); + void interpret(string input, Board& tablero); + void snapshot(vector& inputVec, Board inputBoard); + void easyAI(); + string boardToString(); +}; From 87033ca0417995a952a8d7ea592851f6edbf2c1d Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Mon, 19 Oct 2015 20:11:27 -0500 Subject: [PATCH 024/108] Updated to work between server and client --- Board.cpp | 584 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 584 insertions(+) create mode 100644 Board.cpp diff --git a/Board.cpp b/Board.cpp new file mode 100644 index 0000000..6d7b295 --- /dev/null +++ b/Board.cpp @@ -0,0 +1,584 @@ +#include +#include +#include "Board.h" + +using namespace std; + +Board::Board() { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'X'; + } + } + + + for (int i = 2; i < 6; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = '_'; + } + } + + + for (int i = 6; i <= 7; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'O'; + } + } +} + +moves Board::parse(string input) +{ + + input = myToUpper(input); + + cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } +} + +vector Board::viewPossibleMoves() +{ + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; +} + +string Board::myToUpper(string input) +{ + string output; + + for (int i = 0 ; i < input.size(); ++i) + { + int numeric; + + if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) + { + numeric = input[i] - 32; + output.push_back((char)numeric);// = 'Q';//(char) numeric; + } + else output.push_back(input[i]); + } + + for (int i = 0; i < output.size(); ++i) + { + cout< input) +{ + cout<<"\n\nList of possible Moves:"< record; + + if (record.size() < 2) + { + cout<<"nothing to undo"< record; + input = myToUpper(input); + + if (input == "UNDO") + { + undo(tablero); + } + + else if (input == "DISPLAYRECORD") //for debugging purposes + { + cout<<"record: "<& inputVec, Board inputBoard) +{ + if (inputVec.size() == 10) + { + inputVec.erase(inputVec.begin()); + } + + else if (inputVec.size() > 10) + { + cout<<"QUEUE OVERFLOW!"< listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "< Date: Mon, 19 Oct 2015 20:12:03 -0500 Subject: [PATCH 025/108] This allows clients to connect to, and hosts a game --- Server.cpp | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 Server.cpp diff --git a/Server.cpp b/Server.cpp new file mode 100644 index 0000000..3f57f01 --- /dev/null +++ b/Server.cpp @@ -0,0 +1,141 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Board.h" +using namespace std; + +void error(const char *msg) +{ + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int sockfd, newsockfd, portno; + socklen_t clilen; + + struct sockaddr_in serv_addr, cli_addr; + + int n; + + if (argc < 2) { + fprintf(stderr,"ERROR, no port provided\n"); + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + error("ERROR opening socket"); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + + portno = atoi(argv[1]); + + serv_addr.sin_family = AF_INET; + + serv_addr.sin_addr.s_addr = INADDR_ANY; + + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) + error("ERROR on binding"); + + listen(sockfd,5); + + clilen = sizeof(cli_addr); + + newsockfd = accept(sockfd, + (struct sockaddr *) &cli_addr, + &clilen); + + if (newsockfd < 0) + error("ERROR on accept"); + + //After all the server setup crap is done, we start the board + + cout<<"WELCOME\n"; + + cout<<"1. Play against AI?\n"; + cout<<"2. Play against a human?\n"; + cout<<"Enter choice: \n"; + + int choice; + cin >> choice; + cout << "OK" << endl; + + Board b; + string move; + + //Brute force up in here! + bool gameOver = false; + vector record; + b.snapshot(record,b); + char buffer[256]; + char info[256]; + + while(true) { + + while(gameOver != true) + { + gameOver = b.isGameOver(); + + while(b.getTurn() == 'O' ) + { + b.displayBoard(); //Display the board on the server + string boardState = b.boardToString(); + write(newsockfd, boardState.c_str(), boardState.length()); //Display the board to the client (line by line) + cout<<"\nWaiting for client: "; + n = read(newsockfd,buffer,255); + move = buffer; + b.interpret(move,b); + } + + gameOver = b.isGameOver(); + if(gameOver == true) { + string endGame = "Game_Over"; + write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + break; + } + else { + string continueGame = "Continue_Game"; + write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + } + + vector possibleMoves = b.viewPossibleMoves(); + if(choice == 1) + b.easyAI(); + } + + close(newsockfd); + close(sockfd); + break; + + /* + bzero(buffer,512); + n = read(newsockfd,buffer,255); + if (n < 0) error("ERROR reading from socket"); + printf("Here is the message: %s\n",buffer); + n = write(newsockfd,"I got your message",18); + + if (n < 0) error("ERROR writing to socket"); + + if(buffer == "y") { + close(newsockfd); + close(sockfd); + break; + } + */ + } + return 0; +} From 16097a43036f229e920d32ed9054fb8cdbd1da39 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Mon, 19 Oct 2015 20:13:17 -0500 Subject: [PATCH 026/108] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e5895c3..4ecec64 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # Breakthrough Reposity for the second CSCE 315 project + +Server and client support is functional. Still needs a few touch-ups. Will be ready soon. From e72e408cdca80a53dcd77154ff779a0f765dfeb7 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 20 Oct 2015 14:28:05 -0500 Subject: [PATCH 027/108] Fixed some issues with de-syncing, client now chooses game type --- Server.cpp | 53 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/Server.cpp b/Server.cpp index 3f57f01..3630ebc 100644 --- a/Server.cpp +++ b/Server.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -64,15 +65,15 @@ int main(int argc, char *argv[]) //After all the server setup crap is done, we start the board - cout<<"WELCOME\n"; + // cout<<"WELCOME\n"; - cout<<"1. Play against AI?\n"; - cout<<"2. Play against a human?\n"; - cout<<"Enter choice: \n"; + // cout<<"1. Play against AI?\n"; + // cout<<"2. Play against a human?\n"; + // cout<<"Enter choice: \n"; - int choice; - cin >> choice; - cout << "OK" << endl; + + // cin >> choice; + // cout << "OK" << endl; Board b; string move; @@ -83,6 +84,13 @@ int main(int argc, char *argv[]) b.snapshot(record,b); char buffer[256]; char info[256]; + int choice; + + //Waiting for client to select game type + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice; //Sets choice equal to 1 or 2, based on clients input + bzero(info,256); //Resets info back to normal, "choice" now contains client's value while(true) { @@ -99,18 +107,29 @@ int main(int argc, char *argv[]) n = read(newsockfd,buffer,255); move = buffer; b.interpret(move,b); + + gameOver = b.isGameOver(); + if(gameOver == true) { + string endGame = "Game_Over"; + write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + break; + } + else { + string continueGame = "Continue_Game"; + write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + } } - gameOver = b.isGameOver(); - if(gameOver == true) { - string endGame = "Game_Over"; - write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) - break; - } - else { - string continueGame = "Continue_Game"; - write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) - } + //gameOver = b.isGameOver(); + // if(gameOver == true) { + // string endGame = "Game_Over"; + // write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + // break; + // } + // else { + // string continueGame = "Continue_Game"; + // write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + // } vector possibleMoves = b.viewPossibleMoves(); if(choice == 1) From 7a776cd0305ab34d17e0f97e2ab5be37a49f10dd Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 20 Oct 2015 14:28:56 -0500 Subject: [PATCH 028/108] Fixed client-side issues with de-syncing, can now choose game type for server to handle --- Client.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/Client.cpp b/Client.cpp index a4901c4..73bb121 100644 --- a/Client.cpp +++ b/Client.cpp @@ -45,9 +45,27 @@ int main(int argc, char *argv[]) if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting"); + //Client has successfully joined char buffer[256]; char info[256]; + cout<<"WELCOME\n"; + + cout<<"1. Play against AI?\n"; + cout<<"2. Play against a human?\n"; + cout<<"Enter choice: \n"; + + string choice; + cin >> choice; + + //Check for a valid option + cout << "OK!\n" << endl; + + //Writes off the choice to the server + + n = write(sockfd, choice.c_str(), choice.length()); //Sends an input to the server + + while(true) { bzero(buffer,256); //resets the input stream @@ -57,16 +75,17 @@ int main(int argc, char *argv[]) printf("Please enter a move: "); bzero(buffer,256); //resets input stream fgets(buffer,255,stdin); //Enter a move - n = write(sockfd,buffer,strlen(buffer)); //Sends an input to the server - + n = write(sockfd,buffer,strlen(buffer)); //Sends an inputted move to the server bzero(info,256); //resets input stream - n = read(sockfd,info,255); + + n = read(sockfd,info,255); //Reads from server if move was valid string ref = info; if(ref == "Game_Over") { cout << "GAME OVER!!!" << endl; break; } - else if() + else + continue; } close(sockfd); From 78f7580de027af78d3d1bcd51cda9a40e35b853e Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 20 Oct 2015 14:30:46 -0500 Subject: [PATCH 029/108] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ecec64..ea6552a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # Breakthrough Reposity for the second CSCE 315 project -Server and client support is functional. Still needs a few touch-ups. Will be ready soon. +Server and client support is highly functional, fixed major bugs. Making the final touches, last thing remaining is to have human vs. human matches over the internet. From b6b88188b31cb27846fdb01527ef8c4b7a3b2ccf Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 20 Oct 2015 14:33:11 -0500 Subject: [PATCH 030/108] Updated master with my branch's file --- Server.cpp | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++ server.C | 83 --------------------------- 2 files changed, 160 insertions(+), 83 deletions(-) create mode 100644 Server.cpp delete mode 100644 server.C diff --git a/Server.cpp b/Server.cpp new file mode 100644 index 0000000..3630ebc --- /dev/null +++ b/Server.cpp @@ -0,0 +1,160 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Board.h" +using namespace std; + +void error(const char *msg) +{ + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int sockfd, newsockfd, portno; + socklen_t clilen; + + struct sockaddr_in serv_addr, cli_addr; + + int n; + + if (argc < 2) { + fprintf(stderr,"ERROR, no port provided\n"); + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + error("ERROR opening socket"); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + + portno = atoi(argv[1]); + + serv_addr.sin_family = AF_INET; + + serv_addr.sin_addr.s_addr = INADDR_ANY; + + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) + error("ERROR on binding"); + + listen(sockfd,5); + + clilen = sizeof(cli_addr); + + newsockfd = accept(sockfd, + (struct sockaddr *) &cli_addr, + &clilen); + + if (newsockfd < 0) + error("ERROR on accept"); + + //After all the server setup crap is done, we start the board + + // cout<<"WELCOME\n"; + + // cout<<"1. Play against AI?\n"; + // cout<<"2. Play against a human?\n"; + // cout<<"Enter choice: \n"; + + + // cin >> choice; + // cout << "OK" << endl; + + Board b; + string move; + + //Brute force up in here! + bool gameOver = false; + vector record; + b.snapshot(record,b); + char buffer[256]; + char info[256]; + int choice; + + //Waiting for client to select game type + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice; //Sets choice equal to 1 or 2, based on clients input + bzero(info,256); //Resets info back to normal, "choice" now contains client's value + + while(true) { + + while(gameOver != true) + { + gameOver = b.isGameOver(); + + while(b.getTurn() == 'O' ) + { + b.displayBoard(); //Display the board on the server + string boardState = b.boardToString(); + write(newsockfd, boardState.c_str(), boardState.length()); //Display the board to the client (line by line) + cout<<"\nWaiting for client: "; + n = read(newsockfd,buffer,255); + move = buffer; + b.interpret(move,b); + + gameOver = b.isGameOver(); + if(gameOver == true) { + string endGame = "Game_Over"; + write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + break; + } + else { + string continueGame = "Continue_Game"; + write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + } + } + + //gameOver = b.isGameOver(); + // if(gameOver == true) { + // string endGame = "Game_Over"; + // write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + // break; + // } + // else { + // string continueGame = "Continue_Game"; + // write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + // } + + vector possibleMoves = b.viewPossibleMoves(); + if(choice == 1) + b.easyAI(); + } + + close(newsockfd); + close(sockfd); + break; + + /* + bzero(buffer,512); + n = read(newsockfd,buffer,255); + if (n < 0) error("ERROR reading from socket"); + printf("Here is the message: %s\n",buffer); + n = write(newsockfd,"I got your message",18); + + if (n < 0) error("ERROR writing to socket"); + + if(buffer == "y") { + close(newsockfd); + close(sockfd); + break; + } + */ + } + return 0; +} diff --git a/server.C b/server.C deleted file mode 100644 index 0c61a0e..0000000 --- a/server.C +++ /dev/null @@ -1,83 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ -#include -#include -#include -#include -#include -#include -#include - -void error(const char *msg) -{ - perror(msg); - exit(1); -} - -int main(int argc, char *argv[]) -{ - int sockfd, newsockfd, portno; - socklen_t clilen; - char buffer[256]; - - - struct sockaddr_in serv_addr, cli_addr; - - int n; - - - if (argc < 2) { - fprintf(stderr,"ERROR, no port provided\n"); - exit(1); - } - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - if (sockfd < 0) - error("ERROR opening socket"); - - bzero((char *) &serv_addr, sizeof(serv_addr)); - - portno = atoi(argv[1]); - - serv_addr.sin_family = AF_INET; - - serv_addr.sin_addr.s_addr = INADDR_ANY; - - serv_addr.sin_port = htons(portno); - - if (bind(sockfd, (struct sockaddr *) &serv_addr, - sizeof(serv_addr)) < 0) - error("ERROR on binding"); - - listen(sockfd,5); - - clilen = sizeof(cli_addr); - - newsockfd = accept(sockfd, - (struct sockaddr *) &cli_addr, - &clilen); - - if (newsockfd < 0) - error("ERROR on accept"); - - bzero(buffer,256); - - n = read(newsockfd,buffer,255); - - - if (n < 0) error("ERROR reading from socket"); - - - printf("Here is the message: %s\n",buffer); - - n = write(newsockfd,"I got your message",18); - - if (n < 0) error("ERROR writing to socket"); - - close(newsockfd); - - close(sockfd); - - return 0; -} From 67c3b463db5b471b307212080c4b117a4804d956 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 20 Oct 2015 14:33:56 -0500 Subject: [PATCH 031/108] Updated master with my branch's file --- Client.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ client.C | 57 --------------------------------- 2 files changed, 93 insertions(+), 57 deletions(-) create mode 100644 Client.cpp delete mode 100644 client.C diff --git a/Client.cpp b/Client.cpp new file mode 100644 index 0000000..73bb121 --- /dev/null +++ b/Client.cpp @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Board.h" +using namespace std; + +void error(const char *msg) +{ + perror(msg); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int sockfd, portno, n; + struct sockaddr_in serv_addr; + struct hostent *server; + + + if (argc < 3) { + fprintf(stderr,"usage %s hostname port\n", argv[0]); + exit(0); + } + portno = atoi(argv[2]); + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + error("ERROR opening socket"); + server = gethostbyname(argv[1]); + if (server == NULL) { + fprintf(stderr,"ERROR, no such host\n"); + exit(0); + } + bzero((char *) &serv_addr, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + bcopy((char *)server->h_addr, + (char *)&serv_addr.sin_addr.s_addr, + server->h_length); + serv_addr.sin_port = htons(portno); + if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) + error("ERROR connecting"); + + //Client has successfully joined + char buffer[256]; + char info[256]; + + cout<<"WELCOME\n"; + + cout<<"1. Play against AI?\n"; + cout<<"2. Play against a human?\n"; + cout<<"Enter choice: \n"; + + string choice; + cin >> choice; + + //Check for a valid option + cout << "OK!\n" << endl; + + //Writes off the choice to the server + + n = write(sockfd, choice.c_str(), choice.length()); //Sends an input to the server + + + while(true) { + + bzero(buffer,256); //resets the input stream + n = read(sockfd,buffer,255); //Receives the board from server + printf("%s\n",buffer);//Prints the received message + + printf("Please enter a move: "); + bzero(buffer,256); //resets input stream + fgets(buffer,255,stdin); //Enter a move + n = write(sockfd,buffer,strlen(buffer)); //Sends an inputted move to the server + bzero(info,256); //resets input stream + + n = read(sockfd,info,255); //Reads from server if move was valid + string ref = info; + if(ref == "Game_Over") { + cout << "GAME OVER!!!" << endl; + break; + } + else + continue; + + } + close(sockfd); + return 0; +} diff --git a/client.C b/client.C deleted file mode 100644 index 181de35..0000000 --- a/client.C +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -void error(const char *msg) -{ - perror(msg); - exit(0); -} - -int main(int argc, char *argv[]) -{ - int sockfd, portno, n; - struct sockaddr_in serv_addr; - struct hostent *server; - - char buffer[256]; - if (argc < 3) { - fprintf(stderr,"usage %s hostname port\n", argv[0]); - exit(0); - } - portno = atoi(argv[2]); - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) - error("ERROR opening socket"); - server = gethostbyname(argv[1]); - if (server == NULL) { - fprintf(stderr,"ERROR, no such host\n"); - exit(0); - } - bzero((char *) &serv_addr, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - bcopy((char *)server->h_addr, - (char *)&serv_addr.sin_addr.s_addr, - server->h_length); - serv_addr.sin_port = htons(portno); - if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) - error("ERROR connecting"); - printf("Please enter the message: "); - bzero(buffer,256); - fgets(buffer,255,stdin); - n = write(sockfd,buffer,strlen(buffer)); - if (n < 0) - error("ERROR writing to socket"); - bzero(buffer,256); - n = read(sockfd,buffer,255); - if (n < 0) - error("ERROR reading from socket"); - printf("%s\n",buffer); - close(sockfd); - return 0; -} From c9ab7c26227cfde94980a10f5589653d30f55361 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 20 Oct 2015 19:01:30 -0500 Subject: [PATCH 032/108] working on AI --- Board.cpp | 38 +++++++++++++++----------------------- Board.h | 1 - a.out | Bin 57395 -> 57395 bytes test.cpp | 2 +- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/Board.cpp b/Board.cpp index 479dfd1..f800776 100755 --- a/Board.cpp +++ b/Board.cpp @@ -87,8 +87,7 @@ void Board::changeTurns() } void Board::displayBoard() -{ - cout<<"\n\n"; +{ cout<<"; A B C D E F G H"< input) -{ - cout<<"\n\nList of possible Moves:"< record; @@ -545,17 +535,19 @@ void Board::easyAI() vector listOfMoves = viewPossibleMoves(); - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< viewPossibleMoves(); string myToUpper(string input); - void displayPossibleMoves(vector input); void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); diff --git a/a.out b/a.out index 20d22fc48711798618affec8fb2f0efec2968857..3bc9dbbd8ed9efb8212bc17c7ee932059c64f256 100755 GIT binary patch delta 7878 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 delta 7882 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 diff --git a/test.cpp b/test.cpp index 368e689..ab1f968 100755 --- a/test.cpp +++ b/test.cpp @@ -40,7 +40,6 @@ int main() vector possibleMoves = b.viewPossibleMoves(); - //displayPossibleMoves(possibleMoves); for debugging purposes - AI if (choice == 1) { @@ -53,6 +52,7 @@ int main() { b.displayBoard(); cout<<"\nEnter command: "; + cout<<"OK\n"; cin>>move; b.interpret(move,b); } From 228a2ed77a41f1d0e285113bdd08fba4f6643e4c Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 20 Oct 2015 19:17:47 -0500 Subject: [PATCH 033/108] deleted an unnecessary function --- Board.cpp | 13 ++++++------- a.out | Bin 57395 -> 57314 bytes test.cpp | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Board.cpp b/Board.cpp index f800776..b1473b4 100755 --- a/Board.cpp +++ b/Board.cpp @@ -100,7 +100,7 @@ void Board::displayBoard() cout<<"|\n"; } cout<<'\n'< 8 || row < 0 || kolumn > 8 || kolumn < 0) { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) { - cout<<"ERROR: index out of bound!"< listOfMoves = viewPossibleMoves(); //obvious moves - if (){ - // + if (false){ + return; } //random diff --git a/a.out b/a.out index 3bc9dbbd8ed9efb8212bc17c7ee932059c64f256..8a730d51cb6485ac10678766adc4402d368188f5 100755 GIT binary patch delta 13869 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 E0-65r-T(jq delta 13948 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

pPAq_NGLj!EqpUd8<)xU zz`DEaTGhH(T0bXwSL^ajrrnvOHO^UnTjUC0~*vc)s#b*A{C83silW{U6@e52eot$&TVW zo=TC++?fcTa>(y%;+oy0zE$!c$hP#B{7K2%%tAj@^0y>ELFC*^G0KXzxZe06Kuwe| z*eLn_;3;sCi5=Y)Wpy`+>b|o2wya)1SnxrTS8#hFvxTuOdHUZa;>!~SkJFYvBPCy! zEcnin&y{?U;3qor-7G7v3={@xhg3@b#U#P2gBXMh3I(o_9i=AvH_2~|WhdWC3Utl4 zNmf5(A;o=SQ)DaEX-EGLO-|#6h+t!6)}KlKYAjn-9F^=N2U(37j{6Fky&xyZKxvjC z`6$^Yy86+x47`uxMf=0U;>p&B!%dvVG0GorbRxOyILO4y>ik?Ud9MM2r#mM-UrGL` z%l!OJ@)kK}J%zf`9k&(ozifnwm|hC>_%l{k#K}pajzO;EZw+DEJyF(ZIS19D_*zy^ zaxqK7Rfghheagh$tKBtI@@r);t6}KN3+ZvNu4p$SpEBXC0A$2-*!-!De_hiEsaX-j%qpT=NV)1V$X>PNXZ~G?~ z%NH+4Z-hV%tbFi%dSyOSn5A&EA##63PE_ z6ieJ2rQH$37Vb?n)6%c*Y2rHk#S+rX*too%&H`*5{8;gL)$TpUuI=^L`Jz2O zI66C6dqE<-eR4Xh^L2*gkHna`KQ-eel8=vEHw`%o4AgeNuLfP!$Y#~R6bSmt~>iu$#3i@{LJOv6lJgEvn+yF zhwdVHgk}Twd0THwopqyxPG@QB?JIIPlPLI5$y+4%#<3A5Q4` ztMK1b*_UXdvZ8i9eKDiJ;ll*Kkk{ga2=gxSx89Vst{Zv~K8KMNix*b>#Tb_Jz*AcE zC&Ba-@?S++A@yB%_`Q-pC;cQz{YS!&Rhikx#3`GsXdfT~H_EL>or#H(cfG631WyUw zjud|A;|)FeQomn{iI>%*<$cL7WrgeFx+3}F{=$)}?~m<=dZ@Xd;MM+4 zk-V>*9xA^`^5t@gaUSuNO|rr!2Pl!}i_eylcO5uAEUCqvI*P#erM@qCO2~CL36s3* zt?eJ+Cy~L!IN=Co{(L75{N!<^@}mqQfa`9bFZp!YGWA&cimiOl-+B?Xl&-Cph(cfC z=(#1W%A-xZyo~=U$|K3w%PquMFR})$ao}VQ#uSt!3xx-?!X>d#~m0oZ{PrZ>opy8;U+6;+0u>aF0@QR{#czB3N`4u^P)D(t- zC;cWFN$v3El3y&FZsgwZEt!4vfxm7ydE-a>ap^Zc$iy`=q+YGGcfB#)mi+FKLSJ25 zGjQ6`?A|Q>(3f+1UIb71-5O%zWmUgW@Kz-&QB;iK)r#`HG|2FqM}}Mje9D(vOcH#bsANY=b{b(j4%|pN- zAIN453=?VHll`wQkV%r?mq_8CoO1I8Z&h{-6BXzN{=6;?$`ehzthS?E@-yXm+?UrX z%0I$lsaZssCQ#$G~5noF}_k$U%SnS3iEOSEW+E%l`9h zcQGh`1`DTm-GtY9;K`}$!rLVI7=C!+d!$U_h~$H1(h-uc5qy*~O>X6DWreYa2(Vht z5^P8OSqYv`Yz<@HANlv&A@w|@y}CReN#6A;-US(neQF>iKCgzGxM#KBr%C>h-1b$E zbJ^~X{B;{u`_3g&FI#4a?TtS_sv3d!q=xIguzd{<7p5`qDIS q*5!hSe{A&h*^BaWr@oXb{}_b-Er^+Uec|gKGsSE!y>z;@;eP;K8cL1; diff --git a/test.cpp b/test.cpp index ab1f968..7dd63ca 100755 --- a/test.cpp +++ b/test.cpp @@ -12,7 +12,7 @@ int main() cout<<"1. Play against AI?\n"; cout<<"2. Play against a human?\n"; - cout<<"CHANGE THIS TO PARSE THINGS\n"; + //cout<<"CHANGE THIS TO PARSE THINGS\n"; cout<<"Enter choice: \n"; int choice; From c41ddc97150054c8c602ed1ca1f64eb94e1b54f1 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 20 Oct 2015 22:04:46 -0500 Subject: [PATCH 034/108] updating board --- Example socketProgramming | 28 ---------------------------- README.md | 12 ------------ 2 files changed, 40 deletions(-) delete mode 100644 Example socketProgramming delete mode 100644 README.md diff --git a/Example socketProgramming b/Example socketProgramming deleted file mode 100644 index 4901216..0000000 --- a/Example socketProgramming +++ /dev/null @@ -1,28 +0,0 @@ -I included an example of how to do socket programming; this example uses the server.C file and the client.C file attached: - -How to use these files to see example: - -1) open two different putty windows, one of these windows will be used for the client, and the other one for the server -2) compile each file on separatedly and make two object files using g++ command as follows (on either window): - -g++ server.C -o server - -g++ client.C -o client - -3) start the server first, run the server object file with a port number (some number between 2000 and 65535) in the server window (just pick one of the two). For example: ./server 51717 - -once the server runs, it will wait for the client to connect. - -4) Start the client in the other putty window with two arguments: the host name (such as linux.cse.tamu.edu) and the port number used to start the server (int this case: 51717). For example: - -./client linux.cse.tamu.edu 51717 - -Once you start the client, the client can send a message to the server. Type a message, enter it, and the server will receive it. Once the server receives the message, it will display it on the server window and terminate. These files can be modified so that it won't terminate after sending only one message. - -*Note:* -If you run the server immediately for the second time using the same port number, the server won't accept this number because it says that it is being used. This is because it takes a couple of minutes for the server to release this port number. So in this case you can either run the server using a different name, or wait a couple of minutes before running the server again with the same port number. - - -I hope this helps. Let me know if you have any questions. - --William diff --git a/README.md b/README.md deleted file mode 100644 index f8be7c0..0000000 --- a/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Breakthrough -Reposity for the second CSCE 315 project - -The main.cpp file contains all the structure necessary to play breakthrough in a local machine; it has all the classes incorporated to it, and it seems to be bug-free and bulletproof. So far, it only has a simple AI that picks random movements. - -To test it: - -- compile using c++11. For example: g++ -std=c++11 main.cpp -- An example of valid command is: B2_FWD, where B is the column letter, 2 is the row number (see board print on screen when running the program), underscore, and either "FWD" for forward, "LEFT" for moving a piece forward (relative to the piece) and left (relative to the board, not the piece), or "RIGHT" (similar to left, but moving right relative to the board). - -As of now, the program will automatically terminate once either player wins. - From 0e326ee4081ff2c5d8d6326ea64e0886ba90f76f Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 20 Oct 2015 23:49:27 -0500 Subject: [PATCH 035/108] Error checking in server. --- Board.cpp | 1134 +++++++++++++++++++++++++++------------------------- Board.h | 2 + Server.cpp | 38 +- 3 files changed, 615 insertions(+), 559 deletions(-) diff --git a/Board.cpp b/Board.cpp index b1473b4..0536ff6 100755 --- a/Board.cpp +++ b/Board.cpp @@ -1,552 +1,584 @@ -#include -#include -#include "Board.h" - -using namespace std; - -Board::Board() { - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'X'; - } - } - - - for (int i = 2; i < 6; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = '_'; - } - } - - - for (int i = 6; i <= 7; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'O'; - } - } -} - -moves Board::parse(string input) -{ - - input = myToUpper(input); - - cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound in move()!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound in second move()!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; - } - - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; - } - - else return false; - } -} - -vector Board::viewPossibleMoves() -{ - vector output; - - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) - { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - - } - } - } - - return output; -} - -string Board::myToUpper(string input) -{ - string output; - - for (int i = 0 ; i < input.size(); ++i) - { - int numeric; - - if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) - { - numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; - } - else output.push_back(input[i]); - } - - for (int i = 0; i < output.size(); ++i) - { - cout< record; - - if (record.size() < 2) - { - cout<<"nothing to undo"< record; - input = myToUpper(input); - - if (input == "UNDO") - { - undo(tablero); - } - - else if (input == "DISPLAYRECORD") //for debugging purposes - { - cout<<"record: "<& inputVec, Board inputBoard) -{ - if (inputVec.size() == 10) - { - inputVec.erase(inputVec.begin()); - } - - else if (inputVec.size() > 10) - { - cout<<"QUEUE OVERFLOW!"< listOfMoves = viewPossibleMoves(); - - //obvious moves - if (false){ - return; - } - - //random - else { - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - } +#include +#include +#include "Board.h" + +using namespace std; + +Board::Board() { + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'X'; + } + } + + + for (int i = 2; i < 6; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = '_'; + } + } + + + for (int i = 6; i <= 7; ++i) { + for (int j = 0; j < 8; ++j) { + boardArray[i][j] = 'O'; + } + } +} + +moves Board::parse(string input) +{ + + input = myToUpper(input); + + cout< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound!"<= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; + else return false; + } + + else if (moveType == "LEFT") + { + if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; + else return false; + } + + else return false; + } +} + +vector Board::viewPossibleMoves() +{ + vector output; + + for (int r = 0; r < 8; ++r) + { + for (int c = 0; c < 8; ++c) + { + if (boardArray[r][c] == turn) + { + if (isThisMovePossible(r,c,"FWD")) + { + moves temp(8-r,intToCharColumn(c+1),"FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1),"LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1),"RIGHT"); + output.push_back(temp); + } + + } + } + } + + return output; +} + +string Board::myToUpper(string input) +{ + string output; + + for (int i = 0 ; i < input.size(); ++i) + { + int numeric; + + if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) + { + numeric = input[i] - 32; + output.push_back((char)numeric);// = 'Q';//(char) numeric; + } + else output.push_back(input[i]); + } + + for (int i = 0; i < output.size(); ++i) + { + cout< input) +{ + cout<<"\n\nList of possible Moves:"< record; + + if (record.size() < 2) + { + cout<<"nothing to undo"< record; + input = myToUpper(input); + + if (input == "UNDO") + { + undo(tablero); + } + + else if (input == "DISPLAYRECORD") //for debugging purposes + { + cout<<"record: "<& inputVec, Board inputBoard) +{ + if (inputVec.size() == 10) + { + inputVec.erase(inputVec.begin()); + } + + else if (inputVec.size() > 10) + { + cout<<"QUEUE OVERFLOW!"< listOfMoves = viewPossibleMoves(); + + //2) pick a movement + + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + + //cout<<"\n\nMove executed by AI: "<& inputVec, Board inputBoard); void easyAI(); + string boardToString(); + void displayPossibleMoves(vector input); }; \ No newline at end of file diff --git a/Server.cpp b/Server.cpp index 3630ebc..604075c 100644 --- a/Server.cpp +++ b/Server.cpp @@ -86,11 +86,23 @@ int main(int argc, char *argv[]) char info[256]; int choice; + string choice_input = "WELCOME\n1. Play against AI?\n2. Play against a human?\nEnter choice: "; + write(newsockfd, choice_input.c_str(), choice_input.length()); + choice_input = "Enter choice: "; //Waiting for client to select game type - n = read(newsockfd,info,255); - istringstream convert(info); - convert >> choice; //Sets choice equal to 1 or 2, based on clients input - bzero(info,256); //Resets info back to normal, "choice" now contains client's value + while(read(newsockfd,info,255)) { + if(info[0] == '1' || info[0] == '2') { + istringstream convert(info); + convert >> choice; //Sets choice equal to 1 or 2, based on clients input + bzero(info,256); //Resets info back to normal, "choice" now contains client's value + break; + } + else { + string choice_error = "Invalid choice."; + write(newsockfd, choice_error.c_str(), choice_error.length()); + write(newsockfd, choice_input.c_str(), choice_input.length()); + } + } while(true) { @@ -105,11 +117,21 @@ int main(int argc, char *argv[]) write(newsockfd, boardState.c_str(), boardState.length()); //Display the board to the client (line by line) cout<<"\nWaiting for client: "; n = read(newsockfd,buffer,255); - move = buffer; + move = buffer; + move = b.myToUpper(move); + //cout << "\n\ntesting\n" << move << endl; + if(move.substr(0,4) == "QUIT") { + cout << "TESTING" << endl; + gameOver = true; + break; + } b.interpret(move,b); - gameOver = b.isGameOver(); - if(gameOver == true) { + // if(!gameOver) { + // gameOver = b.isGameOver(); + // } + + if(gameOver) { string endGame = "Game_Over"; write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) break; @@ -132,7 +154,7 @@ int main(int argc, char *argv[]) // } vector possibleMoves = b.viewPossibleMoves(); - if(choice == 1) + if(choice == 1 && !gameOver) b.easyAI(); } From ef3bdea3ba6325b70e6630571153c09155d75130 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Tue, 20 Oct 2015 23:52:34 -0500 Subject: [PATCH 036/108] Create README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..500efc5 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Breakthrough +Reposity for the second CSCE 315 project + +compile the server with the folling command: +g++ -std=c++11 -o server Board.cpp Server.cpp + +Client is still WIP. From 460bd7f3dbab6f9749bae801e772f8c3ae368e24 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Wed, 21 Oct 2015 00:03:46 -0500 Subject: [PATCH 037/108] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 500efc5..ac4fdc5 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,7 @@ Reposity for the second CSCE 315 project compile the server with the folling command: g++ -std=c++11 -o server Board.cpp Server.cpp +run: +./server [port] + Client is still WIP. From 07ee4ac6de83598add2a9bcc7f6dc36ddfedceb7 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Wed, 21 Oct 2015 00:30:59 -0500 Subject: [PATCH 038/108] Update Server.cpp --- Server.cpp | 78 +++++++++++++----------------------------------------- 1 file changed, 18 insertions(+), 60 deletions(-) diff --git a/Server.cpp b/Server.cpp index 604075c..de4e231 100644 --- a/Server.cpp +++ b/Server.cpp @@ -85,24 +85,14 @@ int main(int argc, char *argv[]) char buffer[256]; char info[256]; int choice; + int move_counter = 0; + string final_move; - string choice_input = "WELCOME\n1. Play against AI?\n2. Play against a human?\nEnter choice: "; - write(newsockfd, choice_input.c_str(), choice_input.length()); - choice_input = "Enter choice: "; //Waiting for client to select game type - while(read(newsockfd,info,255)) { - if(info[0] == '1' || info[0] == '2') { - istringstream convert(info); - convert >> choice; //Sets choice equal to 1 or 2, based on clients input - bzero(info,256); //Resets info back to normal, "choice" now contains client's value - break; - } - else { - string choice_error = "Invalid choice."; - write(newsockfd, choice_error.c_str(), choice_error.length()); - write(newsockfd, choice_input.c_str(), choice_input.length()); - } - } + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice; //Sets choice equal to 1 or 2, based on clients input + bzero(info,256); //Resets info back to normal, "choice" now contains client's value while(true) { @@ -112,26 +102,16 @@ int main(int argc, char *argv[]) while(b.getTurn() == 'O' ) { - b.displayBoard(); //Display the board on the server + b.displayBoard();//Display the board on the server string boardState = b.boardToString(); - write(newsockfd, boardState.c_str(), boardState.length()); //Display the board to the client (line by line) + final_move = b.boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) cout<<"\nWaiting for client: "; n = read(newsockfd,buffer,255); move = buffer; - move = b.myToUpper(move); - //cout << "\n\ntesting\n" << move << endl; - if(move.substr(0,4) == "QUIT") { - cout << "TESTING" << endl; - gameOver = true; - break; - } b.interpret(move,b); - - // if(!gameOver) { - // gameOver = b.isGameOver(); - // } - - if(gameOver) { + gameOver = b.isGameOver(); + if(gameOver == true) { string endGame = "Game_Over"; write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) break; @@ -141,42 +121,20 @@ int main(int argc, char *argv[]) write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) } } - - //gameOver = b.isGameOver(); - // if(gameOver == true) { - // string endGame = "Game_Over"; - // write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) - // break; - // } - // else { - // string continueGame = "Continue_Game"; - // write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) - // } - vector possibleMoves = b.viewPossibleMoves(); - if(choice == 1 && !gameOver) + if(choice == 1) b.easyAI(); + } + string final_move = b.boardToString(); + write(newsockfd, final_move.c_str(), final_move.length());//Display the board to the client (line by line) + write(newsockfd, final_move.c_str(), final_move.length()); + cout << "\n\nGAME OVER!!!"; + usleep(1); close(newsockfd); close(sockfd); break; - - /* - bzero(buffer,512); - n = read(newsockfd,buffer,255); - if (n < 0) error("ERROR reading from socket"); - printf("Here is the message: %s\n",buffer); - n = write(newsockfd,"I got your message",18); - - if (n < 0) error("ERROR writing to socket"); - - if(buffer == "y") { - close(newsockfd); - close(sockfd); - break; - } - */ } return 0; } From 95c1b20d1ef2c1351348fe285d7ea057a8f8016f Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Wed, 21 Oct 2015 00:33:53 -0500 Subject: [PATCH 039/108] Update Board.cpp --- Board.cpp | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Board.cpp b/Board.cpp index 0536ff6..e170687 100755 --- a/Board.cpp +++ b/Board.cpp @@ -104,6 +104,29 @@ void Board::displayBoard() cout<<"turn : "< Date: Wed, 21 Oct 2015 00:35:08 -0500 Subject: [PATCH 040/108] Update Client.cpp --- Client.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Client.cpp b/Client.cpp index 73bb121..4ed70b2 100644 --- a/Client.cpp +++ b/Client.cpp @@ -48,46 +48,58 @@ int main(int argc, char *argv[]) //Client has successfully joined char buffer[256]; char info[256]; + string final_board; cout<<"WELCOME\n"; cout<<"1. Play against AI?\n"; - cout<<"2. Play against a human?\n"; - cout<<"Enter choice: \n"; - - string choice; - cin >> choice; + cout<<"2. Play AI against an AI?\n"; + string choice = ""; + while(choice != "1") + { + cout<<"Enter choice: \n"; + cin >> choice; + if(choice == "2") + cout << "AI vs. AI mode not added yet!\n"; + } //Check for a valid option cout << "OK!\n" << endl; //Writes off the choice to the server - n = write(sockfd, choice.c_str(), choice.length()); //Sends an input to the server - - + cin.clear(); + cin.ignore(10000,'\n'); while(true) { bzero(buffer,256); //resets the input stream n = read(sockfd,buffer,255); //Receives the board from server printf("%s\n",buffer);//Prints the received message + final_board = buffer; printf("Please enter a move: "); bzero(buffer,256); //resets input stream fgets(buffer,255,stdin); //Enter a move - n = write(sockfd,buffer,strlen(buffer)); //Sends an inputted move to the server + n = write(sockfd,buffer,strlen(buffer)); //Sends an input move to the server bzero(info,256); //resets input stream n = read(sockfd,info,255); //Reads from server if move was valid string ref = info; if(ref == "Game_Over") { + n = read(sockfd,info,255); //Reads from server if move was valid cout << "GAME OVER!!!" << endl; break; } else continue; - } + cout << "\nGAME WINNING MOVE: \n"; + //cout << final_board << endl; + //bzero(info,256); //resets input stream + n = read(sockfd,info,255); //Reads from server if move was valid + + printf("%s\n",info);//Prints the received message + usleep(1); close(sockfd); return 0; } From 6a94a2342577ee5d138af43b396bf59d30b59443 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Wed, 21 Oct 2015 00:35:26 -0500 Subject: [PATCH 041/108] Update Board.h --- Board.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Board.h b/Board.h index ea0a81c..87169c1 100755 --- a/Board.h +++ b/Board.h @@ -37,10 +37,10 @@ public: bool isThisMovePossible(int r, int c, string moveType); vector viewPossibleMoves(); string myToUpper(string input); + void displayPossibleMoves(vector input); void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); void easyAI(); string boardToString(); - void displayPossibleMoves(vector input); -}; \ No newline at end of file +}; From 6355f7ad5611711f05add2aadf504d66fe58498d Mon Sep 17 00:00:00 2001 From: William Bracho Blok Date: Wed, 21 Oct 2015 17:47:33 -0500 Subject: [PATCH 042/108] Update Board.cpp --- Board.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Board.cpp b/Board.cpp index e170687..cdde4cc 100755 --- a/Board.cpp +++ b/Board.cpp @@ -498,9 +498,8 @@ void Board::displayPossibleMoves(vector input) } } -void Board::undo(Board& tablero) +void Board::undo() { - vector record; if (record.size() < 2) { @@ -509,11 +508,14 @@ void Board::undo(Board& tablero) else { + cout<<"BAZINGA"< record; input = myToUpper(input); - if (input == "UNDO") + if (input[0] == 'U') { - undo(tablero); + undo(); } else if (input == "DISPLAYRECORD") //for debugging purposes @@ -544,22 +546,32 @@ void Board::interpret(string input, Board& tablero) //determines what kind of co else tablero.move(input); } -void Board::snapshot(vector& inputVec, Board inputBoard) +void Board::snapshot() { - if (inputVec.size() == 10) + if (record.size() == 10) { - inputVec.erase(inputVec.begin()); + record.erase(record.begin()); } - else if (inputVec.size() > 10) + else if (record.size() > 10) { cout<<"QUEUE OVERFLOW!"< Date: Wed, 21 Oct 2015 17:48:03 -0500 Subject: [PATCH 043/108] Update Board.h --- Board.h | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Board.h b/Board.h index 87169c1..bd6ce95 100755 --- a/Board.h +++ b/Board.h @@ -17,9 +17,39 @@ struct moves { } }; +struct simpleBoard{ + + char boardStamp [8][8]; + + char elementAt(int r, int k) + { + return boardStamp[r][k]; + } + + void modifyAt(int r, int k, char c) + { + boardStamp[r][k] = c; + } + + void display() + { + for (int r = 0; r < 8; ++r) + { + cout<<'\n'; + + for (int k = 0; k < 8; ++k) + { + cout< record; public: Board(); @@ -38,9 +68,10 @@ public: vector viewPossibleMoves(); string myToUpper(string input); void displayPossibleMoves(vector input); - void undo(Board& tablero); + void undo(); void interpret(string input, Board& tablero); - void snapshot(vector& inputVec, Board inputBoard); + void snapshot(); void easyAI(); string boardToString(); + void displayRecord(); }; From 7e8a82a1e49447b70c170ae33e7c2de2f16749a3 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Thu, 22 Oct 2015 10:51:32 -0500 Subject: [PATCH 044/108] fixing --- a.out | Bin 57314 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 a.out diff --git a/a.out b/a.out deleted file mode 100755 index 8a730d51cb6485ac10678766adc4402d368188f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57314 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 UwK+W@u#9n^yc9&u<=Wi;10b`djQ{`u From b1f3496981e4cffba2b5590da8b0425904fbf27a Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Thu, 22 Oct 2015 11:50:51 -0500 Subject: [PATCH 045/108] updating branch --- Board.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Board.cpp b/Board.cpp index b1473b4..c6d146b 100755 --- a/Board.cpp +++ b/Board.cpp @@ -28,7 +28,6 @@ Board::Board() { moves Board::parse(string input) { - input = myToUpper(input); cout<& inputVec, Board inputBoard) cout<<"QUEUE OVERFLOW!"< listOfMoves = viewPossibleMoves(); From f4d63382fe00377a3427adc91faa36c974eb79a6 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Sun, 25 Oct 2015 16:43:27 -0500 Subject: [PATCH 046/108] making an engine --- Board.cpp | 24 ------------ Board.h | 1 - Engine.cpp | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Engine.h | 14 +++++++ a.out | Bin 0 -> 57314 bytes test.cpp | 72 +---------------------------------- 6 files changed, 125 insertions(+), 95 deletions(-) create mode 100755 Engine.cpp create mode 100755 Engine.h create mode 100755 a.out diff --git a/Board.cpp b/Board.cpp index c6d146b..d407bd7 100755 --- a/Board.cpp +++ b/Board.cpp @@ -521,28 +521,4 @@ void Board::snapshot(vector& inputVec, Board inputBoard) } inputVec.push_back(inputBoard); -} - -//move this to its own file -void Board::easyAI() -{ - //1) see all possible movements - - vector listOfMoves = viewPossibleMoves(); - - //obvious moves - if (false){ - return; - } - - //random - else { - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - } } \ No newline at end of file diff --git a/Board.h b/Board.h index f17eb4d..eecdeb3 100755 --- a/Board.h +++ b/Board.h @@ -40,5 +40,4 @@ public: void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); - void easyAI(); }; \ No newline at end of file diff --git a/Engine.cpp b/Engine.cpp new file mode 100755 index 0000000..cf7acf9 --- /dev/null +++ b/Engine.cpp @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include "Engine.h" + + +Engine::Engine(){ + Board b = new Board(); +} + +void Engine::startGame(){ + cout<<"WELCOME\n"; + + cout<<"1. Play against AI?\n"; + cout<<"2. Play against a human?\n"; + //cout<<"CHANGE THIS TO PARSE THINGS\n"; + cout<<"Enter choice: \n"; + + int choice; + cin >> choice; + cout << "OK" << endl; + + string move; + + bool gameOver = false; + vector record; + b.snapshot(record,b); + + while (gameOver != true) + { + gameOver = b.isGameOver(); + + while(b.getTurn() == 'O' ) + { + b.displayBoard(); + cout<<"\nEnter command: "; + cin>>move; + b.interpret(move,b); + } + + + vector possibleMoves = b.viewPossibleMoves(); + + if (choice == 1) + { + cout << "a"; + b.easyAI(); + } + + else + { + while(b.getTurn() == 'X' ) + { + b.displayBoard(); + cout<<"\nEnter command: "; + cout<<"OK\n"; + cin>>move; + b.interpret(move,b); + } + } + + //b.snapshot(); + gameOver = b.isGameOver(); + + b.snapshot(record,b); + } + + //for debugging purposes + cout<<"Record:"< listOfMoves = viewPossibleMoves(); + + //obvious moves + if (false){ + return; + } + + //random + else { + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + int temp = randomChoice; + + move(listOfMoves[randomChoice]); + } +} + +void Board::AI(){ + //do things here +} + +void Board::minMax(){ + //do more things here +} \ No newline at end of file diff --git a/Engine.h b/Engine.h new file mode 100755 index 0000000..da6f589 --- /dev/null +++ b/Engine.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Board.h" + +using namespace std; + +class Engine { + Board b; + +public: + Engine(); + void startGame(); + void easyAI(); +}; \ No newline at end of file diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..8a730d51cb6485ac10678766adc4402d368188f5 GIT binary patch literal 57314 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 UwK+W@u#9n^yc9&u<=Wi;10b`djQ{`u literal 0 HcmV?d00001 diff --git a/test.cpp b/test.cpp index 7dd63ca..a0f9d72 100755 --- a/test.cpp +++ b/test.cpp @@ -1,76 +1,8 @@ -#include -#include -#include -#include -#include "Board.h" +#include "Engine.h" using namespace std; int main() { - cout<<"WELCOME\n"; - - cout<<"1. Play against AI?\n"; - cout<<"2. Play against a human?\n"; - //cout<<"CHANGE THIS TO PARSE THINGS\n"; - cout<<"Enter choice: \n"; - - int choice; - cin >> choice; - cout << "OK" << endl; - - Board b; - string move; - - bool gameOver = false; - vector record; - b.snapshot(record,b); - - while (gameOver != true) - { - gameOver = b.isGameOver(); - - while(b.getTurn() == 'O' ) - { - b.displayBoard(); - cout<<"\nEnter command: "; - cin>>move; - b.interpret(move,b); - } - - - vector possibleMoves = b.viewPossibleMoves(); - - if (choice == 1) - { - b.easyAI(); - } - - else - { - while(b.getTurn() == 'X' ) - { - b.displayBoard(); - cout<<"\nEnter command: "; - cout<<"OK\n"; - cin>>move; - b.interpret(move,b); - } - } - - //b.snapshot(); - gameOver = b.isGameOver(); - - b.snapshot(record,b); - } - - //for debugging purposes - cout<<"Record:"< Date: Sun, 25 Oct 2015 16:43:40 -0500 Subject: [PATCH 047/108] making an engine --- a.out | Bin 57314 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 a.out diff --git a/a.out b/a.out deleted file mode 100755 index 8a730d51cb6485ac10678766adc4402d368188f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57314 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 UwK+W@u#9n^yc9&u<=Wi;10b`djQ{`u From dc544a609b7daabb1e2f68786130d9777046d752 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Sun, 25 Oct 2015 16:53:32 -0500 Subject: [PATCH 048/108] finished engine --- Engine.cpp | 39 ++++++++++++++++++++------------------- Engine.h | 4 +++- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index cf7acf9..8b07782 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -6,7 +6,8 @@ Engine::Engine(){ - Board b = new Board(); + Board* brd = new Board(); + b = brd; } void Engine::startGame(){ @@ -25,45 +26,45 @@ void Engine::startGame(){ bool gameOver = false; vector record; - b.snapshot(record,b); + b->snapshot(record, *b); while (gameOver != true) { - gameOver = b.isGameOver(); + gameOver = b->isGameOver(); - while(b.getTurn() == 'O' ) + while(b->getTurn() == 'O' ) { - b.displayBoard(); + b->displayBoard(); cout<<"\nEnter command: "; cin>>move; - b.interpret(move,b); + b->interpret(move, *b); } - vector possibleMoves = b.viewPossibleMoves(); + vector possibleMoves = b->viewPossibleMoves(); if (choice == 1) { - cout << "a"; - b.easyAI(); + cout << "easyAI"; + easyAI(); } else { - while(b.getTurn() == 'X' ) + while(b->getTurn() == 'X' ) { - b.displayBoard(); + b->displayBoard(); cout<<"\nEnter command: "; cout<<"OK\n"; cin>>move; - b.interpret(move,b); + b->interpret(move, *b); } } - //b.snapshot(); - gameOver = b.isGameOver(); + //b->snapshot(); + gameOver = b->isGameOver(); - b.snapshot(record,b); + b->snapshot(record, *b); } //for debugging purposes @@ -77,11 +78,11 @@ void Engine::startGame(){ } } -void Board::easyAI() +void Engine::easyAI() { //1) see all possible movements - vector listOfMoves = viewPossibleMoves(); + vector listOfMoves = b->viewPossibleMoves(); //obvious moves if (false){ @@ -100,10 +101,10 @@ void Board::easyAI() } } -void Board::AI(){ +void Engine::AI(){ //do things here } -void Board::minMax(){ +void Engine::minMax(){ //do more things here } \ No newline at end of file diff --git a/Engine.h b/Engine.h index da6f589..8baa665 100755 --- a/Engine.h +++ b/Engine.h @@ -5,10 +5,12 @@ using namespace std; class Engine { - Board b; + Board* b; public: Engine(); void startGame(); void easyAI(); + void AI(); + void minMax(); }; \ No newline at end of file From 6fe1b333fde55a4bdd2b03dbde8870260b1f2421 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Mon, 26 Oct 2015 15:22:59 -0500 Subject: [PATCH 049/108] working on AI junk --- Engine.cpp | 41 ++++++++++++++++------------------------- test.cpp | 3 ++- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index 8b07782..e69caf0 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -18,7 +18,7 @@ void Engine::startGame(){ //cout<<"CHANGE THIS TO PARSE THINGS\n"; cout<<"Enter choice: \n"; - int choice; + int choice = -1; cin >> choice; cout << "OK" << endl; @@ -38,30 +38,13 @@ void Engine::startGame(){ cout<<"\nEnter command: "; cin>>move; b->interpret(move, *b); - } - - - vector possibleMoves = b->viewPossibleMoves(); - - if (choice == 1) - { - cout << "easyAI"; - easyAI(); } - else + while(b->getTurn() == 'X' ) { - while(b->getTurn() == 'X' ) - { - b->displayBoard(); - cout<<"\nEnter command: "; - cout<<"OK\n"; - cin>>move; - b->interpret(move, *b); - } + AI(); } - //b->snapshot(); gameOver = b->isGameOver(); b->snapshot(record, *b); @@ -81,12 +64,11 @@ void Engine::startGame(){ void Engine::easyAI() { //1) see all possible movements - vector listOfMoves = b->viewPossibleMoves(); //obvious moves if (false){ - return; + b->changeTurns(); } //random @@ -96,13 +78,22 @@ void Engine::easyAI() //3) execute movement int temp = randomChoice; - - move(listOfMoves[randomChoice]); + b->move(listOfMoves[randomChoice]); } } void Engine::AI(){ - //do things here + vector listOfMoves = b->viewPossibleMoves(); + + cout << "rows: \n\n"; + for (int i = 0; i < listOfMoves.size(); ++i){ + cout << "i: " << listOfMoves[i].row << "\n"; + } + + cout << "columns: \n\n"; + for (int i = 0; i < listOfMoves.size(); ++i){ + cout << "i: " << listOfMoves[i].column << "\n"; + } } void Engine::minMax(){ diff --git a/test.cpp b/test.cpp index a0f9d72..8b1eb77 100755 --- a/test.cpp +++ b/test.cpp @@ -4,5 +4,6 @@ using namespace std; int main() { - // + Engine e; + e.startGame(); } From 2dc2c70562be71efe2175eb79b0505e89e2a8f6a Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Mon, 26 Oct 2015 15:23:55 -0500 Subject: [PATCH 050/108] stable board & engine --- Engine.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index e69caf0..c5a1f4b 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -84,16 +84,7 @@ void Engine::easyAI() void Engine::AI(){ vector listOfMoves = b->viewPossibleMoves(); - - cout << "rows: \n\n"; - for (int i = 0; i < listOfMoves.size(); ++i){ - cout << "i: " << listOfMoves[i].row << "\n"; - } - - cout << "columns: \n\n"; - for (int i = 0; i < listOfMoves.size(); ++i){ - cout << "i: " << listOfMoves[i].column << "\n"; - } + // } void Engine::minMax(){ From 67a2997b8c74bd1c6e96f0a6ad31a76472fee5ac Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Mon, 26 Oct 2015 17:08:48 -0500 Subject: [PATCH 051/108] updating NOT STABLE --- Board.cpp | 117 ++++------------------------------------------------- Engine.cpp | 39 ++++++++++++++++-- Engine.h | 2 +- 3 files changed, 45 insertions(+), 113 deletions(-) diff --git a/Board.cpp b/Board.cpp index d407bd7..1b161d2 100755 --- a/Board.cpp +++ b/Board.cpp @@ -143,113 +143,7 @@ char Board::intToCharColumn(int input) //converts column number to int void Board::move(string inputMove) { moves jugada = parse(inputMove); - - int row = 8 - (jugada.row); - int kolumn = charToIntColumn(jugada.column); - int temp = boardArray[row][kolumn]; - int reflector = 1; - - if (row > 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound in move()!"< listOfMoves = b->viewPossibleMoves(); - // + Board* temp = b; + if (temp->getTurn() != 'X'){ + temp->changeTurns(); + } + //temp->changeTurns(); + //cout << "after: " << temp->getTurn() << "\n"; + + //only doing 1 branch right now because testing + /*for (int i = 0; i < listOfMoves.size(); ++i){ + minMax(temp, listOfMoves[i]); + }*/ + minMax(temp, listOfMoves[0]); + + b->move(listOfMoves[0]); + cout << "----------------------END AI FUNCTION----------------------\n"; } -void Engine::minMax(){ - //do more things here +void Engine::minMax(Board* temp, moves m){ + if (temp->isGameOver() == true){ + cout << "END OF PATH REACHED\n"; + return; + } + + else { + + cout << "m.row: " << m.row << "\n"; + cout << "charToIntColumn(m.column): " << temp->charToIntColumn(m.column) << "\n"; + cout << "m.moveType: " << m.moveType << "\n"; + cout << "temp->isThisMovePossible(stuff): " << temp->isThisMovePossible(m.row, temp->charToIntColumn(m.column), m.moveType) << "\n\n\n"; + + vector listOfMoves = temp->viewPossibleMoves(); + /*for (int i = 0; i < listOfMoves.size(); ++i){ + minMax(temp, listOfMoves[i]); + }*/ + + temp->displayBoard(); + } } \ No newline at end of file diff --git a/Engine.h b/Engine.h index 8baa665..4011d23 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - void minMax(); + void minMax(Board* temp, moves m); }; \ No newline at end of file From b03a041719e8f1aa2c3fc193da2a5f03b9f6c597 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 08:38:25 -0500 Subject: [PATCH 052/108] working, still not stable --- Board.cpp | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++--- Board.h | 2 + Engine.cpp | 51 ++++++++++++---------- Engine.h | 2 +- test.cpp | 4 ++ 5 files changed, 156 insertions(+), 29 deletions(-) diff --git a/Board.cpp b/Board.cpp index 1b161d2..0282dc8 100755 --- a/Board.cpp +++ b/Board.cpp @@ -81,6 +81,7 @@ bool Board::isGameOver() void Board::changeTurns() { + cout << "TURN IS BEING CHANGED\n"; if (turn == 'O') turn = 'X'; else turn = 'O'; } @@ -99,7 +100,7 @@ void Board::displayBoard() cout<<"|\n"; } cout<<'\n'< 8 || row < 0 || kolumn > 8 || kolumn < 0) + { + cout<<"ERROR: index out of bound in second move()!"<& inputVec, Board inputBoard) } inputVec.push_back(inputBoard); +} + +void Board::testPrint(){ + for (int i = 7; i >= 0; --i){ + for (int j = 7; j >= 0; --j){ + cout << boardArray[i][j] << " "; + } + + cout << "\n"; + } } \ No newline at end of file diff --git a/Board.h b/Board.h index eecdeb3..19cdc62 100755 --- a/Board.h +++ b/Board.h @@ -34,10 +34,12 @@ public: char intToCharColumn(int input); void move(string inputMove); void move(moves jugada); + void moveWOPrint(moves jugada); bool isThisMovePossible(int r, int c, string moveType); vector viewPossibleMoves(); string myToUpper(string input); void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); + void testPrint(); }; \ No newline at end of file diff --git a/Engine.cpp b/Engine.cpp index 72998de..5f4b602 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -85,41 +85,48 @@ void Engine::easyAI() void Engine::AI(){ cout << "----------------------BEGIN AI FUNCTION----------------------\n"; vector listOfMoves = b->viewPossibleMoves(); - Board* temp = b; - if (temp->getTurn() != 'X'){ - temp->changeTurns(); + Board temp = *b; + + //probably not needed, check later + if (temp.getTurn() != 'X'){ + cout << "a changing of turns is needed. \n"; + temp.changeTurns(); } - //temp->changeTurns(); - //cout << "after: " << temp->getTurn() << "\n"; //only doing 1 branch right now because testing /*for (int i = 0; i < listOfMoves.size(); ++i){ minMax(temp, listOfMoves[i]); }*/ - minMax(temp, listOfMoves[0]); - - b->move(listOfMoves[0]); + b->moveWOPrint(minMax(temp, listOfMoves[0], 0)); + b->displayBoard(); cout << "----------------------END AI FUNCTION----------------------\n"; } -void Engine::minMax(Board* temp, moves m){ - if (temp->isGameOver() == true){ +moves Engine::minMax(Board temp, moves m, int c){ + //testing purposes only + if (c > 1000){ + return m; + } + + if (temp.isGameOver() == true){ cout << "END OF PATH REACHED\n"; - return; + return m; } else { + if(temp.isThisMovePossible(8 - m.row, temp.charToIntColumn(m.column), m.moveType)){ + cout << "piece has been moved in minMax\n"; + temp.moveWOPrint(m); + } + cout << "c: " << c << "\n\n"; + cout << "current turn: " << temp.getTurn() << "\n"; + vector listOfMoves = temp.viewPossibleMoves(); + + for (int i = 0; i < listOfMoves.size(); ++i){ + cout << "listOfMoves[i]: (" << listOfMoves[i].row << ", " << listOfMoves[i].column << ")\n"; + //minMax(temp, listOfMoves[i]); + } - cout << "m.row: " << m.row << "\n"; - cout << "charToIntColumn(m.column): " << temp->charToIntColumn(m.column) << "\n"; - cout << "m.moveType: " << m.moveType << "\n"; - cout << "temp->isThisMovePossible(stuff): " << temp->isThisMovePossible(m.row, temp->charToIntColumn(m.column), m.moveType) << "\n\n\n"; - - vector listOfMoves = temp->viewPossibleMoves(); - /*for (int i = 0; i < listOfMoves.size(); ++i){ - minMax(temp, listOfMoves[i]); - }*/ - - temp->displayBoard(); + return minMax(temp, listOfMoves[0], ++c); } } \ No newline at end of file diff --git a/Engine.h b/Engine.h index 4011d23..463d05c 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - void minMax(Board* temp, moves m); + moves minMax(Board temp, moves m, int c); }; \ No newline at end of file diff --git a/test.cpp b/test.cpp index 8b1eb77..65f07dc 100755 --- a/test.cpp +++ b/test.cpp @@ -4,6 +4,10 @@ using namespace std; int main() { + //board testing + Board b; + + //engine testing Engine e; e.startGame(); } From 96ddcfd632ab7491473e0cf3e8427ba463ac5f7a Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 10:40:55 -0500 Subject: [PATCH 053/108] restructuring --- Board.cpp | 348 ++++++++++++++++------------------------------------- Board.h | 20 +-- Engine.cpp | 37 +++--- Piece.cpp | 69 +++++++++++ Piece.h | 25 ++++ test.cpp | 6 +- 6 files changed, 232 insertions(+), 273 deletions(-) create mode 100755 Piece.cpp create mode 100755 Piece.h diff --git a/Board.cpp b/Board.cpp index 0282dc8..b423b00 100755 --- a/Board.cpp +++ b/Board.cpp @@ -5,33 +5,42 @@ using namespace std; Board::Board() { - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'X'; + xpieces.push_back(new Piece(i, j, 'X')); + } + } + for (int i = 6; i < 8; ++i) { + for (int j = 0; j < 8; ++j) { + opieces.push_back(new Piece(i, j, 'O')); + } + } +} + +bool Board::elemInXs(int r, int c){ + for (int i = 0; i < xpieces.size(); ++i){ + if (xpieces[i]->getX() == r && xpieces[i]->getY() == c){ + return true; } } - - for (int i = 2; i < 6; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = '_'; + return false; +} + +bool Board::elemInOs(int r, int c){ + for (int i = 0; i < opieces.size(); ++i){ + if (opieces[i]->getX() == r && opieces[i]->getY() == c){ + return true; } } - - for (int i = 6; i <= 7; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'O'; - } - } + return false; } moves Board::parse(string input) { input = myToUpper(input); - cout<getX() == 0){ + cout<<"\n\n\nPlayer X wins!\n\n\n"<getX() == 7){ + cout<<"\n\n\nPlayer O wins!\n\n\n"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound in second move()!"< 8 || row < 0 || column > 8 || column < 0) { + cout<<"ERROR: index out of bound."<getType(); + cout << "temp: " << temp << "\n"; + + if (temp != turn || temp == '_') { + cout<<"ERROR: attempting to move an invalid piece."<moveFwd(); } - - if (jugada.moveType == "FWD") - { - - if(boardArray[row+reflector][kolumn] != '_') - { - cout<<"you can't move that piece forward"<getType() == temp) cout<<"you hate your own team or something? you can't do that!"<moveLeft(); } - else if (jugada.moveType == "RIGHT") - { - if (kolumn == 7) - { + else if (jugada.moveType == "RIGHT") { + if (column == 7) cout<<"Destination Spot out of range!"<getType() == temp) cout<<"you hate your own team or something? you can't do that!"<moveRight(); } - - else - { - cout<<"Unrecognized movetype!"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound in second move()!"<getType(); if (pieceToMove != turn) //trying to move invalid piece { - //cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n"; + cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n"; return false; } @@ -383,22 +233,26 @@ bool Board::isThisMovePossible(int r, int c, string moveType) { if (moveType == "FWD") { - - if (boardArray[r+reflector][c] == '_') return true; - else return false; - + if (boardArray[r+reflector][c]->getType() == '_') + return true; + else + return false; } else if (moveType == "RIGHT") { - if (boardArray[r+reflector][c+1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; + if (boardArray[r+reflector][c+1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) + return true; + else + return false; } else if (moveType == "LEFT") { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; + if (boardArray[r+reflector][c-1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) + return true; + else + return false; } else return false; @@ -413,7 +267,7 @@ vector Board::viewPossibleMoves() { for (int c = 0; c < 8; ++c) { - if (boardArray[r][c] == turn) + if (boardArray[r][c]->getType() == turn) { if (isThisMovePossible(r,c,"FWD")) { @@ -439,7 +293,7 @@ vector Board::viewPossibleMoves() return output; } - +*/ string Board::myToUpper(string input) { string output; @@ -456,11 +310,6 @@ string Board::myToUpper(string input) else output.push_back(input[i]); } - for (int i = 0; i < output.size(); ++i) - { - cout< record; @@ -510,7 +360,7 @@ void Board::interpret(string input, Board& tablero) //determines what kind of co else tablero.move(input); } - +*/ void Board::snapshot(vector& inputVec, Board inputBoard) { if (inputVec.size() == 10) @@ -526,12 +376,18 @@ void Board::snapshot(vector& inputVec, Board inputBoard) inputVec.push_back(inputBoard); } -void Board::testPrint(){ - for (int i = 7; i >= 0; --i){ - for (int j = 7; j >= 0; --j){ - cout << boardArray[i][j] << " "; - } - - cout << "\n"; +int Board::evaluate(char max, char min){ + //right now just evaluating number of pieces + if (max == 'X'){ + return (xpieces.size() - opieces.size()); + } + + else if (max == 'O'){ + return (opieces.size() - xpieces.size()); + } + + else { + cout << "Unidentified max, must be either X or O.\n"; + return 0; } } \ No newline at end of file diff --git a/Board.h b/Board.h index 19cdc62..8f3284c 100755 --- a/Board.h +++ b/Board.h @@ -2,6 +2,7 @@ #include #include +#include "Piece.h" using namespace std; @@ -18,13 +19,16 @@ struct moves { }; class Board { - char boardArray [8][8]; + //vector> boardArray; + vector xpieces; + vector opieces; + //char boardArray [8][8]; char turn = 'O'; public: Board(); - char elementAt(int r, int k) { return boardArray[r][k]; } - void modifyAt(int r, int k, char input) { boardArray[r][k] = input; } + bool elemInXs(int r, int c); + bool elemInOs(int r, int c); moves parse(string input); char getTurn() { return turn; } bool isGameOver(); @@ -32,14 +36,14 @@ public: void displayBoard(); int charToIntColumn(char input); char intToCharColumn(int input); - void move(string inputMove); - void move(moves jugada); + //void move(string inputMove); + //void move(moves jugada); void moveWOPrint(moves jugada); - bool isThisMovePossible(int r, int c, string moveType); - vector viewPossibleMoves(); + //bool isThisMovePossible(int r, int c, string moveType); + //vector viewPossibleMoves(); string myToUpper(string input); void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); - void testPrint(); + int evaluate(char max, char min); }; \ No newline at end of file diff --git a/Engine.cpp b/Engine.cpp index 5f4b602..c68e650 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -15,7 +15,6 @@ void Engine::startGame(){ cout<<"1. Play against AI?\n"; cout<<"2. Play against a human?\n"; - //cout<<"CHANGE THIS TO PARSE THINGS\n"; cout<<"Enter choice: \n"; int choice = -1; @@ -37,28 +36,22 @@ void Engine::startGame(){ b->displayBoard(); cout<<"\nEnter command: "; cin>>move; + cout << "\n"; b->interpret(move, *b); } - + + b->changeTurns(); + while(b->getTurn() == 'X' ) { - AI(); + cout << "\n\n\n\nit gets here\n\n\n\n"; + easyAI(); } gameOver = b->isGameOver(); b->snapshot(record, *b); } - - //for debugging purposes - cout<<"Record:"<moveWOPrint(minMax(temp, listOfMoves[0], 0)); + + //verification of correct turn + if (b->getTurn() != 'O'){ + cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; + } + b->displayBoard(); cout << "----------------------END AI FUNCTION----------------------\n"; } moves Engine::minMax(Board temp, moves m, int c){ //testing purposes only - if (c > 1000){ + if (c > 5){ return m; } @@ -123,10 +123,13 @@ moves Engine::minMax(Board temp, moves m, int c){ vector listOfMoves = temp.viewPossibleMoves(); for (int i = 0; i < listOfMoves.size(); ++i){ - cout << "listOfMoves[i]: (" << listOfMoves[i].row << ", " << listOfMoves[i].column << ")\n"; - //minMax(temp, listOfMoves[i]); + //return minMax(temp, listOfMoves[i]); } - + + //limited recursion return minMax(temp, listOfMoves[0], ++c); + + //testing + return m; } } \ No newline at end of file diff --git a/Piece.cpp b/Piece.cpp new file mode 100755 index 0000000..6796826 --- /dev/null +++ b/Piece.cpp @@ -0,0 +1,69 @@ +#include +#include "Piece.h" + +using namespace std; + +Piece::Piece(){ + x = -1; + y = -1; + type = '?'; +} + +Piece::Piece(int r, int c){ + x = r; + y = c; + type = '_'; +} + +Piece::Piece(int r, int c, char t){ + x = r; + y = c; + type = t; +} + +void Piece::moveFwd(){ + if (type == 'X'){ + x++; + } + + else if (type == 'O'){ + x--; + } + + else + cout << "Error: trying to move an empty piece forward."; +} + +void Piece::moveLeft(){ + if (type == 'X'){ + x++; + y--; + } + + else if (type == 'O'){ + x--; + y++; + } + + else + cout << "Error: trying to move an empty piece left."; +} + +void Piece::moveRight(){ + if (type == 'X'){ + x++; + y++; + } + + else if (type == 'O'){ + x--; + y--; + } + + else + cout << "Error: trying to move an empty piece left."; +} + +void Piece::isTaken(){ + // +} \ No newline at end of file diff --git a/Piece.h b/Piece.h new file mode 100755 index 0000000..60a3a00 --- /dev/null +++ b/Piece.h @@ -0,0 +1,25 @@ +#pragma once + +using namespace std; + +class Piece { + int x; + int y; + char type; + +public: + Piece(); + Piece(int r, int c); + Piece(int r, int c, char t); + void moveFwd(); + void moveLeft(); + void moveRight(); + int getX(){ return x; } + void setX(int r){ x = r; } + int getY(){ return y; } + void setY(int c){ y = c; } + char getType(){ return type; } + void setType(char t){ type = t; } + void makeEmpty(){ type = '_'; } + void isTaken(); +}; \ No newline at end of file diff --git a/test.cpp b/test.cpp index 65f07dc..fd5452f 100755 --- a/test.cpp +++ b/test.cpp @@ -1,3 +1,4 @@ +#include "Board.h" #include "Engine.h" using namespace std; @@ -6,8 +7,9 @@ int main() { //board testing Board b; + b.displayBoard(); //engine testing - Engine e; - e.startGame(); + //Engine e; + //e.startGame(); } From 010a85325b3501179eca6610d2f4d9003101269d Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 11:31:44 -0500 Subject: [PATCH 054/108] stable restructure, not finished --- Board.cpp | 251 ++++++++++++++++++++++++++--------------------------- Board.h | 13 +-- Engine.cpp | 37 ++++---- Piece.h | 1 - test.cpp | 5 +- 5 files changed, 151 insertions(+), 156 deletions(-) diff --git a/Board.cpp b/Board.cpp index b423b00..f02ebbb 100755 --- a/Board.cpp +++ b/Board.cpp @@ -8,18 +8,22 @@ Board::Board() { for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { xpieces.push_back(new Piece(i, j, 'X')); + pieces.push_back(new Piece(i, j, 'X')); } } + for (int i = 6; i < 8; ++i) { for (int j = 0; j < 8; ++j) { opieces.push_back(new Piece(i, j, 'O')); + pieces.push_back(new Piece(i, j, 'O')); } } } -bool Board::elemInXs(int r, int c){ - for (int i = 0; i < xpieces.size(); ++i){ - if (xpieces[i]->getX() == r && xpieces[i]->getY() == c){ +//make this efficient! +bool Board::isPiece(int r, int c){ + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ return true; } } @@ -27,18 +31,18 @@ bool Board::elemInXs(int r, int c){ return false; } -bool Board::elemInOs(int r, int c){ - for (int i = 0; i < opieces.size(); ++i){ - if (opieces[i]->getX() == r && opieces[i]->getY() == c){ - return true; +//make this efficient! +Piece* Board::getPiece(int r, int c){ + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + return pieces[i]; } } - return false; + return new Piece(); } - -moves Board::parse(string input) -{ + +moves Board::parse(string input){ input = myToUpper(input); int temp1; @@ -66,43 +70,40 @@ moves Board::parse(string input) moves output(temp1, temp2, temp3); return output; - } -bool Board::isGameOver() -{ +bool Board::isGameOver(){ for (int i = 0; i < xpieces.size(); ++i){ - if (xpieces[i]->getX() == 0){ + if (xpieces[i]->getX() == 7){ cout<<"\n\n\nPlayer X wins!\n\n\n"<getX() == 7){ + if (opieces[i]->getX() == 0){ cout<<"\n\n\nPlayer O wins!\n\n\n"<getType() == 'X') + cout << "|" << "X"; + else + cout << "|" << "O"; else cout << "|" << "_"; } @@ -114,8 +115,7 @@ void Board::displayBoard() cout<<"turn: "< 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getType(); - cout << "temp: " << temp << "\n"; + Piece* piece; + if (isPiece(row, column)) + piece = getPiece(row, column); - if (temp != turn || temp == '_') { - cout<<"ERROR: attempting to move an invalid piece."<getType() != turn) { + cout<<"ERROR: attempting to move the wrong side's piece.\n"; } else { if (jugada.moveType == "FWD") { - boardArray[row][column]->moveFwd(); + piece->moveFwd(); } else if (jugada.moveType == "LEFT") { - if (column == 0) - cout<<"Destination Spot out of range!"<getType() == temp) - cout<<"you hate your own team or something? you can't do that!"<moveLeft(); + //add error checking + piece->moveLeft(); } else if (jugada.moveType == "RIGHT") { - if (column == 7) - cout<<"Destination Spot out of range!"<getType() == temp) - cout<<"you hate your own team or something? you can't do that!"<moveRight(); + //add error checking + piece->moveRight(); } } } -*/ -//FIX THIS -//take out the prints and turn changes from move -void Board::moveWOPrint(moves jugada) -{ - // -} -/* -bool Board::isThisMovePossible(int r, int c, string moveType) -{ - char pieceToMove = boardArray[r][c]->getType(); - if (pieceToMove != turn) //trying to move invalid piece - { +bool Board::isThisMovePossible(int r, int c, string moveType){ + Piece* piece; + if (isPiece(r, c)) + piece = getPiece(r, c); + else + return false; + + if (piece->getType() != turn) { cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n"; return false; } - int reflector = 1; - - if (pieceToMove == 'O') - { - reflector *= -1; - } - - else - { - if (moveType == "FWD") - { - if (boardArray[r+reflector][c]->getType() == '_') + else{ + int reflector = 1; + + if (piece->getType() == 'O') + reflector *= -1; + + if (moveType == "FWD"){ + if (isPiece(r+reflector, c)) return true; else return false; } - else if (moveType == "RIGHT") - { - if (boardArray[r+reflector][c+1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) + else if (moveType == "RIGHT"){ + if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) return true; else return false; } - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) + else if (moveType == "LEFT"){ + if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0)) return true; else return false; @@ -259,43 +237,62 @@ bool Board::isThisMovePossible(int r, int c, string moveType) } } -vector Board::viewPossibleMoves() -{ +vector Board::viewPossibleMoves(){ + int r, c = -1; vector output; - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c]->getType() == turn) + if (turn == 'X'){ + for (int i = 0; i < xpieces.size(); ++i){ + r = xpieces[i]->getX(); + c = xpieces[i]->getY(); + if (isThisMovePossible(r, c, "FWD")) { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - + moves temp(8-r,intToCharColumn(c+1), "FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1), "LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1), "RIGHT"); + output.push_back(temp); + } + } + } + + else { + for (int i = 0; i < opieces.size(); ++i){ + r = opieces[i]->getX(); + c = opieces[i]->getY(); + if (isThisMovePossible(r, c, "FWD")) + { + moves temp(8-r,intToCharColumn(c+1), "FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1), "LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1), "RIGHT"); + output.push_back(temp); } } } return output; } -*/ -string Board::myToUpper(string input) -{ + +string Board::myToUpper(string input){ string output; for (int i = 0 ; i < input.size(); ++i) @@ -314,8 +311,7 @@ string Board::myToUpper(string input) } -void Board::undo(Board& tablero) -{ +void Board::undo(Board& tablero){ vector record; if (record.size() < 2) @@ -336,9 +332,8 @@ void Board::undo(Board& tablero) record.pop_back(); } } -/* -void Board::interpret(string input, Board& tablero) //determines what kind of command its input is -{ + +void Board::interpret(string input, Board& tablero){ vector record; input = myToUpper(input); @@ -360,9 +355,8 @@ void Board::interpret(string input, Board& tablero) //determines what kind of co else tablero.move(input); } -*/ -void Board::snapshot(vector& inputVec, Board inputBoard) -{ + +void Board::snapshot(vector& inputVec, Board inputBoard){ if (inputVec.size() == 10) { inputVec.erase(inputVec.begin()); @@ -390,4 +384,9 @@ int Board::evaluate(char max, char min){ cout << "Unidentified max, must be either X or O.\n"; return 0; } -} \ No newline at end of file +} + + + + + diff --git a/Board.h b/Board.h index 8f3284c..c4bf1f6 100755 --- a/Board.h +++ b/Board.h @@ -22,13 +22,14 @@ class Board { //vector> boardArray; vector xpieces; vector opieces; + vector pieces; //char boardArray [8][8]; char turn = 'O'; public: Board(); - bool elemInXs(int r, int c); - bool elemInOs(int r, int c); + bool isPiece(int r, int c); + Piece* getPiece(int r, int c); moves parse(string input); char getTurn() { return turn; } bool isGameOver(); @@ -36,11 +37,11 @@ public: void displayBoard(); int charToIntColumn(char input); char intToCharColumn(int input); - //void move(string inputMove); - //void move(moves jugada); + void move(string inputMove); + void move(moves jugada); void moveWOPrint(moves jugada); - //bool isThisMovePossible(int r, int c, string moveType); - //vector viewPossibleMoves(); + bool isThisMovePossible(int r, int c, string moveType); + vector viewPossibleMoves(); string myToUpper(string input); void undo(Board& tablero); void interpret(string input, Board& tablero); diff --git a/Engine.cpp b/Engine.cpp index c68e650..3aebf01 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -38,13 +38,11 @@ void Engine::startGame(){ cin>>move; cout << "\n"; b->interpret(move, *b); + b->changeTurns(); } - b->changeTurns(); - while(b->getTurn() == 'X' ) { - cout << "\n\n\n\nit gets here\n\n\n\n"; easyAI(); } @@ -56,23 +54,22 @@ void Engine::startGame(){ void Engine::easyAI() { - //1) see all possible movements vector listOfMoves = b->viewPossibleMoves(); - //obvious moves - if (false){ - b->changeTurns(); - } - - //random - else { - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - int temp = randomChoice; - b->move(listOfMoves[randomChoice]); - } + cout << listOfMoves[0].row << "\n"; + cout << listOfMoves[0].column << "\n"; + cout << listOfMoves[0].moveType << "\n\n"; + b->move(listOfMoves[0]); + b->changeTurns(); + /* + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + + //3) execute movement + int temp = randomChoice; + b->move(listOfMoves[randomChoice]); + b->changeTurns(); + */ } void Engine::AI(){ @@ -91,7 +88,7 @@ void Engine::AI(){ minMax(temp, listOfMoves[i]); }*/ - b->moveWOPrint(minMax(temp, listOfMoves[0], 0)); + //b->moveWOPrint(minMax(temp, listOfMoves[0], 0)); //verification of correct turn if (b->getTurn() != 'O'){ @@ -116,7 +113,7 @@ moves Engine::minMax(Board temp, moves m, int c){ else { if(temp.isThisMovePossible(8 - m.row, temp.charToIntColumn(m.column), m.moveType)){ cout << "piece has been moved in minMax\n"; - temp.moveWOPrint(m); + //temp.moveWOPrint(m); } cout << "c: " << c << "\n\n"; cout << "current turn: " << temp.getTurn() << "\n"; diff --git a/Piece.h b/Piece.h index 60a3a00..cc27d24 100755 --- a/Piece.h +++ b/Piece.h @@ -19,7 +19,6 @@ public: int getY(){ return y; } void setY(int c){ y = c; } char getType(){ return type; } - void setType(char t){ type = t; } void makeEmpty(){ type = '_'; } void isTaken(); }; \ No newline at end of file diff --git a/test.cpp b/test.cpp index fd5452f..ba030f6 100755 --- a/test.cpp +++ b/test.cpp @@ -7,9 +7,8 @@ int main() { //board testing Board b; - b.displayBoard(); //engine testing - //Engine e; - //e.startGame(); + Engine e; + e.startGame(); } From 2146af2581432b1ac82de10de1eaa503afeaa610 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 11:34:20 -0500 Subject: [PATCH 055/108] forgot to remove a comment --- Engine.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index 3aebf01..4a83431 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -56,20 +56,12 @@ void Engine::easyAI() { vector listOfMoves = b->viewPossibleMoves(); - cout << listOfMoves[0].row << "\n"; - cout << listOfMoves[0].column << "\n"; - cout << listOfMoves[0].moveType << "\n\n"; - b->move(listOfMoves[0]); - b->changeTurns(); - /* srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element + int randomChoice = rand() % (listOfMoves.size()-1) - 0; - //3) execute movement int temp = randomChoice; b->move(listOfMoves[randomChoice]); b->changeTurns(); - */ } void Engine::AI(){ From c037ea48cc798c57560a0c9ec507836197847f5b Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 11:51:37 -0500 Subject: [PATCH 056/108] finished board to string --- Board.cpp | 28 ++++++++++++++++++++++++++++ Board.h | 1 + test.cpp | 1 + 3 files changed, 30 insertions(+) diff --git a/Board.cpp b/Board.cpp index f02ebbb..8051c3c 100755 --- a/Board.cpp +++ b/Board.cpp @@ -114,6 +114,34 @@ void Board::displayBoard(){ cout<<'\n'<getType() == 'X') + output += "|X"; + else + output += "|O"; + else + output += "|_"; + } + + output += "|\n"; + } + + output += "\n\nturn: "; + output += turn; + output += "\n"; + + return output; +} int Board::charToIntColumn(char input){ int kolumn; diff --git a/Board.h b/Board.h index c4bf1f6..69bfe68 100755 --- a/Board.h +++ b/Board.h @@ -35,6 +35,7 @@ public: bool isGameOver(); void changeTurns(); void displayBoard(); + string boardToString(); int charToIntColumn(char input); char intToCharColumn(int input); void move(string inputMove); diff --git a/test.cpp b/test.cpp index ba030f6..2851e14 100755 --- a/test.cpp +++ b/test.cpp @@ -7,6 +7,7 @@ int main() { //board testing Board b; + cout << b.boardToString(); //engine testing Engine e; From 9777a662f43300807e5f43021b3a680628ef6999 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 11:56:25 -0500 Subject: [PATCH 057/108] Added makefile for test.cpp --- makefile | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 makefile diff --git a/makefile b/makefile new file mode 100755 index 0000000..fc3a027 --- /dev/null +++ b/makefile @@ -0,0 +1,9 @@ +# makefile + +all: test + +test: test.o + g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o + +test.o: test.cpp Engine.cpp Board.cpp Piece.cpp + g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp \ No newline at end of file From 6a867cd7809ab245eef44dca4ae4c7c83bc0fdba Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 12:26:13 -0500 Subject: [PATCH 058/108] Nyeh --- Board.cpp | 12 ++++++------ Server.cpp | 6 ++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Board.cpp b/Board.cpp index 8051c3c..44900bf 100755 --- a/Board.cpp +++ b/Board.cpp @@ -242,23 +242,23 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ if (moveType == "FWD"){ if (isPiece(r+reflector, c)) - return true; - else return false; + else + return true; } else if (moveType == "RIGHT"){ if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) - return true; - else return false; + else + return true; } else if (moveType == "LEFT"){ if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0)) - return true; - else return false; + else + return true; } else return false; diff --git a/Server.cpp b/Server.cpp index de4e231..348f59a 100644 --- a/Server.cpp +++ b/Server.cpp @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { b.displayBoard();//Display the board on the server string boardState = b.boardToString(); - final_move = b.boardToString(); + //final_move = b.boardToString(); write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) cout<<"\nWaiting for client: "; n = read(newsockfd,buffer,255); @@ -126,14 +126,16 @@ int main(int argc, char *argv[]) b.easyAI(); } - + /* string final_move = b.boardToString(); write(newsockfd, final_move.c_str(), final_move.length());//Display the board to the client (line by line) write(newsockfd, final_move.c_str(), final_move.length()); cout << "\n\nGAME OVER!!!"; usleep(1); + */ close(newsockfd); close(sockfd); + break; } return 0; From 864b354e7f7f4036fa3983604ee6d4f10f84c56c Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 12:55:23 -0500 Subject: [PATCH 059/108] updating --- Board.cpp | 31 ++++++++++++++++++++++++++----- Board.h | 5 +++-- Engine.cpp | 27 +++++++++++++++------------ Engine.h | 2 +- a.out | Bin 0 -> 81527 bytes test.cpp | 3 +-- 6 files changed, 46 insertions(+), 22 deletions(-) create mode 100755 a.out diff --git a/Board.cpp b/Board.cpp index 8051c3c..a64bc7a 100755 --- a/Board.cpp +++ b/Board.cpp @@ -5,21 +5,42 @@ using namespace std; Board::Board() { + Piece* temp; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { - xpieces.push_back(new Piece(i, j, 'X')); - pieces.push_back(new Piece(i, j, 'X')); + temp = new Piece(i, j, 'X'); + xpieces.push_back(temp); + pieces.push_back(temp); } } for (int i = 6; i < 8; ++i) { for (int j = 0; j < 8; ++j) { - opieces.push_back(new Piece(i, j, 'O')); - pieces.push_back(new Piece(i, j, 'O')); + temp = new Piece(i, j, 'O'); + opieces.push_back(temp); + pieces.push_back(temp); } } } +Board::Board(const Board& b) { + vector xp = b.getXPieces(); + vector op = b.getOPieces(); + Piece* temp; + + for (int i = 0; i < xp.size(); ++i) { + temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); + xpieces.push_back(temp); + pieces.push_back(temp); + } + + for (int i = 0; i < op.size(); ++i) { + temp = new Piece(op[i]->getX(), op[i]->getY(), 'O'); + opieces.push_back(temp); + pieces.push_back(temp); + } +} + //make this efficient! bool Board::isPiece(int r, int c){ for (int i = 0; i < pieces.size(); ++i){ @@ -92,7 +113,7 @@ void Board::changeTurns(){ if (turn == 'O') turn = 'X'; else turn = 'O'; } - + void Board::displayBoard(){ cout << "; A B C D E F G H"<> boardArray; vector xpieces; vector opieces; vector pieces; - //char boardArray [8][8]; char turn = 'O'; public: Board(); + Board(const Board& b); bool isPiece(int r, int c); Piece* getPiece(int r, int c); + vector getXPieces() const { return xpieces; } + vector getOPieces() const { return opieces; } moves parse(string input); char getTurn() { return turn; } bool isGameOver(); diff --git a/Engine.cpp b/Engine.cpp index 4a83431..23a3161 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -43,7 +43,7 @@ void Engine::startGame(){ while(b->getTurn() == 'X' ) { - easyAI(); + AI(); } gameOver = b->isGameOver(); @@ -67,12 +67,12 @@ void Engine::easyAI() void Engine::AI(){ cout << "----------------------BEGIN AI FUNCTION----------------------\n"; vector listOfMoves = b->viewPossibleMoves(); - Board temp = *b; + Board* temp = new Board(*b); //probably not needed, check later - if (temp.getTurn() != 'X'){ + if (temp->getTurn() != 'X'){ cout << "a changing of turns is needed. \n"; - temp.changeTurns(); + temp->changeTurns(); } //only doing 1 branch right now because testing @@ -80,7 +80,8 @@ void Engine::AI(){ minMax(temp, listOfMoves[i]); }*/ - //b->moveWOPrint(minMax(temp, listOfMoves[0], 0)); + b->move(minMax(temp, listOfMoves[0], 0)); + b->changeTurns(); //verification of correct turn if (b->getTurn() != 'O'){ @@ -91,30 +92,32 @@ void Engine::AI(){ cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(Board temp, moves m, int c){ +moves Engine::minMax(Board* temp, moves m, int c){ //testing purposes only - if (c > 5){ + if (c > 5){ return m; } - if (temp.isGameOver() == true){ + if (temp->isGameOver() == true){ cout << "END OF PATH REACHED\n"; return m; } else { - if(temp.isThisMovePossible(8 - m.row, temp.charToIntColumn(m.column), m.moveType)){ + if(temp->isThisMovePossible(8 - m.row, temp->charToIntColumn(m.column), m.moveType)){ cout << "piece has been moved in minMax\n"; - //temp.moveWOPrint(m); + temp->move(m); + temp->changeTurns(); } cout << "c: " << c << "\n\n"; - cout << "current turn: " << temp.getTurn() << "\n"; - vector listOfMoves = temp.viewPossibleMoves(); + cout << "current turn: " << temp->getTurn() << "\n"; + vector listOfMoves = temp->viewPossibleMoves(); for (int i = 0; i < listOfMoves.size(); ++i){ //return minMax(temp, listOfMoves[i]); } + temp->displayBoard(); //limited recursion return minMax(temp, listOfMoves[0], ++c); diff --git a/Engine.h b/Engine.h index 463d05c..97efbf8 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - moves minMax(Board temp, moves m, int c); + moves minMax(Board* temp, moves m, int c); }; \ No newline at end of file diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..7410dc4a19688015a2d0f8038482b10d8c65d97c GIT binary patch literal 81527 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 Bm5=}c literal 0 HcmV?d00001 diff --git a/test.cpp b/test.cpp index 2851e14..993ed73 100755 --- a/test.cpp +++ b/test.cpp @@ -6,8 +6,7 @@ using namespace std; int main() { //board testing - Board b; - cout << b.boardToString(); + //Board b; //engine testing Engine e; From b9b1ba07642ece632e5884dfb64b6114dcdb2de8 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 13:00:38 -0500 Subject: [PATCH 060/108] remove a.out --- a.out | Bin 81527 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 a.out diff --git a/a.out b/a.out deleted file mode 100755 index 7410dc4a19688015a2d0f8038482b10d8c65d97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81527 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 Bm5=}c From e969058b96b6e40b2de07e66ab5ead2582c86283 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 13:48:45 -0500 Subject: [PATCH 061/108] Fixing board errors. --- Board.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++----- Engine.cpp | 2 ++ Piece.cpp | 2 +- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/Board.cpp b/Board.cpp index 44900bf..44e5ee9 100755 --- a/Board.cpp +++ b/Board.cpp @@ -94,6 +94,15 @@ void Board::changeTurns(){ } void Board::displayBoard(){ + /* + cout << "Debugging:\n"; + for (int i = 0; i < pieces.size(); ++i){ + if(i%8 == 0) + cout << "\n"; + cout << pieces[i]->getX() << " " << pieces[i]->getY() << " " << pieces[i]->getType() << "\t"; + } + cout << "Debugging:\n\n"; + */ cout << "; A B C D E F G H"< 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<moveFwd(); + if(isPiece(row--, column)) { + if(getPiece(row--, column)->getType() != piece->getType()) { + getPiece(row--, column)->isTaken(); + piece->moveFwd(); + } + else { + cout << "Invalid move, there is a piece there.\n"; + return; + } + } + else { + piece->moveFwd(); + } } else if (jugada.moveType == "LEFT") { //add error checking - piece->moveLeft(); + if(isPiece(row--, column--)) { + if(getPiece(row--, column--)->getType() != piece->getType()) { + getPiece(row--, column--)->isTaken(); + piece->moveLeft(); + } + else { + cout << "Invalid move, there is a piece there.\n"; + return; + } + } + else { + piece->moveLeft(); + } } else if (jugada.moveType == "RIGHT") { //add error checking - piece->moveRight(); + if(isPiece(row--, column++)) { + if(getPiece(row--, column++)->getType() != piece->getType()) { + getPiece(row--, column++)->isTaken(); + piece->moveRight(); + } + else { + cout << "Invalid move, there is a piece there.\n"; + return; + } + } + else { + piece->moveRight(); + } } } } diff --git a/Engine.cpp b/Engine.cpp index 4a83431..9e12925 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -41,6 +41,8 @@ void Engine::startGame(){ b->changeTurns(); } + cout << "TEST\n\n"; + while(b->getTurn() == 'X' ) { easyAI(); diff --git a/Piece.cpp b/Piece.cpp index 6796826..a223740 100755 --- a/Piece.cpp +++ b/Piece.cpp @@ -65,5 +65,5 @@ void Piece::moveRight(){ } void Piece::isTaken(){ - // + cout << getX() << " " << getY() << "\n\n"; } \ No newline at end of file From f10c4e7c18469c95d9fa0b8721030edd1ee098e9 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Tue, 27 Oct 2015 14:48:03 -0500 Subject: [PATCH 062/108] this will work with functioning mechanics --- Board.cpp | 30 ++++++++++++++++++------------ Engine.cpp | 3 ++- test.cpp | 4 ++-- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Board.cpp b/Board.cpp index a64bc7a..d01b709 100755 --- a/Board.cpp +++ b/Board.cpp @@ -201,13 +201,13 @@ char Board::intToCharColumn(int input){ } void Board::move(string inputMove){ - moves jugada = parse(inputMove); - move(jugada); + moves m = parse(inputMove); + move(m); } -void Board::move(moves jugada){ - int row = 8 - (jugada.row); - int column = charToIntColumn(jugada.column); +void Board::move(moves m){ + int row = 8 - (m.row); + int column = charToIntColumn(m.column); if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<moveFwd(); } - else if (jugada.moveType == "LEFT") { + else if (m.moveType == "LEFT") { //add error checking piece->moveLeft(); } - else if (jugada.moveType == "RIGHT") { + else if (m.moveType == "RIGHT") { //add error checking piece->moveRight(); } @@ -262,21 +268,21 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ reflector *= -1; if (moveType == "FWD"){ - if (isPiece(r+reflector, c)) + if (!isPiece(r + reflector, c)) return true; else return false; } else if (moveType == "RIGHT"){ - if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) + if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) return true; else return false; } else if (moveType == "LEFT"){ - if (isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0)) + if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0)) return true; else return false; @@ -314,7 +320,7 @@ vector Board::viewPossibleMoves(){ } } - else { + else if (turn == 'X') { for (int i = 0; i < opieces.size(); ++i){ r = opieces[i]->getX(); c = opieces[i]->getY(); diff --git a/Engine.cpp b/Engine.cpp index 23a3161..45c2229 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -60,6 +60,7 @@ void Engine::easyAI() int randomChoice = rand() % (listOfMoves.size()-1) - 0; int temp = randomChoice; + cout << "easy AI move: " << listOfMoves[randomChoice].row << listOfMoves[randomChoice].column << listOfMoves[randomChoice].moveType << "\n"; b->move(listOfMoves[randomChoice]); b->changeTurns(); } @@ -93,7 +94,7 @@ void Engine::AI(){ } moves Engine::minMax(Board* temp, moves m, int c){ - //testing purposes only + //testing purposes only, c = finite depth if (c > 5){ return m; } diff --git a/test.cpp b/test.cpp index 993ed73..88d7f86 100755 --- a/test.cpp +++ b/test.cpp @@ -6,8 +6,8 @@ using namespace std; int main() { //board testing - //Board b; - + Board b; + //engine testing Engine e; e.startGame(); From aa50abcaff12fb86de18de3aa13a85a39fbca446 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 14:49:03 -0500 Subject: [PATCH 063/108] Fixing moves. --- Board.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Board.cpp b/Board.cpp index 44e5ee9..fbdf90c 100755 --- a/Board.cpp +++ b/Board.cpp @@ -198,7 +198,7 @@ void Board::move(moves jugada){ int row = 8 - (jugada.row); int column = charToIntColumn(jugada.column); - cout << row << " " << column << "\n\n"; + //cout << row << " " << column << "\n\n"; if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getX() << piece->getY() << "\n\n"; if (piece->getType() != turn) { cout<<"ERROR: attempting to move the wrong side's piece.\n"; } else { if (jugada.moveType == "FWD") { - if(isPiece(row--, column)) { - if(getPiece(row--, column)->getType() != piece->getType()) { - getPiece(row--, column)->isTaken(); - piece->moveFwd(); - } - else { - cout << "Invalid move, there is a piece there.\n"; - return; - } + if(piece->getType() == 'O') { + row--; + } + else { + row++; + } + if(isPiece(row, column)) { + cout << "Invalid move, there is a piece there.\n"; + return; } else { piece->moveFwd(); From b94ebe26f623863b9bf17954c7346fba5e5d6c6c Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 17:30:33 -0500 Subject: [PATCH 064/108] All mechanics errors fixed. Invalid moves no longer tolerated. --- Board.cpp | 215 +++++++++++++++++++++++++++++++++++------------------ Board.h | 7 +- Engine.cpp | 57 ++++++++------ Engine.h | 2 +- Piece.cpp | 4 +- 5 files changed, 184 insertions(+), 101 deletions(-) diff --git a/Board.cpp b/Board.cpp index 27cfae6..7c89ecd 100755 --- a/Board.cpp +++ b/Board.cpp @@ -6,6 +6,7 @@ using namespace std; Board::Board() { Piece* temp; + bool valid = false; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { temp = new Piece(i, j, 'X'); @@ -27,6 +28,7 @@ Board::Board(const Board& b) { vector xp = b.getXPieces(); vector op = b.getOPieces(); Piece* temp; + bool valid = false; for (int i = 0; i < xp.size(); ++i) { temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); @@ -41,6 +43,18 @@ Board::Board(const Board& b) { } } +void Board::setValidFalse() { + valid = false; +} + +void Board::setValidTrue() { + valid = true; +} + +bool Board::isValid() { + return valid; +} + //make this efficient! bool Board::isPiece(int r, int c){ for (int i = 0; i < pieces.size(); ++i){ @@ -52,6 +66,31 @@ bool Board::isPiece(int r, int c){ return false; } +void Board::isTaken(int r, int c) { + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + if(pieces[i]->getType() == 'O') { + for(int x = 0; x < opieces.size(); ++x) { + if (opieces[x]->getX() == r && opieces[x]->getY() == c) { + opieces.erase(opieces.begin() + x); + //break; + } + } + } + else { + for(int x = 0; x < xpieces.size(); ++x) { + if (xpieces[x]->getX() == r && xpieces[x]->getY() == c) { + xpieces.erase(xpieces.begin() + x); + //break; + } + } + } + pieces.erase(pieces.begin() + i); + break; + } + } +} + //make this efficient! Piece* Board::getPiece(int r, int c){ for (int i = 0; i < pieces.size(); ++i){ @@ -67,10 +106,10 @@ moves Board::parse(string input){ input = myToUpper(input); int temp1; - char temp2; + int temp2; string temp3; - temp2 = input[0]; + temp2 = input[0] - 'A'; temp1 = input[1] - '0'; if (input[3] == 'L') @@ -212,14 +251,15 @@ char Board::intToCharColumn(int input){ void Board::move(string inputMove){ moves m = parse(inputMove); + cout << "MOVE: " << m.row << " " << m.column << " " << m.moveType << "\n\n"; move(m); } void Board::move(moves m){ int row = 8 - (m.row); - int column = charToIntColumn(m.column); + int column = m.column; - //cout << row << " " << column << "\n\n"; + cout << "INSIDE MOVE: " << row << " " << column << "\n\n"; if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getType() == 'O') { - row--; + else { + if(isThisMovePossible(row, column, m.moveType)) + { + if (m.moveType == "FWD") { + piece->moveFwd(); } - else { - row++; - } - if(isPiece(row, column)) { - cout << "Invalid move, there is a piece there.\n"; - return; - } - else { - piece->moveFwd(); - } - /* -======= - if (!(isThisMovePossible(row, column, m.moveType))){ - cout << "Unable to move: impossible move.\n"; - //add a try again - return; - } - - if (m.moveType == "FWD") { - piece->moveFwd(); ->>>>>>> beccadev -*/ - } - - else if (m.moveType == "LEFT") { - //add error checking - if(isPiece(row--, column--)) { - if(getPiece(row--, column--)->getType() != piece->getType()) { - getPiece(row--, column--)->isTaken(); + + else if (m.moveType == "LEFT") { + //add error checking + if(piece->getType() == 'O') { + row--; + column--; + } + else { + row++; + column--; + } + if(isPiece(row, column)) { + if(getPiece(row, column)->getType() != piece->getType()) { + isTaken(row, column); + piece->moveLeft(); + } + } + else { piece->moveLeft(); } - else { - cout << "Invalid move, there is a piece there.\n"; - return; + } + + else if (m.moveType == "RIGHT") { + //add error checking + //cout << "TESTING??\n\n"; + if(piece->getType() == 'O') { + row--; + column++; } - } - else { - piece->moveLeft(); - } - } - - else if (m.moveType == "RIGHT") { - //add error checking - if(isPiece(row--, column++)) { - if(getPiece(row--, column++)->getType() != piece->getType()) { - getPiece(row--, column++)->isTaken(); + else { + row++; + column++; + } + if(isPiece(row, column)) { + if(getPiece(row, column)->getType() != piece->getType()) { + isTaken(row, column); + piece->moveRight(); + } + } + else { + cout << piece->getX() << " " << piece->getY() << "\n\n"; piece->moveRight(); - } - else { - cout << "Invalid move, there is a piece there.\n"; - return; + cout << piece->getX() << " " << piece->getY() << "\n\n"; } } - else { - piece->moveRight(); - } + setValidTrue(); + } + else + { + cout << "Invalid move.\n\n"; + setValidFalse(); } } } bool Board::isThisMovePossible(int r, int c, string moveType){ Piece* piece; + Piece* temp; if (isPiece(r, c)) piece = getPiece(r, c); else @@ -321,27 +358,57 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ int reflector = 1; if (piece->getType() == 'O') - reflector *= -1; + reflector = -1; if (moveType == "FWD"){ if (!isPiece(r + reflector, c)) - return true; - else + return true; + else return false; } - else if (moveType == "RIGHT"){ - if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) - return true; - else + else if (moveType == "RIGHT"){ + temp = getPiece(r + reflector, c+1); + if(c < 7) { + if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) { + //cout << "What.\n\n"; + return true; + } + else if(temp->getType() != piece->getType()) { + char a = temp->getType(); + char b = piece->getType(); + cout << a << " " << b << "\n\n"; + return true; + } + else { + return false; + } + } + else { return false; + } } - else if (moveType == "LEFT"){ - if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0)) - return true; - else + else if (moveType == "LEFT"){ + temp = getPiece(r + reflector, c-1); + if(c > 0) { + if (!isPiece(r+reflector, c-1) && (r+reflector >= 0) && (r+reflector <= 7)) { + //cout << "What.\n\n"; + return true; + } + else if(temp->getType() != piece->getType()) { + char a = temp->getType(); + char b = piece->getType(); + cout << a << " " << b << "\n\n"; + return true; + } + else { + return false; + } + } + else { return false; + } } else return false; @@ -358,25 +425,25 @@ vector Board::viewPossibleMoves(){ c = xpieces[i]->getY(); if (isThisMovePossible(r, c, "FWD")) { - moves temp(8-r,intToCharColumn(c+1), "FWD"); + moves temp(8-r,c, "FWD"); output.push_back(temp); } if (isThisMovePossible(r,c,"LEFT")) { - moves temp(8-r,intToCharColumn(c+1), "LEFT"); + moves temp(8-r,c, "LEFT"); output.push_back(temp); } if (isThisMovePossible(r,c,"RIGHT")) { - moves temp(8-r,intToCharColumn(c+1), "RIGHT"); + moves temp(8-r,c, "RIGHT"); output.push_back(temp); } } } - else if (turn == 'X') { + else if (turn == '0') { for (int i = 0; i < opieces.size(); ++i){ r = opieces[i]->getX(); c = opieces[i]->getY(); @@ -447,6 +514,7 @@ void Board::undo(Board& tablero){ void Board::interpret(string input, Board& tablero){ vector record; input = myToUpper(input); + //cout << "MOVE: " << input << "\n\n"; if (input == "UNDO") { @@ -463,7 +531,6 @@ void Board::interpret(string input, Board& tablero){ } cout<<"---------------------------------------------------END DISPLAY RECORD------------------------"< opieces; vector pieces; char turn = 'O'; + bool valid = false; public: Board(); Board(const Board& b); + void setValidFalse(); + void setValidTrue(); + bool isValid(); bool isPiece(int r, int c); + void isTaken(int r, int c); Piece* getPiece(int r, int c); vector getXPieces() const { return xpieces; } vector getOPieces() const { return opieces; } diff --git a/Engine.cpp b/Engine.cpp index 2ed7a7f..96f0867 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -31,24 +31,28 @@ void Engine::startGame(){ { gameOver = b->isGameOver(); - while(b->getTurn() == 'O' ) + while(b->getTurn() == 'O' && !b->isValid()) { b->displayBoard(); cout<<"\nEnter command: "; cin>>move; cout << "\n"; b->interpret(move, *b); - b->changeTurns(); + if(b->isValid()) { + b->changeTurns(); + b->setValidFalse(); + } } - cout << "TEST\n\n"; + if(b->isValid()) cout << b->getTurn(); while(b->getTurn() == 'X' ) { - AI(); + easyAI(); } gameOver = b->isGameOver(); + b->setValidFalse(); b->snapshot(record, *b); } @@ -57,7 +61,11 @@ void Engine::startGame(){ void Engine::easyAI() { vector listOfMoves = b->viewPossibleMoves(); - + /* + for(int x = 0; x < listOfMoves.size(); ++x) { + cout << listOfMoves[x].row << " " << listOfMoves[x].column << " " << listOfMoves[x].moveType << "\n\n"; + } + */ srand(time(NULL)); int randomChoice = rand() % (listOfMoves.size()-1) - 0; @@ -70,61 +78,64 @@ void Engine::easyAI() void Engine::AI(){ cout << "----------------------BEGIN AI FUNCTION----------------------\n"; vector listOfMoves = b->viewPossibleMoves(); - Board* temp = new Board(*b); + //Board* b = new Board(*b); //probably not needed, check later - if (temp->getTurn() != 'X'){ + /* + if (b->getTurn() != 'X'){ cout << "a changing of turns is needed. \n"; - temp->changeTurns(); + b->changeTurns(); } - + */ //only doing 1 branch right now because testing /*for (int i = 0; i < listOfMoves.size(); ++i){ - minMax(temp, listOfMoves[i]); + minMax(b, listOfMoves[i]); }*/ - b->move(minMax(temp, listOfMoves[0], 0)); + b->move(minMax(listOfMoves[0], 0)); b->changeTurns(); //verification of correct turn + /* if (b->getTurn() != 'O'){ cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; } - + */ b->displayBoard(); cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(Board* temp, moves m, int c){ +moves Engine::minMax(moves m, int c){ //testing purposes only, c = finite depth + /* if (c > 5){ return m; } - if (temp->isGameOver() == true){ + if (b->isGameOver() == true){ cout << "END OF PATH REACHED\n"; return m; } else { - if(temp->isThisMovePossible(8 - m.row, temp->charToIntColumn(m.column), m.moveType)){ + if(b->isThisMovePossible(8 - m.row, b->charToIntColumn(m.column), m.moveType)){ cout << "piece has been moved in minMax\n"; - temp->move(m); - temp->changeTurns(); + b->move(m); + b->changeTurns(); } cout << "c: " << c << "\n\n"; - cout << "current turn: " << temp->getTurn() << "\n"; - vector listOfMoves = temp->viewPossibleMoves(); + cout << "current turn: " << b->getTurn() << "\n"; + vector listOfMoves = b->viewPossibleMoves(); for (int i = 0; i < listOfMoves.size(); ++i){ - //return minMax(temp, listOfMoves[i]); + //return minMax(b, listOfMoves[i]); } - temp->displayBoard(); + b->displayBoard(); //limited recursion - return minMax(temp, listOfMoves[0], ++c); + return minMax(b, listOfMoves[0], ++c); //testing return m; - } + }*/ } \ No newline at end of file diff --git a/Engine.h b/Engine.h index 97efbf8..d1b3809 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - moves minMax(Board* temp, moves m, int c); + moves minMax(moves m, int c); }; \ No newline at end of file diff --git a/Piece.cpp b/Piece.cpp index a223740..265180a 100755 --- a/Piece.cpp +++ b/Piece.cpp @@ -42,7 +42,7 @@ void Piece::moveLeft(){ else if (type == 'O'){ x--; - y++; + y--; } else @@ -57,7 +57,7 @@ void Piece::moveRight(){ else if (type == 'O'){ x--; - y--; + y++; } else From 5ce0163f77be3be58dafa7a81cbffcbe2481376f Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Tue, 27 Oct 2015 20:24:07 -0500 Subject: [PATCH 065/108] Update README.md Added notes for compiling with makefile and for server and client only. --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ac4fdc5..cc5f158 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ # Breakthrough Reposity for the second CSCE 315 project -compile the server with the folling command: -g++ -std=c++11 -o server Board.cpp Server.cpp +compile test.cpp main by typing: +make all run: -./server [port] +./test -Client is still WIP. +Will make separate commands for server/client in the future, for now: +g++ -std=c++11 -o server server.cpp Board.cpp Engine.cpp Piece.cpp + +to compile the server, then: +./server + +Client is still WIP, test by compiling with: +g++ -std=c++11 -o client client.cpp Board.cpp Engine.cpp Piece.cpp + +run: +./client From d13b1661eebf2de826200dd0fd16bf07fd9f33b1 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 21:19:24 -0500 Subject: [PATCH 066/108] Pushing to be able to update branch. --- Board.cpp | 3 ++- Engine.cpp | 34 +++++++++++++++++++--------------- Engine.h | 2 +- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Board.cpp b/Board.cpp index 7c89ecd..72fb1ea 100755 --- a/Board.cpp +++ b/Board.cpp @@ -28,7 +28,8 @@ Board::Board(const Board& b) { vector xp = b.getXPieces(); vector op = b.getOPieces(); Piece* temp; - bool valid = false; + //bool valid = false; + //char tempturn = b.getTurn(); for (int i = 0; i < xp.size(); ++i) { temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); diff --git a/Engine.cpp b/Engine.cpp index 96f0867..d2d9d02 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -69,7 +69,7 @@ void Engine::easyAI() srand(time(NULL)); int randomChoice = rand() % (listOfMoves.size()-1) - 0; - int temp = randomChoice; + //int temp = randomChoice; cout << "easy AI move: " << listOfMoves[randomChoice].row << listOfMoves[randomChoice].column << listOfMoves[randomChoice].moveType << "\n"; b->move(listOfMoves[randomChoice]); b->changeTurns(); @@ -78,7 +78,7 @@ void Engine::easyAI() void Engine::AI(){ cout << "----------------------BEGIN AI FUNCTION----------------------\n"; vector listOfMoves = b->viewPossibleMoves(); - //Board* b = new Board(*b); + Board* temp = new Board(*b); //probably not needed, check later /* @@ -92,7 +92,7 @@ void Engine::AI(){ minMax(b, listOfMoves[i]); }*/ - b->move(minMax(listOfMoves[0], 0)); + b->move(minMax(temp, listOfMoves[0], 0)); b->changeTurns(); //verification of correct turn @@ -105,37 +105,41 @@ void Engine::AI(){ cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(moves m, int c){ +moves Engine::minMax(Board* temp, moves m, int c){ //testing purposes only, c = finite depth - /* + + cout << "c: " << c << "\n\n"; + cout << "current turn: " << temp->getTurn() << "\n"; + vector listOfMoves = temp->viewPossibleMoves(); if (c > 5){ return m; } - if (b->isGameOver() == true){ + if (temp->isGameOver() == true){ cout << "END OF PATH REACHED\n"; return m; } else { - if(b->isThisMovePossible(8 - m.row, b->charToIntColumn(m.column), m.moveType)){ + if(temp->isThisMovePossible(m.row, m.column, m.moveType) && temp->getPiece(m.row, m.column)->getType() == temp->getTurn()){ cout << "piece has been moved in minMax\n"; - b->move(m); - b->changeTurns(); + temp->move(m); + temp->changeTurns(); + temp->displayBoard(); + } + else { + m = minMax(temp, listOfMoves[c+1], c+1); } - cout << "c: " << c << "\n\n"; - cout << "current turn: " << b->getTurn() << "\n"; - vector listOfMoves = b->viewPossibleMoves(); for (int i = 0; i < listOfMoves.size(); ++i){ //return minMax(b, listOfMoves[i]); } - b->displayBoard(); + temp->displayBoard(); //limited recursion - return minMax(b, listOfMoves[0], ++c); + minMax(temp, listOfMoves[c], ++c); //testing return m; - }*/ + } } \ No newline at end of file diff --git a/Engine.h b/Engine.h index d1b3809..97efbf8 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - moves minMax(moves m, int c); + moves minMax(Board* temp, moves m, int c); }; \ No newline at end of file From 7733193a4b4727f4b41c03399b5c4a52758b8cad Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:28:37 -0500 Subject: [PATCH 067/108] Updated startGame to take an int as an argument This is necessary because the server requires a port number to launch. --- Engine.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine.h b/Engine.h index 97efbf8..642ae82 100755 --- a/Engine.h +++ b/Engine.h @@ -9,8 +9,8 @@ class Engine { public: Engine(); - void startGame(); + void startGame(int port); void easyAI(); void AI(); moves minMax(Board* temp, moves m, int c); -}; \ No newline at end of file +}; From e4d5a57a9d6518dc00903039b2068ba7cc9e447a Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:30:52 -0500 Subject: [PATCH 068/108] Revamped the startGame function This was the only appropriate way I saw in launching the server. The startGame function takes an int as an argument, for the port number the server will host the game on. --- Engine.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 17 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index d2d9d02..b5e7558 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -2,30 +2,84 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include "Engine.h" - Engine::Engine(){ Board* brd = new Board(); b = brd; } -void Engine::startGame(){ - cout<<"WELCOME\n"; +void Engine::startGame(int port){ + + cout << "Launching server..." << endl; + int sockfd, newsockfd, portno; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + + if (port < 2) { + cout << "ERROR, no port provided\n"; + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + cout << "ERROR opening socket"; + + bzero((char *) &serv_addr, sizeof(serv_addr)); + portno = port; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + cout << "ERROR on binding"; + + listen(sockfd,5); + clilen = sizeof(cli_addr); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + + if (newsockfd < 0) + cout << "ERROR on accept"; - cout<<"1. Play against AI?\n"; - cout<<"2. Play against a human?\n"; - cout<<"Enter choice: \n"; - - int choice = -1; - cin >> choice; - cout << "OK" << endl; - string move; - bool gameOver = false; vector record; b->snapshot(record, *b); + char buffer[256]; + char info[256]; + int choice = -1; + int choice_difficulty = -1; + string final_move; + + //Ask client about game type + string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; + write(newsockfd, introduction.c_str(), introduction.length()); + n = read(newsockfd,info,255); //Reads choice as a string + istringstream convert(info); //Converts the read string to an integer + convert >> choice; //Sets value equal to the converted value + //Later in the project, we need to check for AI and Human modes + cout << "OK" << endl; + bzero(info,256); //Resets info back to normal + + /*//Becca- once your AI code is working, use this code: + + string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; + write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice_difficulty; + cout << "OK" << endl; + bzero(info,256); + + */ while (gameOver != true) { @@ -34,9 +88,13 @@ void Engine::startGame(){ while(b->getTurn() == 'O' && !b->isValid()) { b->displayBoard(); - cout<<"\nEnter command: "; - cin>>move; - cout << "\n"; + string boardState = b->boardToString(); + final_move = b->boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) + cout<<"\nStanding by for client... \n"; + n = read(newsockfd,buffer,255);//Read the client's input + move = buffer; + bzero(buffer,256); b->interpret(move, *b); if(b->isValid()) { b->changeTurns(); @@ -49,13 +107,28 @@ void Engine::startGame(){ while(b->getTurn() == 'X' ) { easyAI(); + /*Becca- once you finish your AI, uncomment this out and remove the line directly above this + if(choice_difficulty == 1) + easyAI(); + else if(choice_difficulty == 2) + mediumAI(); + else + hardAI(); + */ } gameOver = b->isGameOver(); b->setValidFalse(); - b->snapshot(record, *b); } + final_move = b->boardToString(); + string game_over = "\n\nGAME OVER!!!\n"; + write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) + write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over + cout << game_over; + usleep(1); + close(newsockfd); + close(sockfd); } void Engine::easyAI() @@ -142,4 +215,4 @@ moves Engine::minMax(Board* temp, moves m, int c){ //testing return m; } -} \ No newline at end of file +} From c4aaa39cf699ff906d159aebfb1eee7cff036a4e Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:32:52 -0500 Subject: [PATCH 069/108] Updated the test file to launch the server It asks the user to enter a port number, which is passed into the startGame function as an argument, once that happens, the server is launched, and a client can connect via telnet. --- test.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test.cpp b/test.cpp index 88d7f86..e697fbe 100755 --- a/test.cpp +++ b/test.cpp @@ -1,14 +1,14 @@ -#include "Board.h" #include "Engine.h" using namespace std; int main() { - //board testing - Board b; - - //engine testing Engine e; - e.startGame(); + int pn = 0; + cout << "Welcome to Breakthrough server launcher, please enter a host port number: \n"; + cin >> pn; + cin.clear(); + cin.ignore(10000,'\n'); + e.startGame(pn); } From 34911699306b321e243b6d84a770d53c4d78ff2d Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:36:47 -0500 Subject: [PATCH 070/108] Updated the readme to work with current build --- README.md | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index cc5f158..b3aba00 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,15 @@ # Breakthrough Reposity for the second CSCE 315 project -compile test.cpp main by typing: -make all +To compile everything: + g++ -std=c++11 test.cpp Engine.cpp Board.cpp Piece.cpp -o runner +or, alternatively if you delete the Parser.h and Parser.cpp (there's no need for them) + g++ -std=c++11 *.cpp -o runner -run: -./test +To launch the server: +./runner -Will make separate commands for server/client in the future, for now: -g++ -std=c++11 -o server server.cpp Board.cpp Engine.cpp Piece.cpp +Enter a port number when prompted, then the server is launched and waiting for a client to join. -to compile the server, then: -./server - -Client is still WIP, test by compiling with: -g++ -std=c++11 -o client client.cpp Board.cpp Engine.cpp Piece.cpp - -run: -./client +Client can simply join via telnet: + telnet linux.cse.tamu.edu From 99073c77c589dbb13a83c9c1bd87276490e18ba7 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:37:21 -0500 Subject: [PATCH 071/108] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3aba00..9168d23 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Reposity for the second CSCE 315 project To compile everything: g++ -std=c++11 test.cpp Engine.cpp Board.cpp Piece.cpp -o runner -or, alternatively if you delete the Parser.h and Parser.cpp (there's no need for them) +or, alternatively if you delete the Parser.h, Parser.cpp, and Client.cpp (there's no need for them currently) g++ -std=c++11 *.cpp -o runner To launch the server: From 1da55a495384094ce4cf877e42b0389ec544fcd1 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:46:33 -0500 Subject: [PATCH 072/108] Create Engine.h --- Engine.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Engine.h diff --git a/Engine.h b/Engine.h new file mode 100644 index 0000000..66f8843 --- /dev/null +++ b/Engine.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Board.h" + +using namespace std; + +class Engine { + Board* b; + +public: + Engine(); + void startGame(int port); + void easyAI(); + void AI(); + moves minMax(moves m, int c); +}; From f24635c9cd6197c5eeb66d09af6f247b80f9d650 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:47:20 -0500 Subject: [PATCH 073/108] Create Engine.cpp --- Engine.cpp | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 Engine.cpp diff --git a/Engine.cpp b/Engine.cpp new file mode 100644 index 0000000..d05e61a --- /dev/null +++ b/Engine.cpp @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Engine.h" + +Engine::Engine(){ + Board* brd = new Board(); + b = brd; +} + +void Engine::startGame(int port){ + + cout << "Launching server..." << endl; + int sockfd, newsockfd, portno; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + + if (port < 2) { + cout << "ERROR, no port provided\n"; + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + cout << "ERROR opening socket"; + + bzero((char *) &serv_addr, sizeof(serv_addr)); + portno = port; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + cout << "ERROR on binding"; + + listen(sockfd,5); + clilen = sizeof(cli_addr); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + + if (newsockfd < 0) + cout << "ERROR on accept"; + + string move; + bool gameOver = false; + vector record; + b->snapshot(record, *b); + char buffer[256]; + char info[256]; + int choice = -1; + int choice_difficulty = -1; + string final_move; + + //Ask client about game type + string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; + write(newsockfd, introduction.c_str(), introduction.length()); + n = read(newsockfd,info,255); //Reads choice as a string + istringstream convert(info); //Converts the read string to an integer + convert >> choice; //Sets value equal to the converted value + //Later in the project, we need to check for AI and Human modes + cout << "OK" << endl; + bzero(info,256); //Resets info back to normal + + /*//Becca- once your AI code is working, use this code: + + string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; + write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice_difficulty; + cout << "OK" << endl; + bzero(info,256); + + */ + + while (gameOver != true) + { + gameOver = b->isGameOver(); + + while(b->getTurn() == 'O' && !b->isValid()) + { + b->displayBoard(); + string boardState = b->boardToString(); + final_move = b->boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) + cout<<"\nStanding by for client... \n"; + n = read(newsockfd,buffer,255);//Read the client's input + move = buffer; + bzero(buffer,256); + b->interpret(move, *b); + if(b->isValid()) { + b->changeTurns(); + b->setValidFalse(); + } + } + + if(b->isValid()) cout << b->getTurn(); + + while(b->getTurn() == 'X' ) + { + easyAI(); + /*Becca- once you finish your AI, uncomment this out and remove the line directly above this + if(choice_difficulty == 1) + easyAI(); + else if(choice_difficulty == 2) + mediumAI(); + else + hardAI(); + */ + } + + gameOver = b->isGameOver(); + b->setValidFalse(); + b->snapshot(record, *b); + } + final_move = b->boardToString(); + string game_over = "\n\nGAME OVER!!!\n"; + write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) + write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over + cout << game_over; + usleep(1); + close(newsockfd); + close(sockfd); +} + +void Engine::easyAI() +{ + vector listOfMoves = b->viewPossibleMoves(); + /* + for(int x = 0; x < listOfMoves.size(); ++x) { + cout << listOfMoves[x].row << " " << listOfMoves[x].column << " " << listOfMoves[x].moveType << "\n\n"; + } + */ + srand(time(NULL)); + int randomChoice = rand() % (listOfMoves.size()-1) - 0; + + int temp = randomChoice; + cout << "easy AI move: " << listOfMoves[randomChoice].row << listOfMoves[randomChoice].column << listOfMoves[randomChoice].moveType << "\n"; + b->move(listOfMoves[randomChoice]); + b->changeTurns(); +} + +void Engine::AI(){ + cout << "----------------------BEGIN AI FUNCTION----------------------\n"; + vector listOfMoves = b->viewPossibleMoves(); + //Board* b = new Board(*b); + + //probably not needed, check later + /* + if (b->getTurn() != 'X'){ + cout << "a changing of turns is needed. \n"; + b->changeTurns(); + } + */ + //only doing 1 branch right now because testing + /*for (int i = 0; i < listOfMoves.size(); ++i){ + minMax(b, listOfMoves[i]); + }*/ + + b->move(minMax(listOfMoves[0], 0)); + b->changeTurns(); + + //verification of correct turn + /* + if (b->getTurn() != 'O'){ + cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; + } + */ + b->displayBoard(); + cout << "----------------------END AI FUNCTION----------------------\n"; +} + +moves Engine::minMax(moves m, int c){ + //testing purposes only, c = finite depth + /* + if (c > 5){ + return m; + } + + if (b->isGameOver() == true){ + cout << "END OF PATH REACHED\n"; + return m; + } + + else { + if(b->isThisMovePossible(8 - m.row, b->charToIntColumn(m.column), m.moveType)){ + cout << "piece has been moved in minMax\n"; + b->move(m); + b->changeTurns(); + } + cout << "c: " << c << "\n\n"; + cout << "current turn: " << b->getTurn() << "\n"; + vector listOfMoves = b->viewPossibleMoves(); + + for (int i = 0; i < listOfMoves.size(); ++i){ + //return minMax(b, listOfMoves[i]); + } + + b->displayBoard(); + //limited recursion + return minMax(b, listOfMoves[0], ++c); + + //testing + return m; + }*/ +} From 80cd2abf98995c6f1ec2ada92baec1cbaa0d4a2a Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 21:48:04 -0500 Subject: [PATCH 074/108] Fixing things. --- Board.cpp | 9 +++++---- Board.h | 1 + Engine.cpp | 20 +++++++++----------- Engine.h | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Board.cpp b/Board.cpp index 72fb1ea..d428ac5 100755 --- a/Board.cpp +++ b/Board.cpp @@ -29,7 +29,8 @@ Board::Board(const Board& b) { vector op = b.getOPieces(); Piece* temp; //bool valid = false; - //char tempturn = b.getTurn(); + char tempturn = b.getTurnPls(); + turn = tempturn; for (int i = 0; i < xp.size(); ++i) { temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); @@ -450,19 +451,19 @@ vector Board::viewPossibleMoves(){ c = opieces[i]->getY(); if (isThisMovePossible(r, c, "FWD")) { - moves temp(8-r,intToCharColumn(c+1), "FWD"); + moves temp(8-r,c, "FWD"); output.push_back(temp); } if (isThisMovePossible(r,c,"LEFT")) { - moves temp(8-r,intToCharColumn(c+1), "LEFT"); + moves temp(8-r,c, "LEFT"); output.push_back(temp); } if (isThisMovePossible(r,c,"RIGHT")) { - moves temp(8-r,intToCharColumn(c+1), "RIGHT"); + moves temp(8-r,c, "RIGHT"); output.push_back(temp); } } diff --git a/Board.h b/Board.h index 9b68242..7a9a170 100755 --- a/Board.h +++ b/Board.h @@ -36,6 +36,7 @@ public: Piece* getPiece(int r, int c); vector getXPieces() const { return xpieces; } vector getOPieces() const { return opieces; } + char getTurnPls() const { return turn; } moves parse(string input); char getTurn() { return turn; } bool isGameOver(); diff --git a/Engine.cpp b/Engine.cpp index d2d9d02..80d2940 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -92,7 +92,7 @@ void Engine::AI(){ minMax(b, listOfMoves[i]); }*/ - b->move(minMax(temp, listOfMoves[0], 0)); + b->move(minMax(temp, listOfMoves[0], 0, 0)); b->changeTurns(); //verification of correct turn @@ -105,12 +105,13 @@ void Engine::AI(){ cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(Board* temp, moves m, int c){ +moves Engine::minMax(Board* temp, moves m, int c, int r){ //testing purposes only, c = finite depth cout << "c: " << c << "\n\n"; cout << "current turn: " << temp->getTurn() << "\n"; vector listOfMoves = temp->viewPossibleMoves(); + cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; if (c > 5){ return m; } @@ -121,23 +122,20 @@ moves Engine::minMax(Board* temp, moves m, int c){ } else { - if(temp->isThisMovePossible(m.row, m.column, m.moveType) && temp->getPiece(m.row, m.column)->getType() == temp->getTurn()){ + if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ cout << "piece has been moved in minMax\n"; temp->move(m); temp->changeTurns(); - temp->displayBoard(); + //temp->displayBoard(); } else { - m = minMax(temp, listOfMoves[c+1], c+1); - } - - for (int i = 0; i < listOfMoves.size(); ++i){ - //return minMax(b, listOfMoves[i]); + cout << m.row << " " << m.column << "\n\n"; + m = minMax(temp, listOfMoves[++r], c, r); } temp->displayBoard(); - //limited recursion - minMax(temp, listOfMoves[c], ++c); + vector listOfMoves = temp->viewPossibleMoves(); + minMax(temp, listOfMoves[c], ++c, 0); //testing return m; diff --git a/Engine.h b/Engine.h index 97efbf8..b6df5f5 100755 --- a/Engine.h +++ b/Engine.h @@ -12,5 +12,5 @@ public: void startGame(); void easyAI(); void AI(); - moves minMax(Board* temp, moves m, int c); + moves minMax(Board* temp, moves m, int c, int r); }; \ No newline at end of file From a960864893193e4c2c881c5b696c2cee1fa7c528 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:48:22 -0500 Subject: [PATCH 075/108] Create test.cpp --- test.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test.cpp diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000..e697fbe --- /dev/null +++ b/test.cpp @@ -0,0 +1,14 @@ +#include "Engine.h" + +using namespace std; + +int main() +{ + Engine e; + int pn = 0; + cout << "Welcome to Breakthrough server launcher, please enter a host port number: \n"; + cin >> pn; + cin.clear(); + cin.ignore(10000,'\n'); + e.startGame(pn); +} From 025de21e15a10af4186db5513ddb9a1e80a217fb Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:49:41 -0500 Subject: [PATCH 076/108] Create Piece.h --- Piece.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 Piece.h diff --git a/Piece.h b/Piece.h new file mode 100644 index 0000000..245c7cc --- /dev/null +++ b/Piece.h @@ -0,0 +1,24 @@ +#pragma once + +using namespace std; + +class Piece { + int x; + int y; + char type; + +public: + Piece(); + Piece(int r, int c); + Piece(int r, int c, char t); + void moveFwd(); + void moveLeft(); + void moveRight(); + int getX(){ return x; } + void setX(int r){ x = r; } + int getY(){ return y; } + void setY(int c){ y = c; } + char getType(){ return type; } + void makeEmpty(){ type = '_'; } + void isTaken(); +}; From fc418150a9ad5a5981aeb32467aec51f514c33ac Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:50:08 -0500 Subject: [PATCH 077/108] Create Piece.cpp --- Piece.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Piece.cpp diff --git a/Piece.cpp b/Piece.cpp new file mode 100644 index 0000000..6848914 --- /dev/null +++ b/Piece.cpp @@ -0,0 +1,69 @@ +#include +#include "Piece.h" + +using namespace std; + +Piece::Piece(){ + x = -1; + y = -1; + type = '?'; +} + +Piece::Piece(int r, int c){ + x = r; + y = c; + type = '_'; +} + +Piece::Piece(int r, int c, char t){ + x = r; + y = c; + type = t; +} + +void Piece::moveFwd(){ + if (type == 'X'){ + x++; + } + + else if (type == 'O'){ + x--; + } + + else + cout << "Error: trying to move an empty piece forward."; +} + +void Piece::moveLeft(){ + if (type == 'X'){ + x++; + y--; + } + + else if (type == 'O'){ + x--; + y--; + } + + else + cout << "Error: trying to move an empty piece left."; +} + +void Piece::moveRight(){ + if (type == 'X'){ + x++; + y++; + } + + else if (type == 'O'){ + x--; + y++; + } + + else + cout << "Error: trying to move an empty piece left."; +} + +void Piece::isTaken(){ + cout << getX() << " " << getY() << "\n\n"; +} From 934a28bec74cc300ff0a88e89cbd2752c731ca7c Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:51:19 -0500 Subject: [PATCH 078/108] Update Board.cpp --- Board.cpp | 746 +++++++++++++++++++++++++++--------------------------- 1 file changed, 366 insertions(+), 380 deletions(-) diff --git a/Board.cpp b/Board.cpp index 6d7b295..d13ccc2 100644 --- a/Board.cpp +++ b/Board.cpp @@ -5,39 +5,111 @@ using namespace std; Board::Board() { - for (int i = 0; i < 2; ++i) { + Piece* temp; + bool valid = false; + for (int i = 0; i < 2; ++i) { for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'X'; + temp = new Piece(i, j, 'X'); + xpieces.push_back(temp); + pieces.push_back(temp); } } - - for (int i = 2; i < 6; ++i) { + for (int i = 6; i < 8; ++i) { for (int j = 0; j < 8; ++j) { - boardArray[i][j] = '_'; - } - } - - - for (int i = 6; i <= 7; ++i) { - for (int j = 0; j < 8; ++j) { - boardArray[i][j] = 'O'; + temp = new Piece(i, j, 'O'); + opieces.push_back(temp); + pieces.push_back(temp); } } } + +Board::Board(const Board& b) { + vector xp = b.getXPieces(); + vector op = b.getOPieces(); + Piece* temp; + bool valid = false; -moves Board::parse(string input) -{ + for (int i = 0; i < xp.size(); ++i) { + temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); + xpieces.push_back(temp); + pieces.push_back(temp); + } + for (int i = 0; i < op.size(); ++i) { + temp = new Piece(op[i]->getX(), op[i]->getY(), 'O'); + opieces.push_back(temp); + pieces.push_back(temp); + } +} + +void Board::setValidFalse() { + valid = false; +} + +void Board::setValidTrue() { + valid = true; +} + +bool Board::isValid() { + return valid; +} + +//make this efficient! +bool Board::isPiece(int r, int c){ + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + return true; + } + } + + return false; +} + +void Board::isTaken(int r, int c) { + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + if(pieces[i]->getType() == 'O') { + for(int x = 0; x < opieces.size(); ++x) { + if (opieces[x]->getX() == r && opieces[x]->getY() == c) { + opieces.erase(opieces.begin() + x); + //break; + } + } + } + else { + for(int x = 0; x < xpieces.size(); ++x) { + if (xpieces[x]->getX() == r && xpieces[x]->getY() == c) { + xpieces.erase(xpieces.begin() + x); + //break; + } + } + } + pieces.erase(pieces.begin() + i); + break; + } + } +} + +//make this efficient! +Piece* Board::getPiece(int r, int c){ + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + return pieces[i]; + } + } + + return new Piece(); +} + +moves Board::parse(string input){ input = myToUpper(input); - cout<getX() == 7){ + cout<<"\n\n\nPlayer X wins!\n\n\n"<getX() == 0){ + cout<<"\n\n\nPlayer O wins!\n\n\n"<getX() << " " << pieces[i]->getY() << " " << pieces[i]->getType() << "\t"; + } + cout << "Debugging:\n\n"; + */ + cout << "; A B C D E F G H"<getType() == 'X') + cout << "|" << "X"; + else + cout << "|" << "O"; + else + cout << "|" << "_"; } + cout<<"|\n"; } - cout<<'\n'<getType() == 'X') + output += "|X"; + else + output += "|O"; + else + output += "|_"; + } + + output += "|\n"; + } + + output += "\n\nturn: "; + output += turn; + output += "\n"; + + return output; +} + +int Board::charToIntColumn(char input){ int kolumn; switch (input) @@ -146,8 +231,7 @@ int Board::charToIntColumn(char input) //converts column number to int return kolumn; } -char Board::intToCharColumn(int input) //converts column number to int -{ +char Board::intToCharColumn(int input){ char kolumn; switch (input) @@ -164,299 +248,221 @@ char Board::intToCharColumn(int input) //converts column number to int return kolumn; } + +void Board::move(string inputMove){ + moves m = parse(inputMove); + cout << "MOVE: " << m.row << " " << m.column << " " << m.moveType << "\n\n"; + move(m); +} + +void Board::move(moves m){ + int row = 8 - (m.row); + int column = m.column; -void Board::move(string inputMove) -{ + cout << "INSIDE MOVE: " << row << " " << column << "\n\n"; - moves jugada = parse(inputMove); - - int row = 8 - (jugada.row); - int kolumn = charToIntColumn(jugada.column); - int temp = boardArray[row][kolumn]; - int reflector = 1; - - if (row > 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"< 8 || row < 0 || column > 8 || column < 0) { + cout<<"ERROR: index out of bound."<getX() << piece->getY() << "\n\n"; + if (piece->getType() != turn) { + cout<<"ERROR: attempting to move the wrong side's piece.\n"; } - else if (temp == '_') - { - cout<<"there's no piece in that spot!"<moveFwd(); + } + + else if (m.moveType == "LEFT") { + //add error checking + if(piece->getType() == 'O') { + row--; + column--; + } + else { + row++; + column--; + } + if(isPiece(row, column)) { + if(getPiece(row, column)->getType() != piece->getType()) { + isTaken(row, column); + piece->moveLeft(); + } + } + else { + piece->moveLeft(); + } + } + + else if (m.moveType == "RIGHT") { + //add error checking + //cout << "TESTING??\n\n"; + if(piece->getType() == 'O') { + row--; + column++; + } + else { + row++; + column++; + } + if(isPiece(row, column)) { + if(getPiece(row, column)->getType() != piece->getType()) { + isTaken(row, column); + piece->moveRight(); + } + } + else { + cout << piece->getX() << " " << piece->getY() << "\n\n"; + piece->moveRight(); + cout << piece->getX() << " " << piece->getY() << "\n\n"; + } + } + setValidTrue(); } - - - if (jugada.moveType == "FWD") - { - - if(boardArray[row+reflector][kolumn] != '_') - { - cout<<"you can't move that piece forward"< 8 || row < 0 || kolumn > 8 || kolumn < 0) - { - cout<<"ERROR: index out of bound!"<getType() != turn) { + cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n"; return false; } - int reflector = 1; - - if (pieceToMove == 'O') - { - reflector *= -1; - } - - else - { - if (moveType == "FWD") - { - - if (boardArray[r+reflector][c] == '_') return true; - else return false; - + else{ + int reflector = 1; + + if (piece->getType() == 'O') + reflector = -1; + + if (moveType == "FWD"){ + if (!isPiece(r + reflector, c)) + return true; + else + return false; } - else if (moveType == "RIGHT") - { - if (boardArray[r+reflector][c+1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true; - else return false; + else if (moveType == "RIGHT"){ + temp = getPiece(r + reflector, c+1); + if(c < 7) { + if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) { + //cout << "What.\n\n"; + return true; + } + else if(temp->getType() != piece->getType()) { + char a = temp->getType(); + char b = piece->getType(); + cout << a << " " << b << "\n\n"; + return true; + } + else { + return false; + } + } + else { + return false; + } } - else if (moveType == "LEFT") - { - if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true; - else return false; + else if (moveType == "LEFT"){ + temp = getPiece(r + reflector, c-1); + if(c > 0) { + if (!isPiece(r+reflector, c-1) && (r+reflector >= 0) && (r+reflector <= 7)) { + //cout << "What.\n\n"; + return true; + } + else if(temp->getType() != piece->getType()) { + char a = temp->getType(); + char b = piece->getType(); + cout << a << " " << b << "\n\n"; + return true; + } + else { + return false; + } + } + else { + return false; + } } else return false; } } -vector Board::viewPossibleMoves() -{ +vector Board::viewPossibleMoves(){ + int r, c = -1; vector output; - for (int r = 0; r < 8; ++r) - { - for (int c = 0; c < 8; ++c) - { - if (boardArray[r][c] == turn) + if (turn == 'X'){ + for (int i = 0; i < xpieces.size(); ++i){ + r = xpieces[i]->getX(); + c = xpieces[i]->getY(); + if (isThisMovePossible(r, c, "FWD")) { - if (isThisMovePossible(r,c,"FWD")) - { - moves temp(8-r,intToCharColumn(c+1),"FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1),"LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1),"RIGHT"); - output.push_back(temp); - } - + moves temp(8-r,c, "FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,c, "LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,c, "RIGHT"); + output.push_back(temp); + } + } + } + + else if (turn == '0') { + for (int i = 0; i < opieces.size(); ++i){ + r = opieces[i]->getX(); + c = opieces[i]->getY(); + if (isThisMovePossible(r, c, "FWD")) + { + moves temp(8-r,intToCharColumn(c+1), "FWD"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"LEFT")) + { + moves temp(8-r,intToCharColumn(c+1), "LEFT"); + output.push_back(temp); + } + + if (isThisMovePossible(r,c,"RIGHT")) + { + moves temp(8-r,intToCharColumn(c+1), "RIGHT"); + output.push_back(temp); } } } @@ -464,8 +470,7 @@ vector Board::viewPossibleMoves() return output; } -string Board::myToUpper(string input) -{ +string Board::myToUpper(string input){ string output; for (int i = 0 ; i < input.size(); ++i) @@ -480,26 +485,11 @@ string Board::myToUpper(string input) else output.push_back(input[i]); } - for (int i = 0; i < output.size(); ++i) - { - cout< input) -{ - cout<<"\n\nList of possible Moves:"< record; if (record.size() < 2) @@ -513,17 +503,18 @@ void Board::undo(Board& tablero) { for (int k = 0; k < 8; ++k) { - tablero.modifyAt(r,k,(record[record.size()-2]).elementAt(r,k)); + //tablero.modifyAt(r,k,(record[record.size()-2]).elementAt(r,k)); } } + record.pop_back(); } } -void Board::interpret(string input, Board& tablero) //determines what kind of command its input is -{ +void Board::interpret(string input, Board& tablero){ vector record; input = myToUpper(input); + //cout << "MOVE: " << input << "\n\n"; if (input == "UNDO") { @@ -540,12 +531,10 @@ void Board::interpret(string input, Board& tablero) //determines what kind of co } cout<<"---------------------------------------------------END DISPLAY RECORD------------------------"<& inputVec, Board inputBoard) -{ +void Board::snapshot(vector& inputVec, Board inputBoard){ if (inputVec.size() == 10) { inputVec.erase(inputVec.begin()); @@ -556,29 +545,26 @@ void Board::snapshot(vector& inputVec, Board inputBoard) cout<<"QUEUE OVERFLOW!"< listOfMoves = viewPossibleMoves(); + else if (max == 'O'){ + return (opieces.size() - xpieces.size()); + } - //2) pick a movement - - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element - - //3) execute movement - - int temp = randomChoice; - - move(listOfMoves[randomChoice]); - - //cout<<"\n\nMove executed by AI: "< Date: Tue, 27 Oct 2015 21:52:09 -0500 Subject: [PATCH 079/108] Update Board.h --- Board.h | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Board.h b/Board.h index cad2497..44becfc 100644 --- a/Board.h +++ b/Board.h @@ -2,12 +2,13 @@ #include #include +#include "Piece.h" using namespace std; struct moves { int row; - char column; + int column; string moveType; moves(int linea, int columna, string m) { @@ -18,29 +19,39 @@ struct moves { }; class Board { - char boardArray [8][8]; + vector xpieces; + vector opieces; + vector pieces; char turn = 'O'; + bool valid = false; public: Board(); - char elementAt(int r, int k) { return boardArray[r][k]; } - void modifyAt(int r, int k, char input) { boardArray[r][k] = input; } + Board(const Board& b); + void setValidFalse(); + void setValidTrue(); + bool isValid(); + bool isPiece(int r, int c); + void isTaken(int r, int c); + Piece* getPiece(int r, int c); + vector getXPieces() const { return xpieces; } + vector getOPieces() const { return opieces; } moves parse(string input); char getTurn() { return turn; } bool isGameOver(); void changeTurns(); void displayBoard(); + string boardToString(); int charToIntColumn(char input); char intToCharColumn(int input); void move(string inputMove); void move(moves jugada); + void moveWOPrint(moves jugada); bool isThisMovePossible(int r, int c, string moveType); vector viewPossibleMoves(); string myToUpper(string input); - void displayPossibleMoves(vector input); void undo(Board& tablero); void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); - void easyAI(); - string boardToString(); + int evaluate(char max, char min); }; From 8f4863c9b78053ce28c1380c39ce9e370cd13df3 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:53:11 -0500 Subject: [PATCH 080/108] Deleted Server.cpp no point as its launched via engine --- Server.cpp | 160 ----------------------------------------------------- 1 file changed, 160 deletions(-) delete mode 100644 Server.cpp diff --git a/Server.cpp b/Server.cpp deleted file mode 100644 index 3630ebc..0000000 --- a/Server.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Board.h" -using namespace std; - -void error(const char *msg) -{ - perror(msg); - exit(1); -} - -int main(int argc, char *argv[]) -{ - int sockfd, newsockfd, portno; - socklen_t clilen; - - struct sockaddr_in serv_addr, cli_addr; - - int n; - - if (argc < 2) { - fprintf(stderr,"ERROR, no port provided\n"); - exit(1); - } - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - if (sockfd < 0) - error("ERROR opening socket"); - - bzero((char *) &serv_addr, sizeof(serv_addr)); - - portno = atoi(argv[1]); - - serv_addr.sin_family = AF_INET; - - serv_addr.sin_addr.s_addr = INADDR_ANY; - - serv_addr.sin_port = htons(portno); - - if (bind(sockfd, (struct sockaddr *) &serv_addr, - sizeof(serv_addr)) < 0) - error("ERROR on binding"); - - listen(sockfd,5); - - clilen = sizeof(cli_addr); - - newsockfd = accept(sockfd, - (struct sockaddr *) &cli_addr, - &clilen); - - if (newsockfd < 0) - error("ERROR on accept"); - - //After all the server setup crap is done, we start the board - - // cout<<"WELCOME\n"; - - // cout<<"1. Play against AI?\n"; - // cout<<"2. Play against a human?\n"; - // cout<<"Enter choice: \n"; - - - // cin >> choice; - // cout << "OK" << endl; - - Board b; - string move; - - //Brute force up in here! - bool gameOver = false; - vector record; - b.snapshot(record,b); - char buffer[256]; - char info[256]; - int choice; - - //Waiting for client to select game type - n = read(newsockfd,info,255); - istringstream convert(info); - convert >> choice; //Sets choice equal to 1 or 2, based on clients input - bzero(info,256); //Resets info back to normal, "choice" now contains client's value - - while(true) { - - while(gameOver != true) - { - gameOver = b.isGameOver(); - - while(b.getTurn() == 'O' ) - { - b.displayBoard(); //Display the board on the server - string boardState = b.boardToString(); - write(newsockfd, boardState.c_str(), boardState.length()); //Display the board to the client (line by line) - cout<<"\nWaiting for client: "; - n = read(newsockfd,buffer,255); - move = buffer; - b.interpret(move,b); - - gameOver = b.isGameOver(); - if(gameOver == true) { - string endGame = "Game_Over"; - write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) - break; - } - else { - string continueGame = "Continue_Game"; - write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) - } - } - - //gameOver = b.isGameOver(); - // if(gameOver == true) { - // string endGame = "Game_Over"; - // write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) - // break; - // } - // else { - // string continueGame = "Continue_Game"; - // write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) - // } - - vector possibleMoves = b.viewPossibleMoves(); - if(choice == 1) - b.easyAI(); - } - - close(newsockfd); - close(sockfd); - break; - - /* - bzero(buffer,512); - n = read(newsockfd,buffer,255); - if (n < 0) error("ERROR reading from socket"); - printf("Here is the message: %s\n",buffer); - n = write(newsockfd,"I got your message",18); - - if (n < 0) error("ERROR writing to socket"); - - if(buffer == "y") { - close(newsockfd); - close(sockfd); - break; - } - */ - } - return 0; -} From a61fe5c11ac65960ee7af5e57d560f252ccbe56a Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:53:40 -0500 Subject: [PATCH 081/108] Deleted client.cpp no point since its handled by telnet --- Client.cpp | 93 ------------------------------------------------------ 1 file changed, 93 deletions(-) delete mode 100644 Client.cpp diff --git a/Client.cpp b/Client.cpp deleted file mode 100644 index 73bb121..0000000 --- a/Client.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Board.h" -using namespace std; - -void error(const char *msg) -{ - perror(msg); - exit(0); -} - -int main(int argc, char *argv[]) -{ - int sockfd, portno, n; - struct sockaddr_in serv_addr; - struct hostent *server; - - - if (argc < 3) { - fprintf(stderr,"usage %s hostname port\n", argv[0]); - exit(0); - } - portno = atoi(argv[2]); - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) - error("ERROR opening socket"); - server = gethostbyname(argv[1]); - if (server == NULL) { - fprintf(stderr,"ERROR, no such host\n"); - exit(0); - } - bzero((char *) &serv_addr, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - bcopy((char *)server->h_addr, - (char *)&serv_addr.sin_addr.s_addr, - server->h_length); - serv_addr.sin_port = htons(portno); - if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) - error("ERROR connecting"); - - //Client has successfully joined - char buffer[256]; - char info[256]; - - cout<<"WELCOME\n"; - - cout<<"1. Play against AI?\n"; - cout<<"2. Play against a human?\n"; - cout<<"Enter choice: \n"; - - string choice; - cin >> choice; - - //Check for a valid option - cout << "OK!\n" << endl; - - //Writes off the choice to the server - - n = write(sockfd, choice.c_str(), choice.length()); //Sends an input to the server - - - while(true) { - - bzero(buffer,256); //resets the input stream - n = read(sockfd,buffer,255); //Receives the board from server - printf("%s\n",buffer);//Prints the received message - - printf("Please enter a move: "); - bzero(buffer,256); //resets input stream - fgets(buffer,255,stdin); //Enter a move - n = write(sockfd,buffer,strlen(buffer)); //Sends an inputted move to the server - bzero(info,256); //resets input stream - - n = read(sockfd,info,255); //Reads from server if move was valid - string ref = info; - if(ref == "Game_Over") { - cout << "GAME OVER!!!" << endl; - break; - } - else - continue; - - } - close(sockfd); - return 0; -} From 37a24429764eda61bfc2dd269c1c161f17c1437e Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:53:59 -0500 Subject: [PATCH 082/108] Why is this even here --- test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index e69de29..0000000 From 5ff269aa72a410f35931e05826efc1d7455b762b Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:54:45 -0500 Subject: [PATCH 083/108] There's no point of this currently --- Parser.h | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 Parser.h diff --git a/Parser.h b/Parser.h deleted file mode 100644 index 4ad6930..0000000 --- a/Parser.h +++ /dev/null @@ -1,11 +0,0 @@ -//#include "main.cpp" -#include -#include -#include -#include - -void setPassword(); -vector tokenize(string ss); -void parseCmd(); -void parse(string input, DBEngine &engine) - From 1b2d012caf443d4befce8ce5b83ef7f7b9f64263 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:54:55 -0500 Subject: [PATCH 084/108] Not needed --- Parser.cpp | 63 ------------------------------------------------------ 1 file changed, 63 deletions(-) delete mode 100755 Parser.cpp diff --git a/Parser.cpp b/Parser.cpp deleted file mode 100755 index 9e5d94a..0000000 --- a/Parser.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//#include "main.cpp" -#include -#include -#include -#include - -bool password = true; // temp for a password needed function needed later. -string pass = "admin"; - -void setPassword() -{ - password = !password; -} - -vector tokenize(string ss){ - string tempString; - stringstream lineStream(ss); - vector output; - - while (lineStream >> tempString){ - output.push_back(tempString); - } - return output; -} - -void parseCmd(vector input){ - if(password){ - if(pass == input[0]){ - setPassword(); - cout << "Success." << endl; - } - else{ - cout << "Incorrect Password." << endl; - } - } - - string cmd = toupper(input[0]); - - else if(cmd == ""){ - - } - - else if(cmd == ""){ - - } - - else if(cmd == ""){ - - } - - else if(cmd == ""){ - - } - - else if(cmd == ""){ - - } -} - -void parse(string input){ - vector listOfTokens = tokenize(input); - parseCmd(listOfTokens); -} From d03b55aad66cb9fda91e5d4caf5444c5ed6fee24 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:55:16 -0500 Subject: [PATCH 085/108] Deleted client.cpp no point since its handled by telnet --- Client.cpp | 105 ----------------------------------------------------- 1 file changed, 105 deletions(-) delete mode 100644 Client.cpp diff --git a/Client.cpp b/Client.cpp deleted file mode 100644 index 4ed70b2..0000000 --- a/Client.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Board.h" -using namespace std; - -void error(const char *msg) -{ - perror(msg); - exit(0); -} - -int main(int argc, char *argv[]) -{ - int sockfd, portno, n; - struct sockaddr_in serv_addr; - struct hostent *server; - - - if (argc < 3) { - fprintf(stderr,"usage %s hostname port\n", argv[0]); - exit(0); - } - portno = atoi(argv[2]); - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) - error("ERROR opening socket"); - server = gethostbyname(argv[1]); - if (server == NULL) { - fprintf(stderr,"ERROR, no such host\n"); - exit(0); - } - bzero((char *) &serv_addr, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - bcopy((char *)server->h_addr, - (char *)&serv_addr.sin_addr.s_addr, - server->h_length); - serv_addr.sin_port = htons(portno); - if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) - error("ERROR connecting"); - - //Client has successfully joined - char buffer[256]; - char info[256]; - string final_board; - - cout<<"WELCOME\n"; - - cout<<"1. Play against AI?\n"; - cout<<"2. Play AI against an AI?\n"; - - string choice = ""; - while(choice != "1") - { - cout<<"Enter choice: \n"; - cin >> choice; - if(choice == "2") - cout << "AI vs. AI mode not added yet!\n"; - } - //Check for a valid option - cout << "OK!\n" << endl; - - //Writes off the choice to the server - n = write(sockfd, choice.c_str(), choice.length()); //Sends an input to the server - cin.clear(); - cin.ignore(10000,'\n'); - while(true) { - - bzero(buffer,256); //resets the input stream - n = read(sockfd,buffer,255); //Receives the board from server - printf("%s\n",buffer);//Prints the received message - final_board = buffer; - - printf("Please enter a move: "); - bzero(buffer,256); //resets input stream - fgets(buffer,255,stdin); //Enter a move - n = write(sockfd,buffer,strlen(buffer)); //Sends an input move to the server - bzero(info,256); //resets input stream - - n = read(sockfd,info,255); //Reads from server if move was valid - string ref = info; - if(ref == "Game_Over") { - n = read(sockfd,info,255); //Reads from server if move was valid - cout << "GAME OVER!!!" << endl; - break; - } - else - continue; - } - cout << "\nGAME WINNING MOVE: \n"; - //cout << final_board << endl; - //bzero(info,256); //resets input stream - n = read(sockfd,info,255); //Reads from server if move was valid - - printf("%s\n",info);//Prints the received message - usleep(1); - close(sockfd); - return 0; -} From 14c9003932dd1b92fd07723b534e16a56e127452 Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Tue, 27 Oct 2015 21:57:29 -0500 Subject: [PATCH 086/108] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea6552a..112f16e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ # Breakthrough Reposity for the second CSCE 315 project -Server and client support is highly functional, fixed major bugs. Making the final touches, last thing remaining is to have human vs. human matches over the internet. +To compile everything: g++ -std=c++11 test.cpp Engine.cpp Board.cpp Piece.cpp -o runner or, alternatively if you delete the Parser.h, Parser.cpp, and Client.cpp (there's no need for them currently) g++ -std=c++11 *.cpp -o runner + +To launch the server: ./runner + +Enter a port number when prompted, then the server is launched and waiting for a client to join. + +Client can simply join via telnet: telnet linux.cse.tamu.edu From fea54020ff7229c9d93a0b9f5880f0b37875d889 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 22:30:11 -0500 Subject: [PATCH 087/108] Moved server implementation into server.cpp. Changed test.cpp back to original implementation. --- Engine.cpp | 98 +++++++++--------------------------------------------- Engine.h | 3 +- Server.cpp | 31 +++++++++++------ test.cpp | 5 ++- 4 files changed, 41 insertions(+), 96 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index b5e7558..89a885d 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -15,71 +15,22 @@ Engine::Engine(){ b = brd; } -void Engine::startGame(int port){ - - cout << "Launching server..." << endl; - int sockfd, newsockfd, portno; - socklen_t clilen; - struct sockaddr_in serv_addr, cli_addr; - int n; - - if (port < 2) { - cout << "ERROR, no port provided\n"; - exit(1); - } - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - if (sockfd < 0) - cout << "ERROR opening socket"; - - bzero((char *) &serv_addr, sizeof(serv_addr)); - portno = port; - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = INADDR_ANY; - serv_addr.sin_port = htons(portno); - - if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) - cout << "ERROR on binding"; - - listen(sockfd,5); - clilen = sizeof(cli_addr); - newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); - - if (newsockfd < 0) - cout << "ERROR on accept"; +void Engine::startGame(){ + cout<<"WELCOME\n"; + cout<<"1. Play against AI?\n"; + cout<<"2. Play against a human?\n"; + cout<<"Enter choice: \n"; + + int choice = -1; + cin >> choice; + cout << "OK" << endl; + string move; + bool gameOver = false; vector record; b->snapshot(record, *b); - char buffer[256]; - char info[256]; - int choice = -1; - int choice_difficulty = -1; - string final_move; - - //Ask client about game type - string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; - write(newsockfd, introduction.c_str(), introduction.length()); - n = read(newsockfd,info,255); //Reads choice as a string - istringstream convert(info); //Converts the read string to an integer - convert >> choice; //Sets value equal to the converted value - //Later in the project, we need to check for AI and Human modes - cout << "OK" << endl; - bzero(info,256); //Resets info back to normal - - /*//Becca- once your AI code is working, use this code: - - string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; - write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); - n = read(newsockfd,info,255); - istringstream convert(info); - convert >> choice_difficulty; - cout << "OK" << endl; - bzero(info,256); - - */ while (gameOver != true) { @@ -88,13 +39,9 @@ void Engine::startGame(int port){ while(b->getTurn() == 'O' && !b->isValid()) { b->displayBoard(); - string boardState = b->boardToString(); - final_move = b->boardToString(); - write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) - cout<<"\nStanding by for client... \n"; - n = read(newsockfd,buffer,255);//Read the client's input - move = buffer; - bzero(buffer,256); + cout<<"\nEnter command: "; + cin>>move; + cout << "\n"; b->interpret(move, *b); if(b->isValid()) { b->changeTurns(); @@ -107,28 +54,13 @@ void Engine::startGame(int port){ while(b->getTurn() == 'X' ) { easyAI(); - /*Becca- once you finish your AI, uncomment this out and remove the line directly above this - if(choice_difficulty == 1) - easyAI(); - else if(choice_difficulty == 2) - mediumAI(); - else - hardAI(); - */ } gameOver = b->isGameOver(); b->setValidFalse(); + b->snapshot(record, *b); } - final_move = b->boardToString(); - string game_over = "\n\nGAME OVER!!!\n"; - write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) - write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over - cout << game_over; - usleep(1); - close(newsockfd); - close(sockfd); } void Engine::easyAI() diff --git a/Engine.h b/Engine.h index 642ae82..e148437 100755 --- a/Engine.h +++ b/Engine.h @@ -9,8 +9,9 @@ class Engine { public: Engine(); - void startGame(int port); + void startGame(); void easyAI(); void AI(); + Board* getBoard() { return b; } moves minMax(Board* temp, moves m, int c); }; diff --git a/Server.cpp b/Server.cpp index 348f59a..7f49679 100644 --- a/Server.cpp +++ b/Server.cpp @@ -11,6 +11,7 @@ #include #include #include "Board.h" +#include "Engine.h" using namespace std; void error(const char *msg) @@ -75,42 +76,47 @@ int main(int argc, char *argv[]) // cin >> choice; // cout << "OK" << endl; - Board b; + Engine e; + //Board* temp = e.getBoard(); + //Board b = *temp; string move; //Brute force up in here! bool gameOver = false; vector record; - b.snapshot(record,b); + e.getBoard()->snapshot(record,(*e.getBoard())); char buffer[256]; char info[256]; int choice; int move_counter = 0; string final_move; + write(newsockfd, "Select a choice:\n", 18); //Waiting for client to select game type n = read(newsockfd,info,255); istringstream convert(info); convert >> choice; //Sets choice equal to 1 or 2, based on clients input + //cout << choice << "\n\n"; bzero(info,256); //Resets info back to normal, "choice" now contains client's value while(true) { while(gameOver != true) { - gameOver = b.isGameOver(); + gameOver = e.getBoard()->isGameOver(); - while(b.getTurn() == 'O' ) + while(e.getBoard()->getTurn() == 'O' ) { - b.displayBoard();//Display the board on the server - string boardState = b.boardToString(); + e.getBoard()->displayBoard();//Display the board on the server + string boardState = e.getBoard()->boardToString(); //final_move = b.boardToString(); write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) cout<<"\nWaiting for client: "; n = read(newsockfd,buffer,255); move = buffer; - b.interpret(move,b); - gameOver = b.isGameOver(); + cout << "\ntest" << move << "\n\n"; + e.getBoard()->interpret(move,(*e.getBoard())); + gameOver = e.getBoard()->isGameOver(); if(gameOver == true) { string endGame = "Game_Over"; write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) @@ -119,11 +125,14 @@ int main(int argc, char *argv[]) else { string continueGame = "Continue_Game"; write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + e.getBoard()->changeTurns(); } } - vector possibleMoves = b.viewPossibleMoves(); - if(choice == 1) - b.easyAI(); + vector possibleMoves = e.getBoard()->viewPossibleMoves(); + if(choice == 1) { + cout << "test\n\n"; + e.easyAI(); + } } /* diff --git a/test.cpp b/test.cpp index e697fbe..a503291 100755 --- a/test.cpp +++ b/test.cpp @@ -4,11 +4,14 @@ using namespace std; int main() { + //Board b; Engine e; + /* int pn = 0; cout << "Welcome to Breakthrough server launcher, please enter a host port number: \n"; cin >> pn; cin.clear(); cin.ignore(10000,'\n'); - e.startGame(pn); + */ + e.startGame(); } From f2bd635de8d094643d14aff71de34948e61bf67a Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Tue, 27 Oct 2015 22:39:40 -0500 Subject: [PATCH 088/108] Update README.md --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9168d23..00025fb 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,18 @@ # Breakthrough Reposity for the second CSCE 315 project -To compile everything: - g++ -std=c++11 test.cpp Engine.cpp Board.cpp Piece.cpp -o runner -or, alternatively if you delete the Parser.h, Parser.cpp, and Client.cpp (there's no need for them currently) - g++ -std=c++11 *.cpp -o runner +To compile test: + make + or make all + +To run test: + ./test + +To compile server: + g++ -std=c++11 server.cpp Engine.cpp Board.cpp Piece.cpp -o runner To launch the server: -./runner - -Enter a port number when prompted, then the server is launched and waiting for a client to join. +./runner [port #] Client can simply join via telnet: telnet linux.cse.tamu.edu From 7e2c9ad11fa5d87644d8e93e5826cf411a7b1911 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 22:46:11 -0500 Subject: [PATCH 089/108] Compiles now. --- Engine.cpp | 8 +------- Engine.h | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index 30c3215..aa8c498 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -2,12 +2,6 @@ #include #include #include -#include -#include -#include -#include -#include -#include #include "Engine.h" Engine::Engine(){ @@ -110,7 +104,7 @@ void Engine::AI(){ cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(Board* temp, moves m, int c, int r){ +moves Engine::minMax(Board temp, moves m, int c, int r){ //testing purposes only, c = finite depth cout << "c: " << c << "\n\n"; diff --git a/Engine.h b/Engine.h index f5b5371..3ecf824 100755 --- a/Engine.h +++ b/Engine.h @@ -13,5 +13,5 @@ public: void easyAI(); void AI(); Board* getBoard() { return b; } - moves minMax(Board* temp, moves m, int c); + moves minMax(Board temp, moves m, int c); }; From d1ab8dd5fa576822056cc31c1674b71ba1b7bf41 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 22:56:10 -0500 Subject: [PATCH 090/108] Edited makefile. --- Engine.cpp | 2 +- Engine.h | 2 +- makefile | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Engine.cpp b/Engine.cpp index aa8c498..391f0ab 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -104,7 +104,7 @@ void Engine::AI(){ cout << "----------------------END AI FUNCTION----------------------\n"; } -moves Engine::minMax(Board temp, moves m, int c, int r){ +moves Engine::minMax(Board* temp, moves m, int c, int r){ //testing purposes only, c = finite depth cout << "c: " << c << "\n\n"; diff --git a/Engine.h b/Engine.h index 3ecf824..5e41cf4 100755 --- a/Engine.h +++ b/Engine.h @@ -13,5 +13,5 @@ public: void easyAI(); void AI(); Board* getBoard() { return b; } - moves minMax(Board temp, moves m, int c); + moves minMax(Board* temp, moves m, int c, int r); }; diff --git a/makefile b/makefile index fc3a027..e779fde 100755 --- a/makefile +++ b/makefile @@ -1,7 +1,13 @@ # makefile -all: test +all: test server +server: Server.o + g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o + +Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp + g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp + test: test.o g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o From e8208380a7e0c2663847a031888e7fe03d09c27d Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Tue, 27 Oct 2015 22:58:22 -0500 Subject: [PATCH 091/108] Update README.md Edited instructions to fit makefile. Makes testing and compiling a lot easier. --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 00025fb..6398821 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ # Breakthrough Reposity for the second CSCE 315 project -To compile test: +To compile everything: make or make all To run test: ./test -To compile server: - g++ -std=c++11 server.cpp Engine.cpp Board.cpp Piece.cpp -o runner - To launch the server: -./runner [port #] +./server [port #] Client can simply join via telnet: telnet linux.cse.tamu.edu From 4e402357b1f46099e907a0631f93a9646a92aebc Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 23:22:08 -0500 Subject: [PATCH 092/108] cleaning things up. Testing AI. --- Board.cpp | 13 +++++++------ Engine.cpp | 24 +++++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Board.cpp b/Board.cpp index d428ac5..a7c7f8e 100755 --- a/Board.cpp +++ b/Board.cpp @@ -261,7 +261,7 @@ void Board::move(moves m){ int row = 8 - (m.row); int column = m.column; - cout << "INSIDE MOVE: " << row << " " << column << "\n\n"; + cout << "INSIDE MOVE: " << row << " " << column << " " << m.moveType << "\n\n"; if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getX() << " " << piece->getY() << "\n\n"; + //cout << piece->getX() << " " << piece->getY() << "\n\n"; piece->moveRight(); - cout << piece->getX() << " " << piece->getY() << "\n\n"; + //cout << piece->getX() << " " << piece->getY() << "\n\n"; } } setValidTrue(); @@ -379,7 +379,7 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ else if(temp->getType() != piece->getType()) { char a = temp->getType(); char b = piece->getType(); - cout << a << " " << b << "\n\n"; + //cout << a << " " << b << "\n\n"; return true; } else { @@ -401,7 +401,7 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ else if(temp->getType() != piece->getType()) { char a = temp->getType(); char b = piece->getType(); - cout << a << " " << b << "\n\n"; + //cout << a << " " << b << "\n\n"; return true; } else { @@ -445,7 +445,8 @@ vector Board::viewPossibleMoves(){ } } - else if (turn == '0') { + else if (turn == 'O') { + //cout << "\nTESTING\n\n"; for (int i = 0; i < opieces.size(); ++i){ r = opieces[i]->getX(); c = opieces[i]->getY(); diff --git a/Engine.cpp b/Engine.cpp index 391f0ab..18efac8 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -43,11 +43,11 @@ void Engine::startGame(){ } } - if(b->isValid()) cout << b->getTurn(); + //if(b->isValid()) cout << b->getTurn(); while(b->getTurn() == 'X' ) { - easyAI(); + AI(); } gameOver = b->isGameOver(); @@ -107,14 +107,15 @@ void Engine::AI(){ moves Engine::minMax(Board* temp, moves m, int c, int r){ //testing purposes only, c = finite depth - cout << "c: " << c << "\n\n"; - cout << "current turn: " << temp->getTurn() << "\n"; + //cout << "c: " << c << "\n\n"; + //cout << "current turn: " << temp->getTurn() << "\n"; vector listOfMoves = temp->viewPossibleMoves(); - cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; + //cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; + /* if (c > 5){ return m; } - + */ if (temp->isGameOver() == true){ cout << "END OF PATH REACHED\n"; return m; @@ -122,19 +123,20 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ else { if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ - cout << "piece has been moved in minMax\n"; + //cout << "piece has been moved in minMax\n"; temp->move(m); temp->changeTurns(); - //temp->displayBoard(); + temp->displayBoard(); } else { - cout << m.row << " " << m.column << "\n\n"; + //cout << m.row << " " << m.column << "\n\n"; m = minMax(temp, listOfMoves[++r], c, r); } - temp->displayBoard(); + //temp->displayBoard(); vector listOfMoves = temp->viewPossibleMoves(); - minMax(temp, listOfMoves[c], ++c, 0); + //cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; + minMax(temp, listOfMoves[0], 0, 0); //testing return m; From 4b420fa31f1a4e8bc981f94f1654019d9c4bd717 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Wed, 28 Oct 2015 15:03:49 -0500 Subject: [PATCH 093/108] Java Client fully functional through ascii characters. --- Board.cpp | 2 +- Client.class | Bin 0 -> 1753 bytes Client.java | 46 +++++++++++++++++++ Engine.cpp | 10 ++--- Server.cpp | 5 ++- Serverbackup.txt | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 169 insertions(+), 8 deletions(-) create mode 100644 Client.class create mode 100755 Client.java create mode 100755 Serverbackup.txt diff --git a/Board.cpp b/Board.cpp index a7c7f8e..05adb8c 100755 --- a/Board.cpp +++ b/Board.cpp @@ -261,7 +261,7 @@ void Board::move(moves m){ int row = 8 - (m.row); int column = m.column; - cout << "INSIDE MOVE: " << row << " " << column << " " << m.moveType << "\n\n"; + //cout << "INSIDE MOVE: " << row << " " << column << " " << m.moveType << "\n\n"; if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<T~ixX7=BK&$=NJR`6_{JOG~RLP#_gWZGxzzRHINTsigt6F3BNXNH!tat*!Uo zd#4xPdC^O!Tx=ZE(V5OzXZ#)dH^les5?Dq?hB+Va$FuMAyl>8*|NQbRfLVO4;U&y* zyqUmTcw0jR*EOV(;h5JD$2%Mga(`EYiuX9)=U9~YtOi|1cHxFxmSpx#jt?~SV@}0~ za?i=-Be{I6VHqnj@Rr1(lZsVoyRG6Ajy0K`S8+$fMSRL}mt&nFK5yBUv%nA?pSa7Q zWNRhC(6emW;+9+85{*0NR)s7|)wFDei7(w%YZL9?(6sxCY9(1+QLcYYsFpRNcR@QfN!>HsoPYVv)-^A(a=#uN&4xN$&P=~ z-QE@rQCbsbNi-OYjw5H+U5A(nvl{qxY@;mGALy{Kqhl8ph9N&bB*UU>ReU6EO*HE@ zyD8F|jw)=q)O6Ib$3e9;LAAQr)A0~v^7<8n>WHR8QqF`3|f-d^v~a zUFVMLI^o%nNM{HsM1%Sm0tz_@XW$qo7zBUN6&j2Z10Uba=5n&=Xw8+Bj;iqoFPI+! ziJSGhuqk2s6mEwULNXi<5hb384;q^Jzj)QDb-H=BLn#C-`E({cR3Q56DJ&9cB{T%o5<{zbs(H#0`-D|8#7ozWhf zY=J$c1H-Gd#(iTq5*Wt>ohg)kj~KmSz~5~|3j2t*pe#>DXICbb*`E4XtC5>YyP=w07OUmN{} z76$sydKfek9+Do0JPaG$gHcGUFED4s4AsLqBj(|JfT0nF7Q!$z4;Kile}poh9K3jf zD`{mPmpa&^5}OLXOnU(Tlt?G>9KX|}9PuUDpgYh*67sZ!wDRDB=fF{zuaOCsMsdy8lLEKF1UxPvQ?;#b21F6L1~M0VQf2S2?CQ jrWwZ!M~dSb{e$B*-~jVbjst*2j@gS;>gxm$!5jYq93i9@ literal 0 HcmV?d00001 diff --git a/Client.java b/Client.java new file mode 100755 index 0000000..417a4b6 --- /dev/null +++ b/Client.java @@ -0,0 +1,46 @@ +// Alex Huddleston +// Breakthrough Client in Java + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Scanner; +import java.io.DataInputStream; + +public class Client { + public static void main (String[] args) { + Scanner keyboard = new Scanner(System.in); + String hostname = args[0]; + int portnum = Integer.parseInt(args[1]); + //keyboard.nextLine(); // used to buffer out extra space. + + try { + Socket echoSocket = new Socket(hostname, portnum); + PrintWriter output = new PrintWriter(echoSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); + BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); + + String userInput; + char[] b = new char[256]; + in.read(b, 0, 256); + System.out.println("Response:\n" + b); + + while((userInput = stdIn.readLine()) != null) { + output.println(userInput); + output.flush(); + char[] buffer = new char[256]; + in.read(buffer, 0, 256); + System.out.println(buffer); + System.out.println("testing."); + } + + } + + catch (IOException e){ + System.err.println("IOException: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/Engine.cpp b/Engine.cpp index 18efac8..856f0b0 100755 --- a/Engine.cpp +++ b/Engine.cpp @@ -75,7 +75,7 @@ void Engine::easyAI() } void Engine::AI(){ - cout << "----------------------BEGIN AI FUNCTION----------------------\n"; + //cout << "----------------------BEGIN AI FUNCTION----------------------\n"; vector listOfMoves = b->viewPossibleMoves(); Board* temp = new Board(*b); @@ -101,12 +101,11 @@ void Engine::AI(){ } */ b->displayBoard(); - cout << "----------------------END AI FUNCTION----------------------\n"; + //cout << "----------------------END AI FUNCTION----------------------\n"; } moves Engine::minMax(Board* temp, moves m, int c, int r){ //testing purposes only, c = finite depth - //cout << "c: " << c << "\n\n"; //cout << "current turn: " << temp->getTurn() << "\n"; vector listOfMoves = temp->viewPossibleMoves(); @@ -117,7 +116,7 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ } */ if (temp->isGameOver() == true){ - cout << "END OF PATH REACHED\n"; + //cout << "END OF PATH REACHED\n"; return m; } @@ -125,8 +124,9 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ //cout << "piece has been moved in minMax\n"; temp->move(m); + temp->evaluate('X', 'O'); temp->changeTurns(); - temp->displayBoard(); + //temp->displayBoard(); } else { //cout << m.row << " " << m.column << "\n\n"; diff --git a/Server.cpp b/Server.cpp index 7f49679..c5653ce 100644 --- a/Server.cpp +++ b/Server.cpp @@ -119,12 +119,13 @@ int main(int argc, char *argv[]) gameOver = e.getBoard()->isGameOver(); if(gameOver == true) { string endGame = "Game_Over"; - write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + + //write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) break; } else { string continueGame = "Continue_Game"; - write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + //write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) e.getBoard()->changeTurns(); } } diff --git a/Serverbackup.txt b/Serverbackup.txt new file mode 100755 index 0000000..de9af91 --- /dev/null +++ b/Serverbackup.txt @@ -0,0 +1,114 @@ + + + cout << "Launching server..." << endl; + int sockfd, newsockfd, portno; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + + if (port < 2) { + cout << "ERROR, no port provided\n"; + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + cout << "ERROR opening socket"; + + bzero((char *) &serv_addr, sizeof(serv_addr)); + portno = port; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + cout << "ERROR on binding"; + + listen(sockfd,5); + clilen = sizeof(cli_addr); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + + if (newsockfd < 0) + cout << "ERROR on accept"; + + string move; + bool gameOver = false; + vector record; + b->snapshot(record, *b); + char buffer[256]; + char info[256]; + int choice = -1; + int choice_difficulty = -1; + string final_move; + + //Ask client about game type + string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; + write(newsockfd, introduction.c_str(), introduction.length()); + n = read(newsockfd,info,255); //Reads choice as a string + istringstream convert(info); //Converts the read string to an integer + convert >> choice; //Sets value equal to the converted value + //Later in the project, we need to check for AI and Human modes + cout << "OK" << endl; + bzero(info,256); //Resets info back to normal + + /*//Becca- once your AI code is working, use this code: + + string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; + write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice_difficulty; + cout << "OK" << endl; + bzero(info,256); + + */ + + while (gameOver != true) + { + gameOver = b->isGameOver(); + + while(b->getTurn() == 'O' && !b->isValid()) + { + b->displayBoard(); + string boardState = b->boardToString(); + final_move = b->boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) + cout<<"\nStanding by for client... \n"; + n = read(newsockfd,buffer,255);//Read the client's input + move = buffer; + bzero(buffer,256); + b->interpret(move, *b); + if(b->isValid()) { + b->changeTurns(); + b->setValidFalse(); + } + } + + if(b->isValid()) cout << b->getTurn(); + + while(b->getTurn() == 'X' ) + { + easyAI(); + /*Becca- once you finish your AI, uncomment this out and remove the line directly above this + if(choice_difficulty == 1) + easyAI(); + else if(choice_difficulty == 2) + mediumAI(); + else + hardAI(); + */ + } + + gameOver = b->isGameOver(); + b->setValidFalse(); + b->snapshot(record, *b); + } + final_move = b->boardToString(); + string game_over = "\n\nGAME OVER!!!\n"; + write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) + write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over + cout << game_over; + usleep(1); + close(newsockfd); + close(sockfd); \ No newline at end of file From b6ac66013ef931b230bf0496a53d8cb3b4d0696c Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Wed, 28 Oct 2015 15:08:07 -0500 Subject: [PATCH 094/108] testing --- Client.java | 46 ++++++++++++++ Server.cpp | 152 +++++++++++++++++++++++++++++++++++++++++++++++ Serverbackup.txt | 114 +++++++++++++++++++++++++++++++++++ makefile | 15 +++++ 4 files changed, 327 insertions(+) create mode 100755 Client.java create mode 100644 Server.cpp create mode 100755 Serverbackup.txt create mode 100755 makefile diff --git a/Client.java b/Client.java new file mode 100755 index 0000000..417a4b6 --- /dev/null +++ b/Client.java @@ -0,0 +1,46 @@ +// Alex Huddleston +// Breakthrough Client in Java + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.Scanner; +import java.io.DataInputStream; + +public class Client { + public static void main (String[] args) { + Scanner keyboard = new Scanner(System.in); + String hostname = args[0]; + int portnum = Integer.parseInt(args[1]); + //keyboard.nextLine(); // used to buffer out extra space. + + try { + Socket echoSocket = new Socket(hostname, portnum); + PrintWriter output = new PrintWriter(echoSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); + BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); + + String userInput; + char[] b = new char[256]; + in.read(b, 0, 256); + System.out.println("Response:\n" + b); + + while((userInput = stdIn.readLine()) != null) { + output.println(userInput); + output.flush(); + char[] buffer = new char[256]; + in.read(buffer, 0, 256); + System.out.println(buffer); + System.out.println("testing."); + } + + } + + catch (IOException e){ + System.err.println("IOException: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/Server.cpp b/Server.cpp new file mode 100644 index 0000000..c5653ce --- /dev/null +++ b/Server.cpp @@ -0,0 +1,152 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Board.h" +#include "Engine.h" +using namespace std; + +void error(const char *msg) +{ + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int sockfd, newsockfd, portno; + socklen_t clilen; + + struct sockaddr_in serv_addr, cli_addr; + + int n; + + if (argc < 2) { + fprintf(stderr,"ERROR, no port provided\n"); + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + error("ERROR opening socket"); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + + portno = atoi(argv[1]); + + serv_addr.sin_family = AF_INET; + + serv_addr.sin_addr.s_addr = INADDR_ANY; + + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) + error("ERROR on binding"); + + listen(sockfd,5); + + clilen = sizeof(cli_addr); + + newsockfd = accept(sockfd, + (struct sockaddr *) &cli_addr, + &clilen); + + if (newsockfd < 0) + error("ERROR on accept"); + + //After all the server setup crap is done, we start the board + + // cout<<"WELCOME\n"; + + // cout<<"1. Play against AI?\n"; + // cout<<"2. Play against a human?\n"; + // cout<<"Enter choice: \n"; + + + // cin >> choice; + // cout << "OK" << endl; + + Engine e; + //Board* temp = e.getBoard(); + //Board b = *temp; + string move; + + //Brute force up in here! + bool gameOver = false; + vector record; + e.getBoard()->snapshot(record,(*e.getBoard())); + char buffer[256]; + char info[256]; + int choice; + int move_counter = 0; + string final_move; + + write(newsockfd, "Select a choice:\n", 18); + //Waiting for client to select game type + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice; //Sets choice equal to 1 or 2, based on clients input + //cout << choice << "\n\n"; + bzero(info,256); //Resets info back to normal, "choice" now contains client's value + + while(true) { + + while(gameOver != true) + { + gameOver = e.getBoard()->isGameOver(); + + while(e.getBoard()->getTurn() == 'O' ) + { + e.getBoard()->displayBoard();//Display the board on the server + string boardState = e.getBoard()->boardToString(); + //final_move = b.boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) + cout<<"\nWaiting for client: "; + n = read(newsockfd,buffer,255); + move = buffer; + cout << "\ntest" << move << "\n\n"; + e.getBoard()->interpret(move,(*e.getBoard())); + gameOver = e.getBoard()->isGameOver(); + if(gameOver == true) { + string endGame = "Game_Over"; + + //write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) + break; + } + else { + string continueGame = "Continue_Game"; + //write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + e.getBoard()->changeTurns(); + } + } + vector possibleMoves = e.getBoard()->viewPossibleMoves(); + if(choice == 1) { + cout << "test\n\n"; + e.easyAI(); + } + + } + /* + string final_move = b.boardToString(); + write(newsockfd, final_move.c_str(), final_move.length());//Display the board to the client (line by line) + write(newsockfd, final_move.c_str(), final_move.length()); + cout << "\n\nGAME OVER!!!"; + usleep(1); + */ + close(newsockfd); + close(sockfd); + + break; + } + return 0; +} diff --git a/Serverbackup.txt b/Serverbackup.txt new file mode 100755 index 0000000..de9af91 --- /dev/null +++ b/Serverbackup.txt @@ -0,0 +1,114 @@ + + + cout << "Launching server..." << endl; + int sockfd, newsockfd, portno; + socklen_t clilen; + struct sockaddr_in serv_addr, cli_addr; + int n; + + if (port < 2) { + cout << "ERROR, no port provided\n"; + exit(1); + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd < 0) + cout << "ERROR opening socket"; + + bzero((char *) &serv_addr, sizeof(serv_addr)); + portno = port; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(portno); + + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + cout << "ERROR on binding"; + + listen(sockfd,5); + clilen = sizeof(cli_addr); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + + if (newsockfd < 0) + cout << "ERROR on accept"; + + string move; + bool gameOver = false; + vector record; + b->snapshot(record, *b); + char buffer[256]; + char info[256]; + int choice = -1; + int choice_difficulty = -1; + string final_move; + + //Ask client about game type + string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; + write(newsockfd, introduction.c_str(), introduction.length()); + n = read(newsockfd,info,255); //Reads choice as a string + istringstream convert(info); //Converts the read string to an integer + convert >> choice; //Sets value equal to the converted value + //Later in the project, we need to check for AI and Human modes + cout << "OK" << endl; + bzero(info,256); //Resets info back to normal + + /*//Becca- once your AI code is working, use this code: + + string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; + write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); + n = read(newsockfd,info,255); + istringstream convert(info); + convert >> choice_difficulty; + cout << "OK" << endl; + bzero(info,256); + + */ + + while (gameOver != true) + { + gameOver = b->isGameOver(); + + while(b->getTurn() == 'O' && !b->isValid()) + { + b->displayBoard(); + string boardState = b->boardToString(); + final_move = b->boardToString(); + write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) + cout<<"\nStanding by for client... \n"; + n = read(newsockfd,buffer,255);//Read the client's input + move = buffer; + bzero(buffer,256); + b->interpret(move, *b); + if(b->isValid()) { + b->changeTurns(); + b->setValidFalse(); + } + } + + if(b->isValid()) cout << b->getTurn(); + + while(b->getTurn() == 'X' ) + { + easyAI(); + /*Becca- once you finish your AI, uncomment this out and remove the line directly above this + if(choice_difficulty == 1) + easyAI(); + else if(choice_difficulty == 2) + mediumAI(); + else + hardAI(); + */ + } + + gameOver = b->isGameOver(); + b->setValidFalse(); + b->snapshot(record, *b); + } + final_move = b->boardToString(); + string game_over = "\n\nGAME OVER!!!\n"; + write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) + write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over + cout << game_over; + usleep(1); + close(newsockfd); + close(sockfd); \ No newline at end of file diff --git a/makefile b/makefile new file mode 100755 index 0000000..e779fde --- /dev/null +++ b/makefile @@ -0,0 +1,15 @@ +# makefile + +all: test server + +server: Server.o + g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o + +Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp + g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp + +test: test.o + g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o + +test.o: test.cpp Engine.cpp Board.cpp Piece.cpp + g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp \ No newline at end of file From 37bbd43b84d1c0a015aa98fdb047c9d5eef61439 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Wed, 28 Oct 2015 15:19:53 -0500 Subject: [PATCH 095/108] Updating Branches. --- Board.cpp | 579 +-------------------------------------------------- Board.h | 60 ------ Client.class | Bin 1753 -> 1753 bytes Engine.cpp | 219 +------------------ Engine.h | 20 +- Piece.cpp | 72 ------- Piece.h | 27 --- README.md | 10 - test.cpp | 4 - 9 files changed, 3 insertions(+), 988 deletions(-) diff --git a/Board.cpp b/Board.cpp index 397dc48..93252c9 100644 --- a/Board.cpp +++ b/Board.cpp @@ -1,575 +1,3 @@ -<<<<<<< HEAD -#include -#include -#include "Board.h" - -using namespace std; - -Board::Board() { - Piece* temp; - bool valid = false; - for (int i = 0; i < 2; ++i) { - for (int j = 0; j < 8; ++j) { - temp = new Piece(i, j, 'X'); - xpieces.push_back(temp); - pieces.push_back(temp); - } - } - - for (int i = 6; i < 8; ++i) { - for (int j = 0; j < 8; ++j) { - temp = new Piece(i, j, 'O'); - opieces.push_back(temp); - pieces.push_back(temp); - } - } -} - -Board::Board(const Board& b) { - vector xp = b.getXPieces(); - vector op = b.getOPieces(); - Piece* temp; - bool valid = false; - - for (int i = 0; i < xp.size(); ++i) { - temp = new Piece(xp[i]->getX(), xp[i]->getY(), 'X'); - xpieces.push_back(temp); - pieces.push_back(temp); - } - - for (int i = 0; i < op.size(); ++i) { - temp = new Piece(op[i]->getX(), op[i]->getY(), 'O'); - opieces.push_back(temp); - pieces.push_back(temp); - } -} - -void Board::setValidFalse() { - valid = false; -} - -void Board::setValidTrue() { - valid = true; -} - -bool Board::isValid() { - return valid; -} - -//make this efficient! -bool Board::isPiece(int r, int c){ - for (int i = 0; i < pieces.size(); ++i){ - if (pieces[i]->getX() == r && pieces[i]->getY() == c){ - return true; - } - } - - return false; -} - -void Board::isTaken(int r, int c) { - for (int i = 0; i < pieces.size(); ++i){ - if (pieces[i]->getX() == r && pieces[i]->getY() == c){ - if(pieces[i]->getType() == 'O') { - for(int x = 0; x < opieces.size(); ++x) { - if (opieces[x]->getX() == r && opieces[x]->getY() == c) { - opieces.erase(opieces.begin() + x); - //break; - } - } - } - else { - for(int x = 0; x < xpieces.size(); ++x) { - if (xpieces[x]->getX() == r && xpieces[x]->getY() == c) { - xpieces.erase(xpieces.begin() + x); - //break; - } - } - } - pieces.erase(pieces.begin() + i); - break; - } - } -} - -//make this efficient! -Piece* Board::getPiece(int r, int c){ - for (int i = 0; i < pieces.size(); ++i){ - if (pieces[i]->getX() == r && pieces[i]->getY() == c){ - return pieces[i]; - } - } - - return new Piece(); -} - -moves Board::parse(string input){ - input = myToUpper(input); - - int temp1; - int temp2; - string temp3; - - temp2 = input[0] - 'A'; - temp1 = input[1] - '0'; - - if (input[3] == 'L') - { - temp3 = "LEFT"; - } - - else if (input[3] == 'R') - { - temp3 = "RIGHT"; - } - - else - { - temp3 = "FWD"; - } - - moves output(temp1, temp2, temp3); - - return output; -} - -bool Board::isGameOver(){ - for (int i = 0; i < xpieces.size(); ++i){ - if (xpieces[i]->getX() == 7){ - cout<<"\n\n\nPlayer X wins!\n\n\n"<getX() == 0){ - cout<<"\n\n\nPlayer O wins!\n\n\n"<getX() << " " << pieces[i]->getY() << " " << pieces[i]->getType() << "\t"; - } - cout << "Debugging:\n\n"; - */ - cout << "; A B C D E F G H"<getType() == 'X') - cout << "|" << "X"; - else - cout << "|" << "O"; - else - cout << "|" << "_"; - } - - cout<<"|\n"; - } - - cout<<'\n'<getType() == 'X') - output += "|X"; - else - output += "|O"; - else - output += "|_"; - } - - output += "|\n"; - } - - output += "\n\nturn: "; - output += turn; - output += "\n"; - - return output; -} - -int Board::charToIntColumn(char input){ - int kolumn; - - switch (input) - { - case 'A': kolumn = 0; break; - case 'B': kolumn = 1; break; - case 'C': kolumn = 2; break; - case 'D': kolumn = 3; break; - case 'E': kolumn = 4; break; - case 'F': kolumn = 5; break; - case 'G': kolumn = 6; break; - case 'H': kolumn = 7; break; - } - - return kolumn; -} - -char Board::intToCharColumn(int input){ - char kolumn; - - switch (input) - { - case 1: kolumn = 'A'; break; - case 2: kolumn = 'B'; break; - case 3: kolumn = 'C'; break; - case 4: kolumn = 'D'; break; - case 5: kolumn = 'E'; break; - case 6: kolumn = 'F'; break; - case 7: kolumn = 'G'; break; - case 8: kolumn = 'H'; break; - } - - return kolumn; -} - -void Board::move(string inputMove){ - moves m = parse(inputMove); - cout << "MOVE: " << m.row << " " << m.column << " " << m.moveType << "\n\n"; - move(m); -} - -void Board::move(moves m){ - int row = 8 - (m.row); - int column = m.column; - - cout << "INSIDE MOVE: " << row << " " << column << "\n\n"; - - if (row > 8 || row < 0 || column > 8 || column < 0) { - cout<<"ERROR: index out of bound."<getX() << piece->getY() << "\n\n"; - if (piece->getType() != turn) { - cout<<"ERROR: attempting to move the wrong side's piece.\n"; - } - - else { - if(isThisMovePossible(row, column, m.moveType)) - { - if (m.moveType == "FWD") { - piece->moveFwd(); - } - - else if (m.moveType == "LEFT") { - //add error checking - if(piece->getType() == 'O') { - row--; - column--; - } - else { - row++; - column--; - } - if(isPiece(row, column)) { - if(getPiece(row, column)->getType() != piece->getType()) { - isTaken(row, column); - piece->moveLeft(); - } - } - else { - piece->moveLeft(); - } - } - - else if (m.moveType == "RIGHT") { - //add error checking - //cout << "TESTING??\n\n"; - if(piece->getType() == 'O') { - row--; - column++; - } - else { - row++; - column++; - } - if(isPiece(row, column)) { - if(getPiece(row, column)->getType() != piece->getType()) { - isTaken(row, column); - piece->moveRight(); - } - } - else { - cout << piece->getX() << " " << piece->getY() << "\n\n"; - piece->moveRight(); - cout << piece->getX() << " " << piece->getY() << "\n\n"; - } - } - setValidTrue(); - } - else - { - cout << "Invalid move.\n\n"; - setValidFalse(); - } - } -} - -bool Board::isThisMovePossible(int r, int c, string moveType){ - Piece* piece; - Piece* temp; - if (isPiece(r, c)) - piece = getPiece(r, c); - else - return false; - - if (piece->getType() != turn) { - cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n"; - return false; - } - - else{ - int reflector = 1; - - if (piece->getType() == 'O') - reflector = -1; - - if (moveType == "FWD"){ - if (!isPiece(r + reflector, c)) - return true; - else - return false; - } - - else if (moveType == "RIGHT"){ - temp = getPiece(r + reflector, c+1); - if(c < 7) { - if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) { - //cout << "What.\n\n"; - return true; - } - else if(temp->getType() != piece->getType()) { - char a = temp->getType(); - char b = piece->getType(); - cout << a << " " << b << "\n\n"; - return true; - } - else { - return false; - } - } - else { - return false; - } - } - - else if (moveType == "LEFT"){ - temp = getPiece(r + reflector, c-1); - if(c > 0) { - if (!isPiece(r+reflector, c-1) && (r+reflector >= 0) && (r+reflector <= 7)) { - //cout << "What.\n\n"; - return true; - } - else if(temp->getType() != piece->getType()) { - char a = temp->getType(); - char b = piece->getType(); - cout << a << " " << b << "\n\n"; - return true; - } - else { - return false; - } - } - else { - return false; - } - } - - else return false; - } -} - -vector Board::viewPossibleMoves(){ - int r, c = -1; - vector output; - - if (turn == 'X'){ - for (int i = 0; i < xpieces.size(); ++i){ - r = xpieces[i]->getX(); - c = xpieces[i]->getY(); - if (isThisMovePossible(r, c, "FWD")) - { - moves temp(8-r,c, "FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,c, "LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,c, "RIGHT"); - output.push_back(temp); - } - } - } - - else if (turn == '0') { - for (int i = 0; i < opieces.size(); ++i){ - r = opieces[i]->getX(); - c = opieces[i]->getY(); - if (isThisMovePossible(r, c, "FWD")) - { - moves temp(8-r,intToCharColumn(c+1), "FWD"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"LEFT")) - { - moves temp(8-r,intToCharColumn(c+1), "LEFT"); - output.push_back(temp); - } - - if (isThisMovePossible(r,c,"RIGHT")) - { - moves temp(8-r,intToCharColumn(c+1), "RIGHT"); - output.push_back(temp); - } - } - } - - return output; -} - -string Board::myToUpper(string input){ - string output; - - for (int i = 0 ; i < input.size(); ++i) - { - int numeric; - - if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) - { - numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; - } - else output.push_back(input[i]); - } - - return output; - -} - -void Board::undo(Board& tablero){ - vector record; - - if (record.size() < 2) - { - cout<<"nothing to undo"< record; - input = myToUpper(input); - //cout << "MOVE: " << input << "\n\n"; - - if (input == "UNDO") - { - undo(tablero); - } - - else if (input == "DISPLAYRECORD") //for debugging purposes - { - cout<<"record: "<& inputVec, Board inputBoard){ - if (inputVec.size() == 10) - { - inputVec.erase(inputVec.begin()); - } - - else if (inputVec.size() > 10) - { - cout<<"QUEUE OVERFLOW!"< #include #include "Board.h" @@ -1138,9 +566,4 @@ int Board::evaluate(char max, char min){ return 0; } } - - - - - ->>>>>>> master + diff --git a/Board.h b/Board.h index 6f3d67c..d4fa07c 100644 --- a/Board.h +++ b/Board.h @@ -1,62 +1,3 @@ -<<<<<<< HEAD -#pragma once - -#include -#include -#include "Piece.h" - -using namespace std; - -struct moves { - int row; - int column; - string moveType; - - moves(int linea, int columna, string m) { - row = linea; - column = columna; - moveType = m; - } -}; - -class Board { - vector xpieces; - vector opieces; - vector pieces; - char turn = 'O'; - bool valid = false; - -public: - Board(); - Board(const Board& b); - void setValidFalse(); - void setValidTrue(); - bool isValid(); - bool isPiece(int r, int c); - void isTaken(int r, int c); - Piece* getPiece(int r, int c); - vector getXPieces() const { return xpieces; } - vector getOPieces() const { return opieces; } - moves parse(string input); - char getTurn() { return turn; } - bool isGameOver(); - void changeTurns(); - void displayBoard(); - string boardToString(); - int charToIntColumn(char input); - char intToCharColumn(int input); - void move(string inputMove); - void move(moves jugada); - void moveWOPrint(moves jugada); - bool isThisMovePossible(int r, int c, string moveType); - vector viewPossibleMoves(); - string myToUpper(string input); - void undo(Board& tablero); - void interpret(string input, Board& tablero); - void snapshot(vector& inputVec, Board inputBoard); - int evaluate(char max, char min); -}; -======= #pragma once #include @@ -115,4 +56,3 @@ public: void snapshot(vector& inputVec, Board inputBoard); int evaluate(char max, char min); }; ->>>>>>> master diff --git a/Client.class b/Client.class index 042ed8e77307a7455d31b59757186ab0e2eb4839..05e5552a89d155dd5d85e318ee53f74df30e96f0 100644 GIT binary patch delta 45 scmcb~dy{v=3|2lyhCQrSoRVykoXmoZ43n3!nn8rPfI?hgp;xT$0qp<@(*OVf delta 45 tcmcb~dy{v=3|2md|9e=iI3?L6Ihh3+{!d=UY6cPF0t#_~g -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Engine.h" - -Engine::Engine(){ - Board* brd = new Board(); - b = brd; -} - -void Engine::startGame(int port){ - - cout << "Launching server..." << endl; - int sockfd, newsockfd, portno; - socklen_t clilen; - struct sockaddr_in serv_addr, cli_addr; - int n; - - if (port < 2) { - cout << "ERROR, no port provided\n"; - exit(1); - } - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - - if (sockfd < 0) - cout << "ERROR opening socket"; - - bzero((char *) &serv_addr, sizeof(serv_addr)); - portno = port; - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = INADDR_ANY; - serv_addr.sin_port = htons(portno); - - if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) - cout << "ERROR on binding"; - - listen(sockfd,5); - clilen = sizeof(cli_addr); - newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); - - if (newsockfd < 0) - cout << "ERROR on accept"; - - string move; - bool gameOver = false; - vector record; - b->snapshot(record, *b); - char buffer[256]; - char info[256]; - int choice = -1; - int choice_difficulty = -1; - string final_move; - - //Ask client about game type - string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; - write(newsockfd, introduction.c_str(), introduction.length()); - n = read(newsockfd,info,255); //Reads choice as a string - istringstream convert(info); //Converts the read string to an integer - convert >> choice; //Sets value equal to the converted value - //Later in the project, we need to check for AI and Human modes - cout << "OK" << endl; - bzero(info,256); //Resets info back to normal - - /*//Becca- once your AI code is working, use this code: - - string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; - write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); - n = read(newsockfd,info,255); - istringstream convert(info); - convert >> choice_difficulty; - cout << "OK" << endl; - bzero(info,256); - - */ - - while (gameOver != true) - { - gameOver = b->isGameOver(); - - while(b->getTurn() == 'O' && !b->isValid()) - { - b->displayBoard(); - string boardState = b->boardToString(); - final_move = b->boardToString(); - write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) - cout<<"\nStanding by for client... \n"; - n = read(newsockfd,buffer,255);//Read the client's input - move = buffer; - bzero(buffer,256); - b->interpret(move, *b); - if(b->isValid()) { - b->changeTurns(); - b->setValidFalse(); - } - } - - if(b->isValid()) cout << b->getTurn(); - - while(b->getTurn() == 'X' ) - { - easyAI(); - /*Becca- once you finish your AI, uncomment this out and remove the line directly above this - if(choice_difficulty == 1) - easyAI(); - else if(choice_difficulty == 2) - mediumAI(); - else - hardAI(); - */ - } - - gameOver = b->isGameOver(); - b->setValidFalse(); - b->snapshot(record, *b); - } - final_move = b->boardToString(); - string game_over = "\n\nGAME OVER!!!\n"; - write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) - write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over - cout << game_over; - usleep(1); - close(newsockfd); - close(sockfd); -} - -void Engine::easyAI() -{ - vector listOfMoves = b->viewPossibleMoves(); - /* - for(int x = 0; x < listOfMoves.size(); ++x) { - cout << listOfMoves[x].row << " " << listOfMoves[x].column << " " << listOfMoves[x].moveType << "\n\n"; - } - */ - srand(time(NULL)); - int randomChoice = rand() % (listOfMoves.size()-1) - 0; - - int temp = randomChoice; - cout << "easy AI move: " << listOfMoves[randomChoice].row << listOfMoves[randomChoice].column << listOfMoves[randomChoice].moveType << "\n"; - b->move(listOfMoves[randomChoice]); - b->changeTurns(); -} - -void Engine::AI(){ - cout << "----------------------BEGIN AI FUNCTION----------------------\n"; - vector listOfMoves = b->viewPossibleMoves(); - //Board* b = new Board(*b); - - //probably not needed, check later - /* - if (b->getTurn() != 'X'){ - cout << "a changing of turns is needed. \n"; - b->changeTurns(); - } - */ - //only doing 1 branch right now because testing - /*for (int i = 0; i < listOfMoves.size(); ++i){ - minMax(b, listOfMoves[i]); - }*/ - - b->move(minMax(listOfMoves[0], 0)); - b->changeTurns(); - - //verification of correct turn - /* - if (b->getTurn() != 'O'){ - cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; - } - */ - b->displayBoard(); - cout << "----------------------END AI FUNCTION----------------------\n"; -} - -moves Engine::minMax(moves m, int c){ - //testing purposes only, c = finite depth - /* - if (c > 5){ - return m; - } - - if (b->isGameOver() == true){ - cout << "END OF PATH REACHED\n"; - return m; - } - - else { - if(b->isThisMovePossible(8 - m.row, b->charToIntColumn(m.column), m.moveType)){ - cout << "piece has been moved in minMax\n"; - b->move(m); - b->changeTurns(); - } - cout << "c: " << c << "\n\n"; - cout << "current turn: " << b->getTurn() << "\n"; - vector listOfMoves = b->viewPossibleMoves(); - - for (int i = 0; i < listOfMoves.size(); ++i){ - //return minMax(b, listOfMoves[i]); - } - - b->displayBoard(); - //limited recursion - return minMax(b, listOfMoves[0], ++c); - - //testing - return m; - }*/ -} -======= #include #include #include @@ -357,5 +141,4 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ //testing return m; } -} ->>>>>>> master +} diff --git a/Engine.h b/Engine.h index 48c989a..9a4b2d7 100644 --- a/Engine.h +++ b/Engine.h @@ -1,20 +1,3 @@ -<<<<<<< HEAD -#pragma once - -#include "Board.h" - -using namespace std; - -class Engine { - Board* b; - -public: - Engine(); - void startGame(int port); - void easyAI(); - void AI(); - moves minMax(moves m, int c); -======= #pragma once #include "Board.h" @@ -30,6 +13,5 @@ public: void easyAI(); void AI(); Board* getBoard() { return b; } - moves minMax(Board* temp, moves m, int c, int r); ->>>>>>> master + moves minMax(Board* temp, moves m, int c, int r); }; diff --git a/Piece.cpp b/Piece.cpp index 659b3fa..a438327 100644 --- a/Piece.cpp +++ b/Piece.cpp @@ -1,74 +1,3 @@ -<<<<<<< HEAD -#include -#include "Piece.h" - -using namespace std; - -Piece::Piece(){ - x = -1; - y = -1; - type = '?'; -} - -Piece::Piece(int r, int c){ - x = r; - y = c; - type = '_'; -} - -Piece::Piece(int r, int c, char t){ - x = r; - y = c; - type = t; -} - -void Piece::moveFwd(){ - if (type == 'X'){ - x++; - } - - else if (type == 'O'){ - x--; - } - - else - cout << "Error: trying to move an empty piece forward."; -} - -void Piece::moveLeft(){ - if (type == 'X'){ - x++; - y--; - } - - else if (type == 'O'){ - x--; - y--; - } - - else - cout << "Error: trying to move an empty piece left."; -} - -void Piece::moveRight(){ - if (type == 'X'){ - x++; - y++; - } - - else if (type == 'O'){ - x--; - y++; - } - - else - cout << "Error: trying to move an empty piece left."; -} - -void Piece::isTaken(){ - cout << getX() << " " << getY() << "\n\n"; -} -======= #include #include "Piece.h" @@ -138,4 +67,3 @@ void Piece::moveRight(){ void Piece::isTaken(){ cout << getX() << " " << getY() << "\n\n"; } ->>>>>>> master diff --git a/Piece.h b/Piece.h index 31dc42f..82f6bed 100644 --- a/Piece.h +++ b/Piece.h @@ -1,29 +1,3 @@ -<<<<<<< HEAD -#pragma once - -using namespace std; - -class Piece { - int x; - int y; - char type; - -public: - Piece(); - Piece(int r, int c); - Piece(int r, int c, char t); - void moveFwd(); - void moveLeft(); - void moveRight(); - int getX(){ return x; } - void setX(int r){ x = r; } - int getY(){ return y; } - void setY(int c){ y = c; } - char getType(){ return type; } - void makeEmpty(){ type = '_'; } - void isTaken(); -}; -======= #pragma once using namespace std; @@ -48,4 +22,3 @@ public: void makeEmpty(){ type = '_'; } void isTaken(); }; ->>>>>>> master diff --git a/README.md b/README.md index 4115f48..6398821 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,6 @@ # Breakthrough Reposity for the second CSCE 315 project -<<<<<<< HEAD -To compile everything: g++ -std=c++11 test.cpp Engine.cpp Board.cpp Piece.cpp -o runner or, alternatively if you delete the Parser.h, Parser.cpp, and Client.cpp (there's no need for them currently) g++ -std=c++11 *.cpp -o runner - -To launch the server: ./runner - -Enter a port number when prompted, then the server is launched and waiting for a client to join. - -Client can simply join via telnet: telnet linux.cse.tamu.edu -======= To compile everything: make or make all @@ -22,4 +13,3 @@ To launch the server: Client can simply join via telnet: telnet linux.cse.tamu.edu ->>>>>>> master diff --git a/test.cpp b/test.cpp index 2dd8313..9524e92 100644 --- a/test.cpp +++ b/test.cpp @@ -4,9 +4,6 @@ using namespace std; int main() { -<<<<<<< HEAD - Engine e; -======= //Board b; Engine e; /* @@ -21,5 +18,4 @@ int main() ======= */ e.startGame(); ->>>>>>> master } From d5c8ba286a5f977e2f6765c0c6bd506e0cdf494e Mon Sep 17 00:00:00 2001 From: Brandon Jackson <1drummer@att.net> Date: Wed, 28 Oct 2015 15:21:25 -0500 Subject: [PATCH 096/108] Update Server.cpp --- Server.cpp | 136 +++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/Server.cpp b/Server.cpp index c5653ce..4221292 100644 --- a/Server.cpp +++ b/Server.cpp @@ -22,8 +22,8 @@ void error(const char *msg) int main(int argc, char *argv[]) { - int sockfd, newsockfd, portno; - socklen_t clilen; + int sockfd, newsockfd, portno; + socklen_t clilen; struct sockaddr_in serv_addr, cli_addr; @@ -32,56 +32,40 @@ int main(int argc, char *argv[]) if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); - } + } - sockfd = socket(AF_INET, SOCK_STREAM, 0); + sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) - error("ERROR opening socket"); + if (sockfd < 0) + error("ERROR opening socket"); - bzero((char *) &serv_addr, sizeof(serv_addr)); + bzero((char *) &serv_addr, sizeof(serv_addr)); - portno = atoi(argv[1]); + portno = atoi(argv[1]); - serv_addr.sin_family = AF_INET; + serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_addr.s_addr = INADDR_ANY; - serv_addr.sin_port = htons(portno); + serv_addr.sin_port = htons(portno); - if (bind(sockfd, (struct sockaddr *) &serv_addr, - sizeof(serv_addr)) < 0) - error("ERROR on binding"); + if (bind(sockfd, (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) < 0) + error("ERROR on binding"); - listen(sockfd,5); + listen(sockfd,5); - clilen = sizeof(cli_addr); + clilen = sizeof(cli_addr); - newsockfd = accept(sockfd, - (struct sockaddr *) &cli_addr, - &clilen); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); - if (newsockfd < 0) - error("ERROR on accept"); + if (newsockfd < 0) + error("ERROR on accept"); //After all the server setup crap is done, we start the board - - // cout<<"WELCOME\n"; - - // cout<<"1. Play against AI?\n"; - // cout<<"2. Play against a human?\n"; - // cout<<"Enter choice: \n"; - - - // cin >> choice; - // cout << "OK" << endl; - Engine e; - //Board* temp = e.getBoard(); - //Board b = *temp; string move; - //Brute force up in here! bool gameOver = false; vector record; e.getBoard()->snapshot(record,(*e.getBoard())); @@ -90,62 +74,82 @@ int main(int argc, char *argv[]) int choice; int move_counter = 0; string final_move; + + //Ask client about game type + string introduction = "WELCOME\n1. Play against AI?\n2. Watch AI vs. AI?\nEnter choice: \n"; + write(newsockfd, introduction.c_str(), introduction.length()); + n = read(newsockfd,info,255); //Reads choice as a string + istringstream convert(info); //Converts the read string to an integer + convert >> choice; //Sets value equal to the converted value + //Later in the project, we need to check for AI and Human modes + cout << "OK" << endl; + bzero(info,256); //Resets info back to normal - write(newsockfd, "Select a choice:\n", 18); - //Waiting for client to select game type + /*//Becca- once your AI code is working, use this code: + + string difficulty_select = "Choose Difficulty\n1. Easy\n2. Medium\n4. Hard\nEnter choice: \n"; + write(newsockfd, difficulty_select.c_str(), difficulty_select.length()); n = read(newsockfd,info,255); istringstream convert(info); - convert >> choice; //Sets choice equal to 1 or 2, based on clients input - //cout << choice << "\n\n"; - bzero(info,256); //Resets info back to normal, "choice" now contains client's value + convert >> choice_difficulty; + cout << "OK" << endl; + bzero(info,256); - while(true) { + */ + + while(true) { while(gameOver != true) { gameOver = e.getBoard()->isGameOver(); - while(e.getBoard()->getTurn() == 'O' ) + while(e.getBoard()->getTurn() == 'O' && !e.getBoard()->isValid()) { e.getBoard()->displayBoard();//Display the board on the server string boardState = e.getBoard()->boardToString(); - //final_move = b.boardToString(); + final_move = e.getBoard()->boardToString(); write(newsockfd, boardState.c_str(), boardState.length());//Display the board to the client (line by line) cout<<"\nWaiting for client: "; n = read(newsockfd,buffer,255); move = buffer; - cout << "\ntest" << move << "\n\n"; + bzero(buffer,256); e.getBoard()->interpret(move,(*e.getBoard())); - gameOver = e.getBoard()->isGameOver(); - if(gameOver == true) { - string endGame = "Game_Over"; - - //write(newsockfd, endGame.c_str(), endGame.length()); //Display the board to the client (line by line) - break; - } - else { - string continueGame = "Continue_Game"; - //write(newsockfd, continueGame.c_str(), continueGame.length()); //Display the board to the client (line by line) + + if(e.getBoard()->isValid()) { e.getBoard()->changeTurns(); + e.getBoard()->setValidFalse(); } } - vector possibleMoves = e.getBoard()->viewPossibleMoves(); - if(choice == 1) { - cout << "test\n\n"; + + if(e.getBoard()->isValid()) + cout << e.getBoard()->getTurn(); + + while(e.getBoard()->getTurn() == 'X' ) + { e.easyAI(); + /*Becca- once you finish your AI, uncomment this out and remove the line directly above this + if(choice_difficulty == 1) + easyAI(); + else if(choice_difficulty == 2) + mediumAI(); + else + hardAI(); + */ } - + + gameOver = e.getBoard()->isGameOver(); + e.getBoard()->setValidFalse(); + e.getBoard()->snapshot(record, *e.getBoard()); } - /* - string final_move = b.boardToString(); - write(newsockfd, final_move.c_str(), final_move.length());//Display the board to the client (line by line) - write(newsockfd, final_move.c_str(), final_move.length()); - cout << "\n\nGAME OVER!!!"; - usleep(1); - */ + + final_move = e.getBoard()->boardToString(); + string game_over = "\n\nGAME OVER!!!\n"; + write(newsockfd, final_move.c_str(), final_move.length()); //Display the board to the client (line by line) + write(newsockfd, game_over.c_str(), game_over.length()); //Tell the client the game is over + cout << game_over; + usleep(1); close(newsockfd); close(sockfd); - break; } return 0; From 7723ca5bbbef3a799d0cc3637cc428d36f1acca2 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Wed, 28 Oct 2015 15:48:29 -0500 Subject: [PATCH 097/108] Updating. --- Client.class | Bin 1753 -> 1963 bytes Client.java | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Client.class b/Client.class index 05e5552a89d155dd5d85e318ee53f74df30e96f0..e87fedda52da5af0c6bc04cda084644468309e87 100644 GIT binary patch delta 1133 zcmZvaO-x)>6vuxTn7K2LS3ZXF@sOcFKb)Crr&L<(pjJezC^!mA3#jcdJYZm)ftg1w zRiSFD#)S!)l?xX&F)UoQO{PYZE;Z?Ytg)cAX+;h+W{LjZd zzwG@P;pZ96kkQXt1Q^ylr#Wlv=Phi5 ztYyTA7fkev7Nd+A^Cg2$8u7BlD~t!2Flk;5@S4FS1E-lZ-g5>l!p}L)dBZWKnYQRA z5n#sX*DVh4hB>{dxuChYbz{0ECFN>nr9`Q&Qd3&OON}aA9VJ%kRV}eO8<%;TC<~fJ zn+!{e`lZyRR6OT;@ritT+4YQjxwNX<0$JWNMy|A_`Zx2e7-Q9@K+(oyO>@cSZ7$oa zbH$wAv3Zx6<~^GYHWk6MgJZ*8$;shyo2$I9P_v4F=N7$8ZsC~C2gDRjmGqf>d?Y!1 zIqj}^nS9RXL)H|n6<0QuTZm7T9;mwTzCD;km(4Y<+k9k_f6SHJvsE`#>9d-yqrS+@ zP;^pK72MR^XeQ?>_D7pPA>%kKy37#?yeYM|@E1F59*|B=D;u)N&>#!nNIfBOx5zYFIZhkH zIGm@03o?ggIw{g6_-?M#!>1f%i$i?DVZP!Bw`GDq$PDkx^nMikXJP+M#`C)j=mBy5 z5XL|0mE@-+ecuLub5c3(4 a?%>ne6cquDS#ewk*IC#djOMZ@ zuU1lXNDkgSXq5*`tr}7>l~h@!smgzlyE*$Gh_6>uacb)O-h2Jt>#tw;gZ2M3*ZzL} z+aJJQelTojShKH*{d{6bFk;AaKy%R0$fue^mJb`!e5UzabHw_i2FGTus|Mt$=+NsjtdcA$q|MeAbWdLg$G`la0TLLmseie}#79OoT+_*Qel;X4Y^vf8k{ zhl`4~dVycgO;!9LoT>PsS8-V2lFj#``)YsYGDYiLaqwAmxJoISN_5uDNw2z84ys<> zI9wyJPViv!CwCIJRrD%3(l*#P{w@|2bCVYry@fDZm&!J!!}4?}rz%GC zNjK_Gc14F9+G}S-M#U>!8utTFk-A)3sa_H8n;+dJOATJ7qA*1-obamELeXOz-SQsn zmq5uFdIfigmlamRss2^eBQX>^1sm(ZW}4_@m)Mf3ejz0n4gWqR5#3H*tvw|(yGmPT zLrlBd6w?v2F=msiW8B$%`US&o%1y_7;HF|Ww<>;5<&E3ung+3BT4o;8>YA8N;Y?O4 z@2$PKM|VE?n63Zy?y|j;G24XSwtpmYI(WwOn!Kq*UG1C%V7;ho5o{H&T@KvA9yT(@ zCeE^%3v|kzXSu~zex!?^CF70^<*tn7p$ueIM)Iee^BDs?r=P#r%}WNwf)SEyQfM^0 lH3OPKr5VygT2S diff --git a/Client.java b/Client.java index 417a4b6..65f525e 100755 --- a/Client.java +++ b/Client.java @@ -9,6 +9,7 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.io.DataInputStream; +import java.util.Arrays; public class Client { public static void main (String[] args) { @@ -26,7 +27,7 @@ public class Client { String userInput; char[] b = new char[256]; in.read(b, 0, 256); - System.out.println("Response:\n" + b); + System.out.println(b); while((userInput = stdIn.readLine()) != null) { output.println(userInput); @@ -34,9 +35,18 @@ public class Client { char[] buffer = new char[256]; in.read(buffer, 0, 256); System.out.println(buffer); + for(int i = 0; i < buffer.length - 10; ++i) { + if(Arrays.copyOfRange(buffer, i, i+10).equals("GAME OVER")) { + System.out.println("b"); + break; + } + } System.out.println("testing."); } - + output.close(); + in.close(); + stdIn.close(); + echoSocket.close(); } catch (IOException e){ From da2a1aec2ba1f8f08c92b743244889c114f29bf1 Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Wed, 28 Oct 2015 17:12:44 -0500 Subject: [PATCH 098/108] stable AI --- Board.cpp | 127 +++++++++++++++++++++++------------------------------ Board.h | 9 ++-- Engine.cpp | 57 +++++++----------------- Engine.h | 4 +- test.cpp | 11 ----- 5 files changed, 77 insertions(+), 131 deletions(-) diff --git a/Board.cpp b/Board.cpp index 93252c9..c3b5902 100644 --- a/Board.cpp +++ b/Board.cpp @@ -45,18 +45,6 @@ Board::Board(const Board& b) { } } -void Board::setValidFalse() { - valid = false; -} - -void Board::setValidTrue() { - valid = true; -} - -bool Board::isValid() { - return valid; -} - //make this efficient! bool Board::isPiece(int r, int c){ for (int i = 0; i < pieces.size(); ++i){ @@ -68,31 +56,6 @@ bool Board::isPiece(int r, int c){ return false; } -void Board::isTaken(int r, int c) { - for (int i = 0; i < pieces.size(); ++i){ - if (pieces[i]->getX() == r && pieces[i]->getY() == c){ - if(pieces[i]->getType() == 'O') { - for(int x = 0; x < opieces.size(); ++x) { - if (opieces[x]->getX() == r && opieces[x]->getY() == c) { - opieces.erase(opieces.begin() + x); - //break; - } - } - } - else { - for(int x = 0; x < xpieces.size(); ++x) { - if (xpieces[x]->getX() == r && xpieces[x]->getY() == c) { - xpieces.erase(xpieces.begin() + x); - //break; - } - } - } - pieces.erase(pieces.begin() + i); - break; - } - } -} - //make this efficient! Piece* Board::getPiece(int r, int c){ for (int i = 0; i < pieces.size(); ++i){ @@ -104,6 +67,29 @@ Piece* Board::getPiece(int r, int c){ return new Piece(); } +void Board::isTaken(int r, int c) { + for (int i = 0; i < pieces.size(); ++i){ + if (pieces[i]->getX() == r && pieces[i]->getY() == c){ + if(pieces[i]->getType() == 'O') { + for(int x = 0; x < opieces.size(); ++x) { + if (opieces[x]->getX() == r && opieces[x]->getY() == c) { + opieces.erase(opieces.begin() + x); + } + } + } + else { + for(int x = 0; x < xpieces.size(); ++x) { + if (xpieces[x]->getX() == r && xpieces[x]->getY() == c) { + xpieces.erase(xpieces.begin() + x); + } + } + } + pieces.erase(pieces.begin() + i); + break; + } + } +} + moves Board::parse(string input){ input = myToUpper(input); @@ -137,17 +123,33 @@ moves Board::parse(string input){ bool Board::isGameOver(){ for (int i = 0; i < xpieces.size(); ++i){ if (xpieces[i]->getX() == 7){ - cout<<"\n\n\nPlayer X wins!\n\n\n"<getX() == 0){ - cout<<"\n\n\nPlayer O wins!\n\n\n"<getX() == 7){ + return "Player X wins!"; + } + } + + for (int i = 0; i < opieces.size(); ++i){ + if (opieces[i]->getX() == 0){ + return "Player O wins!"; + } + } + + return "ERROR: function whoWon() called incorrectly."; } void Board::changeTurns(){ @@ -156,15 +158,6 @@ void Board::changeTurns(){ } void Board::displayBoard(){ - /* - cout << "Debugging:\n"; - for (int i = 0; i < pieces.size(); ++i){ - if(i%8 == 0) - cout << "\n"; - cout << pieces[i]->getX() << " " << pieces[i]->getY() << " " << pieces[i]->getType() << "\t"; - } - cout << "Debugging:\n\n"; - */ cout << "; A B C D E F G H"< Board::viewPossibleMoves(){ } else if (turn == 'O') { - //cout << "\nTESTING\n\n"; for (int i = 0; i < opieces.size(); ++i){ r = opieces[i]->getX(); c = opieces[i]->getY(); @@ -483,7 +475,7 @@ string Board::myToUpper(string input){ if ((input[i] - 0 >= 97) && (input[i] - 0 <= 122)) { numeric = input[i] - 32; - output.push_back((char)numeric);// = 'Q';//(char) numeric; + output.push_back((char)numeric); } else output.push_back(input[i]); } @@ -495,17 +487,13 @@ string Board::myToUpper(string input){ void Board::undo(Board& tablero){ vector record; - if (record.size() < 2) - { + if (record.size() < 2){ cout<<"nothing to undo"< record; input = myToUpper(input); - //cout << "MOVE: " << input << "\n\n"; - if (input == "UNDO") - { + if (input == "UNDO"){ undo(tablero); } - else if (input == "DISPLAYRECORD") //for debugging purposes - { + else if (input == "DISPLAYRECORD"){ cout<<"record: "<& inputVec, Board inputBoard){ - if (inputVec.size() == 10) - { + if (inputVec.size() == 10){ inputVec.erase(inputVec.begin()); } - else if (inputVec.size() > 10) - { + else if (inputVec.size() > 10){ cout<<"QUEUE OVERFLOW!"< getXPieces() const { return xpieces; } vector getOPieces() const { return opieces; } char getTurnPls() const { return turn; } moves parse(string input); char getTurn() { return turn; } bool isGameOver(); + string whoWon(); void changeTurns(); void displayBoard(); string boardToString(); diff --git a/Engine.cpp b/Engine.cpp index 5bf1da1..3ba0753 100644 --- a/Engine.cpp +++ b/Engine.cpp @@ -26,27 +26,23 @@ void Engine::startGame(){ vector record; b->snapshot(record, *b); - while (gameOver != true) - { + while (gameOver != true){ gameOver = b->isGameOver(); - while(b->getTurn() == 'O' && !b->isValid()) - { + while(b->getTurn() == 'O' && !b->isValid()){ b->displayBoard(); cout<<"\nEnter command: "; cin>>move; cout << "\n"; b->interpret(move, *b); - if(b->isValid()) { + + if(b->isValid()){ b->changeTurns(); b->setValidFalse(); } } - //if(b->isValid()) cout << b->getTurn(); - - while(b->getTurn() == 'X' ) - { + while(b->getTurn() == 'X' ){ AI(); } @@ -57,41 +53,30 @@ void Engine::startGame(){ } } -void Engine::easyAI() -{ +void Engine::easyAI(){ vector listOfMoves = b->viewPossibleMoves(); - /* - for(int x = 0; x < listOfMoves.size(); ++x) { - cout << listOfMoves[x].row << " " << listOfMoves[x].column << " " << listOfMoves[x].moveType << "\n\n"; - } - */ + srand(time(NULL)); int randomChoice = rand() % (listOfMoves.size()-1) - 0; - //int temp = randomChoice; - cout << "easy AI move: " << listOfMoves[randomChoice].row << listOfMoves[randomChoice].column << listOfMoves[randomChoice].moveType << "\n"; b->move(listOfMoves[randomChoice]); b->changeTurns(); } -void Engine::AI(){ - //cout << "----------------------BEGIN AI FUNCTION----------------------\n"; +void Engine::AI(int depth){ vector listOfMoves = b->viewPossibleMoves(); Board* temp = new Board(*b); - //probably not needed, check later - /* - if (b->getTurn() != 'X'){ - cout << "a changing of turns is needed. \n"; - b->changeTurns(); - } - */ + //create node with current board state + //only doing 1 branch right now because testing /*for (int i = 0; i < listOfMoves.size(); ++i){ minMax(b, listOfMoves[i]); }*/ + //remove this soon b->move(minMax(temp, listOfMoves[0], 0, 0)); + b->changeTurns(); //verification of correct turn @@ -100,8 +85,8 @@ void Engine::AI(){ cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; } */ + b->displayBoard(); - //cout << "----------------------END AI FUNCTION----------------------\n"; } moves Engine::minMax(Board* temp, moves m, int c, int r){ @@ -109,36 +94,24 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ //cout << "c: " << c << "\n\n"; //cout << "current turn: " << temp->getTurn() << "\n"; vector listOfMoves = temp->viewPossibleMoves(); - //cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; - /* - if (c > 5){ - return m; - } - */ + if (temp->isGameOver() == true){ - //cout << "END OF PATH REACHED\n"; + cout << "END OF PATH REACHED\n\n"; return m; } else { if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ - //cout << "piece has been moved in minMax\n"; temp->move(m); temp->evaluate('X', 'O'); temp->changeTurns(); - //temp->displayBoard(); } else { - //cout << m.row << " " << m.column << "\n\n"; m = minMax(temp, listOfMoves[++r], c, r); } - //temp->displayBoard(); vector listOfMoves = temp->viewPossibleMoves(); - //cout << "listOfMoves size: " << listOfMoves.size() << "\n\n"; minMax(temp, listOfMoves[0], 0, 0); - - //testing return m; } } diff --git a/Engine.h b/Engine.h index 9a4b2d7..d552741 100644 --- a/Engine.h +++ b/Engine.h @@ -9,9 +9,9 @@ class Engine { public: Engine(); + Board* getBoard() { return b; } void startGame(); void easyAI(); - void AI(); - Board* getBoard() { return b; } + void AI(int depth); moves minMax(Board* temp, moves m, int c, int r); }; diff --git a/test.cpp b/test.cpp index 9524e92..c26c406 100644 --- a/test.cpp +++ b/test.cpp @@ -6,16 +6,5 @@ int main() { //Board b; Engine e; - /* ->>>>>>> master - int pn = 0; - cout << "Welcome to Breakthrough server launcher, please enter a host port number: \n"; - cin >> pn; - cin.clear(); - cin.ignore(10000,'\n'); -<<<<<<< HEAD - e.startGame(pn); -======= - */ e.startGame(); } From b1b340e6d2fe2271c61d8adb0391185cf405e05b Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Thu, 29 Oct 2015 08:58:32 -0500 Subject: [PATCH 099/108] minmax structure done --- Board.cpp | 26 ++++++++++++++------------ Board.h | 11 ++++++++--- Engine.cpp | 37 ++++++++++++++----------------------- Engine.h | 5 +++-- MNode.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ MNode.h | 30 ++++++++++++++++++++++++++++++ makefile | 12 ++++++------ 7 files changed, 118 insertions(+), 46 deletions(-) create mode 100755 MNode.cpp create mode 100755 MNode.h diff --git a/Board.cpp b/Board.cpp index c3b5902..6750ab2 100644 --- a/Board.cpp +++ b/Board.cpp @@ -250,7 +250,7 @@ void Board::move(string inputMove){ move(m); } -void Board::move(moves m){ +Board Board::move(moves m){ int row = 8 - (m.row); int column = m.column; @@ -258,7 +258,7 @@ void Board::move(moves m){ if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getX() << piece->getY() << "\n\n"; if (piece->getType() != turn) { @@ -277,9 +277,9 @@ void Board::move(moves m){ else { if(isThisMovePossible(row, column, m.moveType)) - { + { if (m.moveType == "FWD") { - piece->moveFwd(); + piece->moveFwd(); } else if (m.moveType == "LEFT") { @@ -334,6 +334,8 @@ void Board::move(moves m){ setValidFalse(); } } + + return *this; } bool Board::isThisMovePossible(int r, int c, string moveType){ @@ -355,16 +357,16 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ if (piece->getType() == 'O') reflector = -1; - if (moveType == "FWD"){ + if (moveType == "FWD"){ if (!isPiece(r + reflector, c)) - return true; + return true; else return false; } else if (moveType == "RIGHT"){ temp = getPiece(r + reflector, c+1); - if(c < 7) { + if(c < 7) { if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) { //cout << "What.\n\n"; return true; @@ -379,14 +381,14 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ return false; } } - else { + else { return false; } } else if (moveType == "LEFT"){ temp = getPiece(r + reflector, c-1); - if(c > 0) { + if(c > 0) { if (!isPiece(r+reflector, c-1) && (r+reflector >= 0) && (r+reflector <= 7)) { //cout << "What.\n\n"; return true; @@ -401,7 +403,7 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ return false; } } - else { + else { return false; } } @@ -549,4 +551,4 @@ int Board::evaluate(char max, char min){ return 0; } } - + diff --git a/Board.h b/Board.h index 21c5d4a..7af5bcf 100644 --- a/Board.h +++ b/Board.h @@ -10,6 +10,12 @@ struct moves { int row; int column; string moveType; + + moves() { + row = -1; + column = -1; + moveType = ""; + } moves(int linea, int columna, string m) { row = linea; @@ -47,8 +53,7 @@ public: int charToIntColumn(char input); char intToCharColumn(int input); void move(string inputMove); - void move(moves jugada); - void moveWOPrint(moves jugada); + Board move(moves m); bool isThisMovePossible(int r, int c, string moveType); vector viewPossibleMoves(); string myToUpper(string input); @@ -56,4 +61,4 @@ public: void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); int evaluate(char max, char min); -}; +}; diff --git a/Engine.cpp b/Engine.cpp index 3ba0753..17079f0 100644 --- a/Engine.cpp +++ b/Engine.cpp @@ -43,7 +43,8 @@ void Engine::startGame(){ } while(b->getTurn() == 'X' ){ - AI(); + easyAI(); + //AI(3); } gameOver = b->isGameOver(); @@ -64,10 +65,9 @@ void Engine::easyAI(){ } void Engine::AI(int depth){ - vector listOfMoves = b->viewPossibleMoves(); Board* temp = new Board(*b); - - //create node with current board state + moves empty; + MNode* root = new MNode(*temp, empty, 0); //only doing 1 branch right now because testing /*for (int i = 0; i < listOfMoves.size(); ++i){ @@ -75,33 +75,23 @@ void Engine::AI(int depth){ }*/ //remove this soon - b->move(minMax(temp, listOfMoves[0], 0, 0)); - - b->changeTurns(); - - //verification of correct turn - /* - if (b->getTurn() != 'O'){ - cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; - } - */ + //b->move(minMax(temp, listOfMoves[0], 0, 0)); + b->changeTurns(); b->displayBoard(); } -moves Engine::minMax(Board* temp, moves m, int c, int r){ - //testing purposes only, c = finite depth - //cout << "c: " << c << "\n\n"; - //cout << "current turn: " << temp->getTurn() << "\n"; - vector listOfMoves = temp->viewPossibleMoves(); - - if (temp->isGameOver() == true){ +moves Engine::minMax(MNode* node, int depth){ + Board current = node->getState(); + vector listOfMoves = current.viewPossibleMoves(); + /* + if (current.isGameOver() == true){ cout << "END OF PATH REACHED\n\n"; return m; } else { - if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ + if(current.getPiece(8 - m.row, m.column)->getType() == current.getTurn() && current.isThisMovePossible(8 - m.row, m.column, m.moveType)){ temp->move(m); temp->evaluate('X', 'O'); temp->changeTurns(); @@ -114,4 +104,5 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ minMax(temp, listOfMoves[0], 0, 0); return m; } -} + */ +} diff --git a/Engine.h b/Engine.h index d552741..89f3327 100644 --- a/Engine.h +++ b/Engine.h @@ -1,6 +1,7 @@ #pragma once #include "Board.h" +#include "MNode.h" using namespace std; @@ -13,5 +14,5 @@ public: void startGame(); void easyAI(); void AI(int depth); - moves minMax(Board* temp, moves m, int c, int r); -}; + moves minMax(MNode* node, int depth); +}; diff --git a/MNode.cpp b/MNode.cpp new file mode 100755 index 0000000..8f4c410 --- /dev/null +++ b/MNode.cpp @@ -0,0 +1,43 @@ +#include +#include +#include "MNode.h" + +using namespace std; + +MNode::MNode(){ + children.clear(); + minimax_val = -1; +} + +MNode::MNode(Board s, moves m, int mmval){ + state = s; + mvs = m; + minimax_val = mmval; +} + +MNode::MNode(const MNode& n){ + children = n.getChildren(); + minimax_val = n.getMMVal(); +} + +void MNode::setMMVal(int mmval) { + minimax_val = mmval; +} + +bool MNode::hasChildren(){ + if (children.size() != 0) + return true; + else + return false; +} + +void printTree(int depth, const MNode& n){ + vector children; + cout << "depth " << depth << " :" << n.getMMVal() << " "; + children = n.getChildren(); + + //print out root + for (int i = 0; i < children.size(); ++i){ + printTree(++depth, *children[i]); + } +} \ No newline at end of file diff --git a/MNode.h b/MNode.h new file mode 100755 index 0000000..1afe963 --- /dev/null +++ b/MNode.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include "Board.h" + +using namespace std; + +class MNode { + vector children; + Board state; + moves mvs; + int minimax_val; + +public: + MNode(); + MNode(Board s, moves m, int mmval); + MNode(const MNode& n); + vector getChildren() const { return children; } + void addChild(MNode* n) { children.push_back(n); } + int getMMVal() const { return minimax_val; } + void setMMVal(int mmval); + Board getState() { return state; } + void setState(Board s) { state = s; } + moves getMove() { return mvs; } + void setMove(moves m) { mvs = m; } + bool hasChildren(); +}; + +void printTree(int depth, const MNode& n); \ No newline at end of file diff --git a/makefile b/makefile index e779fde..de4028a 100755 --- a/makefile +++ b/makefile @@ -3,13 +3,13 @@ all: test server server: Server.o - g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o + g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o MNode.o -Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp - g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp +Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp + g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp test: test.o - g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o + g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o MNode.o -test.o: test.cpp Engine.cpp Board.cpp Piece.cpp - g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp \ No newline at end of file +test.o: test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp + g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp \ No newline at end of file From 2cd4345b6ed129c680b6a4fc596b3e984247df9b Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 09:40:51 -0500 Subject: [PATCH 100/108] Updating branches. --- Client.class | Bin 1963 -> 2962 bytes Client.java | 49 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/Client.class b/Client.class index e87fedda52da5af0c6bc04cda084644468309e87..01f480af6c769c08d2557624dd93adf546800323 100644 GIT binary patch literal 2962 zcmZ`*Yjhh&75>JSw5!!Rdf0NZX_LBb8f538#7&)6c3f=P2~O?Ev0S@~d1Nh*Z6(sK zx>`9&%NtWDZGl30G*Bol)IfPOfvil_q&y3h*E#SP`jd0u7w7PY1C(%Q<%e91kI(Gv zy?4I*%{TYX>b3t|y$+xgzf*88#wFbE#{?!7G~fXR8Jv0?TOiRcr2x3M87tdJ*Va!RGmyi?hXB0#QU<=O5$ctw|f}!9hjLR^^v#8)fSTag7 zY%wj1VL`?@;XE(lf{ce0?5<^hSi!sT9>Mgz3f_nJ%lLo@|DXW=kVw5Kh7T)v1RoKh z9~HAl#qcrVcud665X55=9v3iA$oRN|d+-SXwG$GptYZJZ-IpDj1NywHFl?EKB%-imRxqcp29u zTvzc5e#qcI);BWPmYNtGQ}HAGSjA6pMa55rpg%*OgjYqfODcXYH2npBsp2*KO2x0m zk*~=(lo~vr;$*1#O(n-tC#b3GH;f6s>m%}2t#KY8xjd6ib&@kqAK>rhFnXOEW>8j4IATmdM@yB zlWJ!rw|>r!C(T09G^pp??p0{TM6Q&pwR-H7z-`@xsS6*R<94cSuNAD2qkT<}dJieJ zeO;*y9yi4nLaGy1FkA)YT;3jPm>H5FHkG8UlZ-ySSmXwo_HDv`1-nlA zmF6LQX+h7Id1}_Z;*$RxDMBn>%u3{$QCKS>9cf!OgJ2zA2!Gu1~78 zmeozy5u-Rr*3vh)ijT5s`!xj@l@tXaH}njNE04!y~>!xnApBiZ#lg^B{8 zq^AfkE4qX>z%6P#g@ha7rIJ3!aVvW1^Dq7y!02M_qp_dfcF>d2)7w!2yF?R)B#l1T z7=j-I7^FFcHXebOzVTpxs-hut8I2WqhC3QNM>;&6%kcJA;mcGYB|KHgnTWpvCE?Y) zJ_iBK8*Xe1H$31#)x69>ljij}*iuC>vv)@Yp@grBa7Lrhh^K<)gj7XKri!R*YOP>v z1=|wxs?p8tn*0$hp@bP;_9g9wxFymSxz)jK4sIt) zWETw%?ntOr?9N2qQb8<1j2yIUO%6IHFJq4uaIiPBFR>-$C+uKjS120Ng4drzR14B< zOElzQ|NV<0wshk!uBQlN=nZQH&79$U4Q{87;Dm zPLaJi8or3;H41kwhS`!3Nlw&E6O=)iUypr3BtxS6V{4aaah#;^-I?!W^5j(Zd_Jb`vR zMUl^94}I?T;t$w|*RdaeMjU^o)qlf5{0p5-!a>%ALo9^5STnlV4jg8?a5vk7d)NUa z*kN?DBzo9M9AOjaWv6j3n?*k>Vt_r2LG}oavWvv~8Ja(jHh*dYvTX_ literal 1963 zcmZ`)OKcle6g|(sXOAcU<};xQN&3MyZQO=_z$t|!q{WcbB`!&w0PVznP9|~2?s#09 z0xh2w5Ie+*1sf!kb%SJA1a%1#8zk7UL}J5+4I88g5$+qui6eq#z0dueckey-z4_sv zZyo^{!p90ih;a-Da1PHZaN)dy=kPqohyou*ImYDtf&xFrIWBNql=~MIsM0csxEx-R z-Y+Ydz@*$>lGX`1TvqT3ru<0CW3Kq|s(=7n`dpU;uRv!WX&Lq}+C zVoATLM{~Nl5KY>aVJ-|y$A+Y>rScyD zM{MMymnk%R#xiVSsmNhP>SY2o{b(th6_&_M2|Xh$2Cb%un}w21nF)QRs#B3iLAu{i zVWFtPMv3F5iZ^jf#VT&g)mtjwMug)X6?br#A#ibIa=b4wJwB!4UA)J@<{A99DB4u9 zK^5=IWOss%C&q83MZq@mriu?xV(4_jsjKp6$;df@Hq;r%`c&M*eH9iE!tv*LmvCfUehDjYA;W=MMD^wQpQ4ecH=8RJ7i;u6H)+JO^wlEWw{*U+n#fMk-6dRq zHDpP(PuwW!IkMQpM73>(!?OgM&gF~b;}#ZC=hF)XVN%w|_aSJThq_?5TbHs|sM?dF zSk#^K?R>T0=skLZ-ZS}gfzd^a(D)?ndT3@edm|OF2ee=~Mx)OWHX?xI7^F3sx_aTI zClsuE1FqCM+!c5xBJQEdh-c^_yyrLIOC9T}fX6%=@TW9S839iPO3b@~U}^)ZBWkFi zv4WXg)3Arga(3GwW#40%f#nyo|O~%>Nx0HLvC`{hLe?llDN1=-rx&r*(7+f2x9k)E|H@^`(zaxr22=Pyxq_fY^>8J2FPBRT>NdsiTw+LL}IKgp} zV~BA)#c_(`H2uNJ1zY5!?r%U2WI}&xlkg_In^3kW3(u}K2=Ht#<^D9C=E5`o0=xRi AH~;_u diff --git a/Client.java b/Client.java index 65f525e..54075ca 100755 --- a/Client.java +++ b/Client.java @@ -10,13 +10,26 @@ import java.io.InputStreamReader; import java.util.Scanner; import java.io.DataInputStream; import java.util.Arrays; +import javax.swing.*; +import javax.swing.text.html.parser.ParserDelegator; public class Client { + public static void main (String[] args) { Scanner keyboard = new Scanner(System.in); String hostname = args[0]; int portnum = Integer.parseInt(args[1]); //keyboard.nextLine(); // used to buffer out extra space. + ParserDelegator parserDelegator = new ParserDelegator(); + //System.out.println("parserDelegator set: "+ parserDelegator); + JFrame frame = new JFrame("Breakthrough"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(800, 600); + frame.setLocationRelativeTo(null); + + + //frame.pack(); + frame.setVisible(true); try { Socket echoSocket = new Socket(hostname, portnum); @@ -24,24 +37,40 @@ public class Client { BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); - String userInput; + String userInput = "test"; char[] b = new char[256]; in.read(b, 0, 256); - System.out.println(b); - - while((userInput = stdIn.readLine()) != null) { + String temp = "" + String.valueOf(b).replace("\n", "
").trim() + "
"; + JLabel label = new JLabel("testing"); + frame.getContentPane().add(label); + System.out.print(b); + String g = "GAME OVER"; + char[] go = new char[9]; + for(int x = 0; x < go.length; ++x) { + go[x] = g.charAt(x); + } + boolean end = false; + int c = 0; + while(!end && (userInput != null)) { + userInput = stdIn.readLine(); output.println(userInput); output.flush(); char[] buffer = new char[256]; in.read(buffer, 0, 256); - System.out.println(buffer); - for(int i = 0; i < buffer.length - 10; ++i) { - if(Arrays.copyOfRange(buffer, i, i+10).equals("GAME OVER")) { - System.out.println("b"); - break; + JLabel display = new JLabel(Arrays.toString(buffer)); + if(c == 0) { + frame.getContentPane().remove(label); + ++c; + } + else { + frame.getContentPane().remove(display); + } + frame.getContentPane().add(display); + for(int i = 0; i < buffer.length; ++i) { + if(Arrays.equals(Arrays.copyOfRange(buffer, i, i+9), go)) { + end = true; } } - System.out.println("testing."); } output.close(); in.close(); From 4c3e57769be8cf2ab7ae6f14a6dbb0a24cd14ac5 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 09:49:01 -0500 Subject: [PATCH 101/108] Cleaning up endgame for test. --- Engine.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Engine.cpp b/Engine.cpp index 17079f0..185cb90 100644 --- a/Engine.cpp +++ b/Engine.cpp @@ -52,6 +52,10 @@ void Engine::startGame(){ b->snapshot(record, *b); } + b->displayBoard(); + string s = ""; + s += b->getTurn(); + cout << "Game over. " + s + " wins!\n\n"; } void Engine::easyAI(){ From a5671cab3936a5b60558dc04f25470a4d20174a6 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 13:32:48 -0500 Subject: [PATCH 102/108] Updating branch. --- Client.class | Bin 2962 -> 0 bytes Client.java | 135 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 110 insertions(+), 25 deletions(-) delete mode 100644 Client.class diff --git a/Client.class b/Client.class deleted file mode 100644 index 01f480af6c769c08d2557624dd93adf546800323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2962 zcmZ`*Yjhh&75>JSw5!!Rdf0NZX_LBb8f538#7&)6c3f=P2~O?Ev0S@~d1Nh*Z6(sK zx>`9&%NtWDZGl30G*Bol)IfPOfvil_q&y3h*E#SP`jd0u7w7PY1C(%Q<%e91kI(Gv zy?4I*%{TYX>b3t|y$+xgzf*88#wFbE#{?!7G~fXR8Jv0?TOiRcr2x3M87tdJ*Va!RGmyi?hXB0#QU<=O5$ctw|f}!9hjLR^^v#8)fSTag7 zY%wj1VL`?@;XE(lf{ce0?5<^hSi!sT9>Mgz3f_nJ%lLo@|DXW=kVw5Kh7T)v1RoKh z9~HAl#qcrVcud665X55=9v3iA$oRN|d+-SXwG$GptYZJZ-IpDj1NywHFl?EKB%-imRxqcp29u zTvzc5e#qcI);BWPmYNtGQ}HAGSjA6pMa55rpg%*OgjYqfODcXYH2npBsp2*KO2x0m zk*~=(lo~vr;$*1#O(n-tC#b3GH;f6s>m%}2t#KY8xjd6ib&@kqAK>rhFnXOEW>8j4IATmdM@yB zlWJ!rw|>r!C(T09G^pp??p0{TM6Q&pwR-H7z-`@xsS6*R<94cSuNAD2qkT<}dJieJ zeO;*y9yi4nLaGy1FkA)YT;3jPm>H5FHkG8UlZ-ySSmXwo_HDv`1-nlA zmF6LQX+h7Id1}_Z;*$RxDMBn>%u3{$QCKS>9cf!OgJ2zA2!Gu1~78 zmeozy5u-Rr*3vh)ijT5s`!xj@l@tXaH}njNE04!y~>!xnApBiZ#lg^B{8 zq^AfkE4qX>z%6P#g@ha7rIJ3!aVvW1^Dq7y!02M_qp_dfcF>d2)7w!2yF?R)B#l1T z7=j-I7^FFcHXebOzVTpxs-hut8I2WqhC3QNM>;&6%kcJA;mcGYB|KHgnTWpvCE?Y) zJ_iBK8*Xe1H$31#)x69>ljij}*iuC>vv)@Yp@grBa7Lrhh^K<)gj7XKri!R*YOP>v z1=|wxs?p8tn*0$hp@bP;_9g9wxFymSxz)jK4sIt) zWETw%?ntOr?9N2qQb8<1j2yIUO%6IHFJq4uaIiPBFR>-$C+uKjS120Ng4drzR14B< zOElzQ|NV<0wshk!uBQlN=nZQH&79$U4Q{87;Dm zPLaJi8or3;H41kwhS`!3Nlw&E6O=)iUypr3BtxS6V{4aaah#;^-I?!W^5j(Zd_Jb`vR zMUl^94}I?T;t$w|*RdaeMjU^o)qlf5{0p5-!a>%ALo9^5STnlV4jg8?a5vk7d)NUa z*kN?DBzo9M9AOjaWv6j3n?*k>Vt_r2LG}oavWvv~8Ja(jHh*dYvTX_ diff --git a/Client.java b/Client.java index 54075ca..809f6fb 100755 --- a/Client.java +++ b/Client.java @@ -11,25 +11,109 @@ import java.util.Scanner; import java.io.DataInputStream; import java.util.Arrays; import javax.swing.*; -import javax.swing.text.html.parser.ParserDelegator; +import javax.*; +import java.awt.*; +import java.awt.geom.*; +//import javax.swing.text.html.parser.ParserDelegator; -public class Client { +public class Client extends JFrame { + + public Client() { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + public void drawBoard(String b) { + board = b; + bp = new BoardPanel(); + board = TrimBoard(); + JFrame frame = new JFrame("Breakthrough"); + frame.getContentPane().add(BorderLayout.CENTER, bp); + frame.setSize(800, 600); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + bp.DrawPieces(); + /* + Graphics test = getGraphics(); + test.clearRect(0, 0, 800, 600); + test.setColor(Color.black); + */ + //frame.getContentPane().add(test, BorderLayout.CENTER); + //this.paint(test); + //frame.repaint(); + } + + public String TrimBoard() { + String output = ""; + for(int i = 0; i < board.length(); ++i) { + if(board.charAt(i) == 'X') { + output += board.charAt(i); + } + + else if(board.charAt(i) == '_') { + output += board.charAt(i); + } + + else if(board.charAt(i) == 'O') { + output += board.charAt(i); + } + } + return output; + } + + class BoardPanel extends JPanel { + public void DrawPieces() { + Graphics g = getGraphics(); + g.clearRect(0, 0, 800, 600); + g.setColor(Color.black); + this.validate(); + //add("Center", new BoardCanvas()); + + //background.setRect(0.0, 0.0, 800.0, 600.0); + //back = background; + //back.setPaint(0, 0, 0); + //g.draw(background); + } + } + + class BoardCanvas extends Canvas { + public void paint(Graphics graphics) { + Graphics2D g = (Graphics2D) graphics; + + Shape pieces[] = new Shape[32]; + + int c = 0; + + Shape sh = new Ellipse2D.Double(0,0,100,100); + g.draw(sh); + + for(int x = 0; x < board.length(); ++x) { + if(board.charAt(x) == 'X') { + pieces[c] = new Ellipse2D.Double((((x%8) + 1)*10), ((x/8)*20), 10, 10); + c++; + } + + else if(board.charAt(x) == 'O') { + pieces[c] = new Ellipse2D.Double((((x%8) + 1)*10), ((x/8)*20), 10, 10); + c++; + } + } + + for(int s = 0; s < pieces.length; ++s) { + if(pieces[s] != null) { + g.draw(pieces[s]); + } + } + + } + } + public static void main (String[] args) { Scanner keyboard = new Scanner(System.in); String hostname = args[0]; int portnum = Integer.parseInt(args[1]); - //keyboard.nextLine(); // used to buffer out extra space. - ParserDelegator parserDelegator = new ParserDelegator(); - //System.out.println("parserDelegator set: "+ parserDelegator); - JFrame frame = new JFrame("Breakthrough"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(800, 600); - frame.setLocationRelativeTo(null); - - //frame.pack(); - frame.setVisible(true); + Client window = new Client(); try { Socket echoSocket = new Socket(hostname, portnum); @@ -40,37 +124,34 @@ public class Client { String userInput = "test"; char[] b = new char[256]; in.read(b, 0, 256); - String temp = "" + String.valueOf(b).replace("\n", "
").trim() + "
"; - JLabel label = new JLabel("testing"); - frame.getContentPane().add(label); - System.out.print(b); + + String temp = String.valueOf(b).trim(); + System.out.print(temp); + //setBoard(temp); + //window.drawBoard(temp); + String g = "GAME OVER"; char[] go = new char[9]; for(int x = 0; x < go.length; ++x) { go[x] = g.charAt(x); } + boolean end = false; int c = 0; + while(!end && (userInput != null)) { userInput = stdIn.readLine(); output.println(userInput); output.flush(); char[] buffer = new char[256]; in.read(buffer, 0, 256); - JLabel display = new JLabel(Arrays.toString(buffer)); - if(c == 0) { - frame.getContentPane().remove(label); - ++c; - } - else { - frame.getContentPane().remove(display); - } - frame.getContentPane().add(display); for(int i = 0; i < buffer.length; ++i) { if(Arrays.equals(Arrays.copyOfRange(buffer, i, i+9), go)) { end = true; } } + System.out.println(String.valueOf(buffer).trim()); + window.drawBoard(String.valueOf(buffer).trim()); } output.close(); in.close(); @@ -82,4 +163,8 @@ public class Client { System.err.println("IOException: " + e.getMessage()); } } + + String board; + + BoardPanel bp; } \ No newline at end of file From e8d9c61f8606126bee0a17ecb6d29d7b4e45663e Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 19:49:05 -0500 Subject: [PATCH 103/108] GUI is stable and can handle board changes. It's ugly, but it works. --- Client.java | 238 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 164 insertions(+), 74 deletions(-) diff --git a/Client.java b/Client.java index 809f6fb..b69e41c 100755 --- a/Client.java +++ b/Client.java @@ -14,35 +14,136 @@ import javax.swing.*; import javax.*; import java.awt.*; import java.awt.geom.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import javax.swing.border.*; +import java.net.URL; +import javax.imageio.ImageIO; +import java.awt.image.*; //import javax.swing.text.html.parser.ParserDelegator; -public class Client extends JFrame { +public class Client { + + private final JPanel gui = new JPanel(new BorderLayout(3, 3)); + private JButton[][] boardSquares = new JButton[8][8]; + private Image[] pieceImages = new Image[2]; + private JPanel boardPanel; + private static final String Columns = "ABCDEFGH"; + public static final int BLACK = 0, WHITE = 1; public Client() { - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + initializeGui(); } - public void drawBoard(String b) { - board = b; - bp = new BoardPanel(); - board = TrimBoard(); - JFrame frame = new JFrame("Breakthrough"); - frame.getContentPane().add(BorderLayout.CENTER, bp); - frame.setSize(800, 600); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - bp.DrawPieces(); - /* - Graphics test = getGraphics(); - test.clearRect(0, 0, 800, 600); - test.setColor(Color.black); - */ - //frame.getContentPane().add(test, BorderLayout.CENTER); - //this.paint(test); - //frame.repaint(); + public final void initializeGui() { + createImages(); + + gui.setBorder(new EmptyBorder(5,5,5,5)); + + boardPanel = new JPanel(new GridLayout(0, 9)) { + + /** + * Override the preferred size to return the largest it can, in + * a square shape. Must (must, must) be added to a GridBagLayout + * as the only component (it uses the parent as a guide to size) + * with no GridBagConstaint (so it is centered). + */ + @Override + public final Dimension getPreferredSize() { + Dimension d = super.getPreferredSize(); + Dimension prefSize = null; + Component c = getParent(); + if (c == null) { + prefSize = new Dimension( + (int)d.getWidth(),(int)d.getHeight()); + } else if (c!=null && + c.getWidth()>d.getWidth() && + c.getHeight()>d.getHeight()) { + prefSize = c.getSize(); + } else { + prefSize = d; + } + int w = (int) prefSize.getWidth(); + int h = (int) prefSize.getHeight(); + // the smaller of the two sizes + int s = (w>h ? h : w); + return new Dimension(s,s); + } + }; + boardPanel.setBorder(new CompoundBorder( + new EmptyBorder(8,8,8,8), + new LineBorder(Color.BLACK) + )); + // Set BG. + Color background = new Color(100,100,100); + Color boardbg = new Color(250, 200, 100); + boardPanel.setBackground(background); + JPanel boardConstrain = new JPanel(new GridBagLayout()); + boardConstrain.setBackground(background); + boardConstrain.add(boardPanel); + gui.add(boardConstrain); + + Insets buttonMargin = new Insets(0,0,0,0); + for(int r = 0; r < boardSquares.length; ++r) { + for(int c = 0; c < boardSquares.length; ++c) { + Action selectPiece = new AbstractAction("") { + @Override + public void actionPerformed(ActionEvent e) { + sendLocation(); + } + }; + JButton b = new JButton(); + b.setMargin(buttonMargin); + b.setAction(selectPiece); + + ImageIcon icon = new ImageIcon( new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB)); + b.setIcon(icon); + b.setBackground(boardbg); + boardSquares[r][c] = b; + } + } + + // fill the board. + boardPanel.add(new JLabel("")); + // fill the top row + for(int c = 0; c < 8; c++) { + boardPanel.add(new JLabel(Columns.substring(c, c + 1), SwingConstants.CENTER)); + } + // fill everything else + for(int r = 0; r < 8; ++r) { + for(int c = 0; c < 8; c++) { + switch(c) { + case 0: boardPanel.add(new JLabel("" + (9 - (r + 1)), SwingConstants.CENTER)); + + default: boardPanel.add(boardSquares[r][c]); + } + } + } } - public String TrimBoard() { + public final JComponent getGui() { + return gui; + } + + private final void createImages() { + try { + URL url1 = new URL("http://www.iconsdb.com/icons/preview/black/circle-xxl.png"); + BufferedImage bi = ImageIO.read(url1); + Image img = bi.getScaledInstance(64, 64, BufferedImage.SCALE_FAST); + pieceImages[0] = img; + + URL url2 = new URL("http://www.iconsdb.com/icons/preview/white/circle-xxl.png"); + bi = ImageIO.read(url2); + img = bi.getScaledInstance(64, 64, BufferedImage.SCALE_FAST); + pieceImages[1] = img; + } + catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } + + public String TrimBoard(String board) { String output = ""; for(int i = 0; i < board.length(); ++i) { if(board.charAt(i) == 'X') { @@ -59,62 +160,45 @@ public class Client extends JFrame { } return output; } - - class BoardPanel extends JPanel { - public void DrawPieces() { - Graphics g = getGraphics(); - g.clearRect(0, 0, 800, 600); - g.setColor(Color.black); - this.validate(); - //add("Center", new BoardCanvas()); - - //background.setRect(0.0, 0.0, 800.0, 600.0); - //back = background; - //back.setPaint(0, 0, 0); - //g.draw(background); - } - } - - class BoardCanvas extends Canvas { - public void paint(Graphics graphics) { - Graphics2D g = (Graphics2D) graphics; - - Shape pieces[] = new Shape[32]; - - int c = 0; - - Shape sh = new Ellipse2D.Double(0,0,100,100); - g.draw(sh); - - for(int x = 0; x < board.length(); ++x) { - if(board.charAt(x) == 'X') { - pieces[c] = new Ellipse2D.Double((((x%8) + 1)*10), ((x/8)*20), 10, 10); - c++; - } - - else if(board.charAt(x) == 'O') { - pieces[c] = new Ellipse2D.Double((((x%8) + 1)*10), ((x/8)*20), 10, 10); - c++; - } - } - - for(int s = 0; s < pieces.length; ++s) { - if(pieces[s] != null) { - g.draw(pieces[s]); - } - } - + + public final void updateBoard(String board) { + board = TrimBoard(board); + int count = 0; + ImageIcon icon = new ImageIcon( new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB)); + for(int r = 0; r < 8; ++r) { + for(int c = 0; c < 8; c++) { + if(board.charAt(count) == 'X') { + boardSquares[r][c].setIcon(new ImageIcon(pieceImages[0])); + } + else if(board.charAt(count) == 'O') { + boardSquares[r][c].setIcon(new ImageIcon(pieceImages[1])); + } + else { + boardSquares[r][c].setIcon(icon); + } + count++; + } + } + if(board.charAt(count) == 'X') { + boardSquares[7][7].setIcon(new ImageIcon(pieceImages[0])); + } + else if(board.charAt(count) == 'O') { + boardSquares[7][7].setIcon(new ImageIcon(pieceImages[1])); + } + else { + boardSquares[7][7].setIcon(icon); } } + public void sendLocation() { + } + public static void main (String[] args) { Scanner keyboard = new Scanner(System.in); String hostname = args[0]; int portnum = Integer.parseInt(args[1]); - Client window = new Client(); - try { Socket echoSocket = new Socket(hostname, portnum); PrintWriter output = new PrintWriter(echoSocket.getOutputStream(), true); @@ -139,6 +223,17 @@ public class Client extends JFrame { boolean end = false; int c = 0; + Client window = new Client(); + + JFrame frame = new JFrame("Breakthrough"); + frame.add(window.getGui()); + + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.setLocationByPlatform(true); + frame.pack(); + frame.setMinimumSize(frame.getSize()); + frame.setVisible(true); + while(!end && (userInput != null)) { userInput = stdIn.readLine(); output.println(userInput); @@ -151,20 +246,15 @@ public class Client extends JFrame { } } System.out.println(String.valueOf(buffer).trim()); - window.drawBoard(String.valueOf(buffer).trim()); + window.updateBoard(String.valueOf(buffer).trim()); } output.close(); in.close(); stdIn.close(); echoSocket.close(); } - catch (IOException e){ System.err.println("IOException: " + e.getMessage()); } } - - String board; - - BoardPanel bp; } \ No newline at end of file From 44e97150b182af664d8c021178db6edb61589f90 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 22:18:52 -0500 Subject: [PATCH 104/108] GUI Fully functional to play. Need to encorporate quit, undo, and game over conditions. --- Client.java | 27 +++++++++++++++++++-------- Server.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/Client.java b/Client.java index b69e41c..ad96d69 100755 --- a/Client.java +++ b/Client.java @@ -30,6 +30,7 @@ public class Client { private JPanel boardPanel; private static final String Columns = "ABCDEFGH"; public static final int BLACK = 0, WHITE = 1; + public static String boardoutput = ""; public Client() { initializeGui(); @@ -86,10 +87,12 @@ public class Client { Insets buttonMargin = new Insets(0,0,0,0); for(int r = 0; r < boardSquares.length; ++r) { for(int c = 0; c < boardSquares.length; ++c) { + final int selectrow = r; + final int selectcol = c; Action selectPiece = new AbstractAction("") { @Override public void actionPerformed(ActionEvent e) { - sendLocation(); + sendLocation(selectrow, selectcol); } }; JButton b = new JButton(); @@ -190,11 +193,13 @@ public class Client { } } - public void sendLocation() { - + public void sendLocation(int r, int c) { + //debugging. + System.out.println("row: " + r + " col: " + c); + boardoutput += "" + r + "" + c; } - public static void main (String[] args) { + public static void main (String[] args) throws InterruptedException { Scanner keyboard = new Scanner(System.in); String hostname = args[0]; int portnum = Integer.parseInt(args[1]); @@ -233,11 +238,10 @@ public class Client { frame.pack(); frame.setMinimumSize(frame.getSize()); frame.setVisible(true); + userInput = stdIn.readLine(); + output.println(userInput); - while(!end && (userInput != null)) { - userInput = stdIn.readLine(); - output.println(userInput); - output.flush(); + while(!end) { char[] buffer = new char[256]; in.read(buffer, 0, 256); for(int i = 0; i < buffer.length; ++i) { @@ -247,6 +251,13 @@ public class Client { } System.out.println(String.valueOf(buffer).trim()); window.updateBoard(String.valueOf(buffer).trim()); + while(boardoutput.length() < 4) { + Thread.sleep(100); + } + System.out.println(boardoutput); + output.println(boardoutput); + output.flush(); + boardoutput = ""; } output.close(); in.close(); diff --git a/Server.cpp b/Server.cpp index 4221292..0c96b26 100644 --- a/Server.cpp +++ b/Server.cpp @@ -20,6 +20,40 @@ void error(const char *msg) exit(1); } +string tempParse(string move) { + string output = ""; + int tempa = move[0] - '0'; + int tempb = move[1] - '0'; + int tempc = move[2] - '0'; + int tempd = move[3] - '0'; + + //cout << "move: " << move << " " << tempa << " " << tempb << " " << tempc << " " << tempd << "\n"; + + for(int c = 0; c < 4; c++) { + if(!isdigit(move[c])) { + //cout << "\nfjdkjfjd\n"; + return move; + } + } + if(tempa == (tempc + 1)) { + //cout << "\nTest\n"; + if(tempb == tempd) { + output = ((char)('A' + tempb)) + to_string(8 - tempa) + "_f"; + } + else if(tempb == (tempd + 1)) { + output = ((char)('A' + tempb)) + to_string(8 - tempa) + "_l"; + } + else if(tempb == (tempd - 1)) { + output = ((char)('A' + tempb)) + to_string(8 - tempa) + "_r"; + } + } + else { + return move; + } + cout << "Debugging: " << output << "\n\n"; + return output; +} + int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; @@ -113,6 +147,9 @@ int main(int argc, char *argv[]) n = read(newsockfd,buffer,255); move = buffer; bzero(buffer,256); + //cout << move << "\n\n"; + move = tempParse(move); + //cout << move << "\n\n"; e.getBoard()->interpret(move,(*e.getBoard())); if(e.getBoard()->isValid()) { From 6b0eccd81ab327dcf519af887ad966c4346d458c Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Thu, 29 Oct 2015 22:32:08 -0500 Subject: [PATCH 105/108] Update README.md --- README.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6398821..da6d757 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,28 @@ # Breakthrough Reposity for the second CSCE 315 project -To compile everything: +# To compile everything: make or make all -To run test: +# To run test: ./test -To launch the server: -./server [port #] +# To launch the server: + ./server [port #] -Client can simply join via telnet: - telnet linux.cse.tamu.edu +Java Client is now functional with GUI. + +# To compile the client: + javac Client.java + +# To run: + java Client [server address] [port #] + Where [server address] is linux.cs.tamu.edu (or whatever server you're on) and [port #] is the same as server's [port #]. + +# Troubleshooting: +- Make sure you enable X11 forwarding in your PuTTY settings before you start your connection to the linux server. +- Make sure you also open XLaunch and just click next until finish so that PuTTY doesn't whine about not having a server to start up the client with. +- The GUI takes two moves at a time, to play click the square with the piece you want to move, then the square you want to move it to. Remember there is very minimal error checking on the GUI side, so if you make an incorrect move, the server will just yell at you and the client will continue like nothing happened. I left in some Debugging output on both the Client and Server side so you guys can tell where you messed up. Let me know if you experience any bugs. +- The game will not automatically close on Game Over, you will have to close the window yourself, but that's not exactly a bug, so I'm just going to leave it in. +- Be patient. Swing is very slow and it'll take a second or two for it to initialize the window and a couple seconds to render the icons each time you make a move (depending on if you're using a VPN or not, runs smoothly on campus). From fffe837ce165a8df98bff832e0b60bd6c16f5c33 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Thu, 29 Oct 2015 22:33:32 -0500 Subject: [PATCH 106/108] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index da6d757..f187fb6 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Java Client is now functional with GUI. # Troubleshooting: - Make sure you enable X11 forwarding in your PuTTY settings before you start your connection to the linux server. - Make sure you also open XLaunch and just click next until finish so that PuTTY doesn't whine about not having a server to start up the client with. +- You will need to manually enter "1" when you start the client. Haven't gotten around to doing that frame just yet, but mostly because the AI stuff isn't finished yet. - The GUI takes two moves at a time, to play click the square with the piece you want to move, then the square you want to move it to. Remember there is very minimal error checking on the GUI side, so if you make an incorrect move, the server will just yell at you and the client will continue like nothing happened. I left in some Debugging output on both the Client and Server side so you guys can tell where you messed up. Let me know if you experience any bugs. - The game will not automatically close on Game Over, you will have to close the window yourself, but that's not exactly a bug, so I'm just going to leave it in. - Be patient. Swing is very slow and it'll take a second or two for it to initialize the window and a couple seconds to render the icons each time you make a move (depending on if you're using a VPN or not, runs smoothly on campus). From e2840671231ab11e57ba672dcb202a50729e2f7f Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Thu, 29 Oct 2015 22:46:07 -0500 Subject: [PATCH 107/108] Edited makefile. --- Client.java | 2 +- makefile | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Client.java b/Client.java index ad96d69..8f3d5f7 100755 --- a/Client.java +++ b/Client.java @@ -251,7 +251,7 @@ public class Client { } System.out.println(String.valueOf(buffer).trim()); window.updateBoard(String.valueOf(buffer).trim()); - while(boardoutput.length() < 4) { + while(!end && boardoutput.length() < 4) { Thread.sleep(100); } System.out.println(boardoutput); diff --git a/makefile b/makefile index de4028a..7adedd8 100755 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ # makefile -all: test server +all: test server Client.class server: Server.o g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o MNode.o @@ -12,4 +12,10 @@ test: test.o g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o MNode.o test.o: test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp - g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp \ No newline at end of file + g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp + +Client.class: Client.java + javac -g Client.java + +clean: + $(RM) *.class *.o \ No newline at end of file From 2965fb6e2c2f67811bafdc45a1ee9d3b9baee907 Mon Sep 17 00:00:00 2001 From: Alex Huddleston Date: Thu, 29 Oct 2015 22:48:45 -0500 Subject: [PATCH 108/108] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f187fb6..4eb839f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ Reposity for the second CSCE 315 project make or make all + ***NOTE*** + To remove all .class and .o files, just use: make clean. + # To run test: ./test @@ -12,11 +15,8 @@ Reposity for the second CSCE 315 project ./server [port #] Java Client is now functional with GUI. - -# To compile the client: - javac Client.java -# To run: +# To launch the client: java Client [server address] [port #] Where [server address] is linux.cs.tamu.edu (or whatever server you're on) and [port #] is the same as server's [port #].