From 5adf3531ca25f1c26d03106a1999a4ecd3082de4 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Mon, 12 Oct 2015 17:19:07 -0500 Subject: [PATCH 01/75] 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 02/75] 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 03/75] 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 04/75] 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 05/75] 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 06/75] 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 07/75] 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 08/75] 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 09/75] 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 10/75] 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 11/75] 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 12/75] 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 13/75] 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 14/75] 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 15/75] 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 16/75] 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 17/75] 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 18/75] 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 19/75] 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 20/75] 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 21/75] 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 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 22/75] 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 23/75] 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 24/75] 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 25/75] 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 26/75] 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 27/75] 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 28/75] 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 29/75] 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 30/75] 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 31/75] 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 32/75] 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 33/75] 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 34/75] 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 35/75] 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 36/75] 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 37/75] 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 38/75] 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 39/75] 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 40/75] 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 41/75] 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 42/75] 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 43/75] 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 44/75] 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 45/75] 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 46/75] 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 47/75] 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 48/75] 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 49/75] 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 50/75] 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 51/75] 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 zcmcG13w%`7@&Dc3ECh%oyfkXm6@vmocnSz83uIx@01*;J0YgXv1Ve(!hL@<+fMpF) zs-Uz*rAmFG;tNqRL_vaznpSJ6qUNV)H->6dv}n=%zcXjf-Mcq?(f)p)|K*dNduHa$ z%$YNDUia>DV<2mS+vPI! zhQ~y-hKa)G0ZhQ(2)9CvaQpd2!!(69G}IOnBz@7#FSiO#c}x{GGz=djs2&PHnsl>#Wk3Y#gLPexrMCxgnBKB*j+edAqzZ{|Gxcw+m*-yZj#h+0~ymV!M z7AmCsZP#%T(9bs-ZWRR@>Ux)w%T>pyI0Mnzf1U~YE`v=i^dDY zy<5IqP}}!`%g^&#{H5csEB?;FA6=;m80QM?BalE({AEbF zn?TY=z@FlrTsb^h|>hwAMh*-!zpq|2qf%2O&6~oYf9^YKISh_G=UnK06ZSA#g}M`5%H75C5tI{&WX9)eiU;2R|%v z;D6YGpJLXBKl_#Jz`w}B&+kA$y!K87-e(t%a;t-!lO6CL2mDS4{8R^gm4kn7a%k^d z2RYX`$SHPc@5c`EZ*#!k3OVuox!1v-rycl99PAwDAZM9_oDL3lPIHidfrI>O9r&*V ze;16ntDc+#3ou@zOxHxwTi4CcW&P2N8}d(GSHDIvY!*3No|?nu6p`~DAn~Wjx`m1K zfqAMTR9JBS`7}2TGx8?oOwKDTDleK}ToEcN&zU^Fq^z_kCx329k&%}-e^FU!UPUOs zJd~GbVsTtAG@`hy0@W&thE6Ii4k<1%1+u4IIz4|e;R$E+N5tvrYxblig1!&};f(7~Id7<+B z;t&u4RvVZG!Vnl&T#yIv!(EFe<>ciI%nM8(o;Pj!+)2}i=1spKFK195TR6P}=CJ>` znRC$XM2{Z4I>ARwlL;qH<9Yu@xw`it_x@LL*cRqzcUZP|>pDkg=#}(W0^? zgd|=`uSNL?or&Ye=MBjiXiUtSG;Vy};Ecf;7pVIgGk_nOF=(hUe#VTk<0j<|${1p$ zP-43+|5Vw-m;`*%pXSieD|n(3j=1TMc!}0d?v-2&V|=*`mywBro=3CKU5+JNJL7I) zAbP%qUU^zEmV^n$pG~?49I8GEEIf7>O!FE~N}YF}xCTo&k5MP(P@mheEOZ-hNd03^ z%%N($7PGDs^*BoFKU&l1OOK0$*K0hYrEZ@?fY+KbWOCVO!IRJQ)!Tv>QzaC* z1yAc?eXX+KDF*bl)`F)svA)(@@YeZ#lLg;RGXrk1;At(cuZJvnT9@ltHpx%X(Zq= z3;t{i-jMYI#ePo`)DL!wgpf7Pkqg>;Lq1cz+lyp#K=3y++fw-#64JdUoiL{pV8WD zC_ar)lx%@trDaD%x za`~@Rrqpioart#BQ%X0baQPJ~Qz|zZTz-Mdl)_CdKLgS0DJoOyHZ^kj5h~Nxxv7E6 z_ffekmFu|t2P$`?@^&uYPGw5XrY&5)h01g!(6pY*H&K~Vv}qNWS5TQ!vuQDx%c)E$ z*))gC3#m-0*p$uXxm2bUZ1QvYDk@XzH4WtQG%BZ2*~jHes7$HWl)~k4RHhVbGPpdF z%4boz?0v%9J8atGN8*W|S!fnig~U8!A)iH_btL(7z^y|8jLO{7JCta7%X1r24v)C4M7V z|FVxk{klrO5&0(=kIq|9u^p`TUiL?y5nNLjapT-1!*00+)Sn)Z^5dI)@}kr=ycPB zF1foKAA@z_&srO1H(iG+O-t}GZ#{_!hOa*stPUKj=iuc#e*&njbi2==IA-=9lP_F( zG@RQ)gzDU*;S_b#63$K#-n=%v;r(j^M;t07@5nu}Hak(*sXCIPZAsqYPaHj?vI|!< zYO-B)6HaOFN05nAqeM0o#N^rr^x$q~1T!r%f&w{RuVMN>p}2^F?kxU2HK z-&}vJwH48G=I&>nhM&Irv9Go$aVyTk~lVJI?`ew zx@tc>u|F8Dk8DJ;@_kiZDwWqn%iybzR7!cDKRC5Ma0K#<=92nAgl}?o)6g2}g&qrr z_f+Rbssl%!p8*t7A^dUVF=S#eJo_NaugN_a48KPrFVQM$vIhoh0ziZN?~x%uR|O)j zs_P@|lkcfpU03<1s=yHxkGNDZTpu`0Q$_RQ`amO~(L6)x|1(<6`WveQho7fIC8fWA zjQ;FYi?V$fvy@peHar1zRiF_{8^wmZs{)5nJS@dE&4rV~d#Q2$A6i?p!i~)-QXVK} zr0O1VC_AtPqh&Kj3XNnhe-ML&PhJNi7=|nABmYFdVyGH8bL=eXwOrM23(#+CgW<|m z5D!=%`3F^^d+EE^qGeY7yp*Z$(Du4ub?z$ZgTk{=wI;B|g1Qc<`oJM_Y||!uR0j?P z3mUkd>bKtPGniQ)S&AuRY;P_h4*l5WQM=U41Z28tl@r}y@}gU zle#Lig;sa=ok8VI$1rE7b=|N>zeWaL}FWi%SI|3$oO%S18A2`Tu*vxG>sM@ea zx0_{i8=l5A$ZfE(jE%BvVHRn_7<4eTf#NILhS#`dx(ys-+Tgi9>7LkjTncnm;2_!o z#ncYiRv-BjF`Mnkq%mA5PpGb{Bd+^#-xM|sLxS$b?cNJ@j*dJ;ltrF!DO_=)Swt7YWq}e5_A#9BSh)~MC#btDpqNH>5Vu&7_NLb zoZFyBjB7A31kukJ1FBwuGVaiWB&ix!)JM)sGmKGzcPj_P<()0(bhhPi3ZS28ZsjR=5%NZ&a91jZ zpJVNn6V9#mqqS~-a=l&;Os_^C=`>H3 zH2<1dRhs*udrh5EeNJtzsd}|l^>D4a`CM8KkVrF~A+tWR#Hzan!#p^aP5s|l{ZkO zI`^=0^3N@(e-mhA^1UM-g?cP&0^{W}%)z)LVp_f^k=o}|{~eoB&SH%ZN{R8trZ(mfG>FT~$|745mtV|$MIsP{;69{8|c#MXn* zstacV$4t5#N3t-r+FfS$RfFooPFNA34==UjALW%oeWapCv=6(n*e68yr(dFL(i!!X zpc)88yQYJ+&kE`#pln^VoE8SeL*2ywVIE#4>rU#Vd3FjMF_w(go6)vNMf@Th@|$1Ba_3V=>|^ogT(K zk?`t%Sk>BCA2^P_F`6&N4bSBl;Koguez>7AzWE&7(9u!zX}F;?qvkHS;T=FCZs?R~ zeRbft-h+m(kAy1^W2v6FbTs;vR3$DWRr><1W1IWnb6oQ|_#EGS20k;JPr+xPxeGog zG0fl%0sk?U)g1F2K0WL+bi}q5U+js~Hh2JR?3qYa-^V zkG#n&m>r`t$RjulLXAdr2WqgO0<=SM)JJ+TSuN8}#XY7lo;`T7xPipkCX1suYtl1H z9d*m6KoAoL$7brIs=YzI%E2V>Lvtc%4q4DxZM;CkTKF%0UJmaM2aXdCL6V?yBBJc; zkDLz&Xb+lrV^@3{%aW?DKbCl7JA4|;(`vKfWHlVTbi^_oEQYn!xyPy}lhlZE&ihy! zAYq2v@hf=M5@-Qu3pHY7S2O}ymAqqGa707$M%oOX+}x{nv8ierR5j5#PVE*GcQJ6y z71RbS{1R*RJpQ{Lh5@CWweU+3(#=^Wn_e+2w6U!uwq7QiUMP%LY)M+$+hB{HRtzNX zA_~Lk;qc^x)wzw;lM#t#`!RW|_Q&E^(3&Z1X+KUF?d?x$K8IJWO(CR9?Lo8E!Dd;` zHq8V9dBKY(apc!Hx*R=K%_5$E&!(<8XgX#Y0u0s+Mh;;Pt4VUh+^DS?%GQo*70?P- zEA`(|xRMy{kwHpK5&VwR9uhYBuOnp!4x+u*++Z9VWiJL6j4C&?R!QUJS z!pFhzOFNMn!SJ)&0dO>dQ5U1^8ilNnWKtqluOT9hyO_(@9Kf)q*A$y@ua{}eB%{F| z4t+?kk918&Y9dK#KZ8Nr%5`^?>o`uYu_y`FtQkNCpx(SM0BbgKv1SdOdz)Q;O%su7 z2!}4Orcpq|)<-VHX$cKBT!Z9vW@b}t8H%evNM8L21whT3F{14lb8X~e&6ag(72N$!Z9)sQiqJ8<|-gIs1?pP-k|$h^ z%1AEOtjPw})b<$!V1}~$Wf+zXcE3dzogT6 z5|y%BNhuSd!<405tXVS$STnarvBVm}wed>_tW?=AL?yp`^f}wA#g0K;i(hUOuKmhL zF4nAB46Lc`O$dnNmoqV?+WkWH(4rR3!1~DPIEO@$v9KgZS;9I{e3pwFnK{NUNf;h2 zQXYg9>sH51jRa((-t8o>2_PVv+G8D}*Y|@tmwD&2k@6j99I3MTIZ7d@Hb3L>Sc=m* zF5??f#=gvmj1JsJZoP}G&%F)hRc314_ZhW+@~SqyQh^}iCBrJJdnvOiIZxo8`ePI4 zZ{S{{k5aPlh3xgF>O4X9@8>$XPoTWTOq<79=;SSJ+I%AdgxkD@>RzFAvz!-kZ)x*xqEA$^ zcSE-2ya0@G+I&AIW_z2l2wc-3ZN49mB1sO({rFREGwT@7Hf&_Jm^S}GrJk;Tf%4hg zRR0OCllwO0)tM>r0t=m7*QU+YINjkk*HPU9rJLo{_cF>QW8C8w@G7Cy6X>{XV@5%wP_ z2+VV>2PxC;#;$-@!REwN39Yi|HD{;40M|6bWF1K30}Q;x!a7E950KGVBKJ^IQw04m zwTm`1dz$Edd`0vN(QT2V2mY%`3qQDoNvXK7`N^xht9o1~R}wVc2za@AQ;A!@+5fs}boCQj@h z8_mY4?7lKqjZWrSQ8jyLyosjgPKyN2(NjnboiZsV&ZRpnOuNarZ-B70M(59W7==}9 zn)6ikI^xc;ROg&{nh+N$4i4PG7LJdp%I{(o=wRJoDhTSBu8&kv)~l`WNNT=NezTX> zg?g_=rx_!#9Y8?gG$Wi#Puy@{AF2N+dOooY&DQHXdLGBCn9n~(0^*=@&JE|Zp}j7& z6>Zka!`txQqj>rB)E5p!unj?8lNn0SndE~$ZK}=J)hw*v0%x5W)w9FdXh}3#hqgl8 zY2;&R=vzcqZt6zfC3Mx^5tdU+@()^FS*OR7e_F$6U#GV*3|5v-Z5@dY_pK z!RE13B1~%@t&cv_^igC&%)v?J*D(iKmH*HRJF5YlV`4RwH>X*Gq(Y^q+Dm6ckC<Amy3w-&RN=FNztQtab$Sj7-1qNmP6)bH z-Lq{s(S0>0>EZAKX?YQW3Ady|(^?Q9lI!31Gm_~rB@;1^7Uo--Ie9f5MAlwn`tc+P zHT_tpv~d$^IeYi1UHvH_X!o8i(ZWq-h3(l#^^pg$>99nI_@a^o$#7n|r*?*^`u0N> z)d6T|9xOgi#uK8u;(&ts z$Y2Wx%lNHIbk*0~UsZdT>0Fj`lVj-W7IZZo`~%iU?xadp$2zJFwojwaVE4VEitMF9 zz%&oh^gLbdE{g25+8w4_uKU2^mJDhlPC+bk-i91=A6j)Jm5&>~4mYfwe0Xi3an<#Q zXH=dGb{z23N2cQJjFT~^;q--DMhyw`dXkD2_Aqi zIEtQi;3f{S;wo67980}ol~tWWlEU=alDtE`_M@6dYN&Z4gjJ0*JLvx=XW>C@&scej zp*M`$&trbII_JC%N4xYERZRdBF)Pm@j8Mb8{-EQe{TL0v!6WD0#K9HnBeNAZWY$NX zM`le5ze?O$)s&BQguRw?o8~1h4n{F6+?0ja$kbDb-!Yv!973`a^#M4P)kj*92hy!m zxQ9s$>srcoBPQx2Ly1C9q11zL_0E;{KlfjK6qFS+Q!D zXbw`HFgXqC(2lKJ`bzt`Hz4+?FuEPmL) z!yrFr&@C5AB2PzRmEFrf(6}s&*F;5_u8i$B)AC>E%U88<sjwZV=|HhhQb%{~6 zSdGMQaVBjPwYTl<;$5VO*vKM&RZl_O%ReRrcfNT*UBTohUa|EI303Xct{kU*AyDP( zM>d_N=Md!-YYoAd8{PDVP$PZ-IJ_rNebU?jl7HSfY%#0!dyJu5$YX%NZZ0FCMPLM?^9YC&T-R*WKq?AR{c zl|-c{K5B^gnu|~$^#)8~F90V{wV;95e}V1IDP-%Zf1_yu^C>~~C`O)-!LtF&n|_wD z8Wip46X)-rlvUv8{LLnbabxaDFxmpk>?GVh_lATMjxemDKJpfLZ2~m~+Wky(!z+x+vinNS;cUuh|zg&ROd{k)3VZ$m?f1IgU1kL_%p*-wTZ%4MkfnD zjhAgI6evq{ymJ)5lQB7h4q^ww+{x%`S`khruK~}k83h?J3K0aAAQEHDusX)d2#2Y6 zCCJa0SSe()MFe@RK63L9)Dv*=*@XOe(0_P$Nm?-!K$&AQw!Dez=-CP z+52Htqr^a0IvWaOWyPy2@~WDnQ(2oi*H%%nru(Z%c7s{*w2CE#-xov1Qm4u0Pf_Y4 zk76?v46C(6_2NWEqt`eB>mzR~i?DzTL=+8XF5@Z`NU)N}SwL9Gjr{`=nWCdj5iL`n ziZ-AVl@VO;QkAB_QtYQF5$GH>eqiXbG|Z)RhqF_f)=^`_dm_Ucs2QkPA9;gsah^vI zFUlH~^jbAsULTpm51!*l;=~$=#y0oVytn^E5}|2w1Sm*mGhZaE?w;z&8eN0&EHd{k zQplV4xHH#KGY-u4qKpTJFmpx6gVbNn*o3$l`!AXRIf3yOi9KT%Ml<%|x7koLW6jCk zl8?t6(&Hu5R5ZdDF9{CtJ9XqZYZ5%d_1G`JkOj|EE81p3i3-IwSumT`nOSf>vtic$ zgkIXmtE0ar3Fws_=Omb}G;a;Czl+kY=%a+X~_o*a2cR1wM|O0)LO60*fgH^4{Rc8e!S>T1U_q zI0)jcN#~lBUo~fuBkaqvxG6z$bxKeM#7tsWMpNR>18g{@M9jJ{W{z>ni9x3EW@7Wo zA!c5&FzK0tW+%1f#E2K8iH01kw6Ma7PMa^2wb50dq#s5|%zMPm!zpf&Jg>A_PsW*5 zuQlaSheX}3s3(#TicuDKg^BsyDGZb3FMw-j8VO zPAt~nG7xt5jc-)!#8r{}M{!S_i*(lgB_R!n|>lIMzA`~GU zRrt(6__9+R7P?i}w-}*QloVbdWBtpknv=PCJTCw8*n~>5(r&xT{)+eQF#~*C=lr`Z zldOY|sEGX4Zu7-kf4KOiOZXyY{qZO(jah#nVq>2=y+P`u&t?X*p!b7)$gd4JBjPX6 zgy^+4&QkYYjzJFmcFaqo1{eSRFA7?Wn)Kph^v%X~+&&}d0u!&}nfY~M9ut!OY%#93jIleu?K0}Fy;a?1-GYpQ$4Qf2i$kmxG2H+&b7u7rxo z4XBBnuaD%Cayb-7QH>Hrrcr|5P@X{?>V@)O=;}Oh>b%j}C4Ie+gwTCGS$cvLiMy62 ztNz<4PqWr>%G^_}OmXAu2wtI715yjyuY63;Gi>t_+!Y&Nbe?93ufI~Wu{m>!ulq3L zLj(8!1I%m2*Iis}6JP!KnAaX(3yC=bl10CUiEI~1_B|Z6k>V4hb$w);$)~=<yB;5>BICu1pym7P9GrVm^|{4Au)N>8JPcd9({}S zjmaZgSUaXi7t;$E#_J<)D#oVAPc$6-s`U7YUM@!x=&@Q>0p>aP*JAt(U>@EP5laI+Y_Wyl*!xt0GPG_7HxK0N)%-jn`($ z_6gko^^rnTiT`0jLne6m@6(Bh7!}v71>TCEAXd735dUq^(z6 z;)_qB^{s1KdkbL(zEAd|r3I$0=2KxbdteJc0<4cbK(H!sEQJZ=68>VsL1m})`6g1= zoE`U*iVb+@5YHvEs*4)3!k_P^1#+Yty*h*`V9f`ibF;!<(pNUu(OYJx5~KQpv>Pm0 zVNQX+>;iZ65o65SMC=?XcBV$#-u4)aTXZIITKe=bJRp6F!yCLm1!bo9|>ZH(6c#Xi07c}ojSUC}d2bl_aF-GVT*_AFqXKrg{V$C!xyxWsX5)AyQNE^^LYu{a6D6fXAML_f{|BD8ICpRb_Sp%euqrkRvndK|K57$%Yj?*+;YzSb6khtmFGk@O@$B{1R@n27 zqi{8GTB7i3^chEkZF7$A3rBm?z7~j;9H!?Yvi;+jV*d;U++XqGtH1~#wbM8#Qz{?D;jvXV zhOUG7Sai&VE%GrV`CiP?mG!77lTyq81}A%YX<)`MnQQ6SokP@x7dT{oiOsIInf11H zs-bW*2eF{J2#Nl*f;H>V6ns4aOln!)K*gT4Qs7MyCt)`fqs#IOiKu_GAl~%%TWdIw z;Rq|oY)XSPvxmrVj(ak~{gaL=ee?_4csGH=L^>P^M4E>q(AeT@O^eZ^SV_PHIY+pO zD8h9Hn;wXy*xpF^5Z*(7Jw+Xjw*zt9cn6Kuc&7G%Bz^dG+Ur+{kW37k)Zr^*b~hU~Si0)#AcJ zk6sz7qc*jCOeWFDh}!se1+QB8sD##N;Iw~tZoX!HpH>-sjv4Eh zbsBA+2wM-6L`3v}5okXjFoJ~*oEmH34t|lF4ZL0%z+7YLoji3U&g}>jZ4|z(&OaQp zx=tx#)^RL>TFgZc7hz{5%@(Nq5As6=)ej>I7*!t`qq(Rx_6NuLMC5kj9$=u(5n*x6&R zHpjP^%s=|0J@b)>)^$9xl)exgq5hx!19c4@8*)mHA@yo7reT>jbEEKud)^=%pgJnQ zui1`TD!+{<>9#(ymQbw&xd-%< zK$eO|SVr2I>6Q1_u$klGP;|9sUBk=lzcwjd_>M*S%=YUs0*yn%qUVbGy-I3O5Y`~} zI6CWa!o8hCu9}7k*8c*1r!$ODm1Bi1JpAE79W9ReO*+)VcMAzk(K(!EpEvPnN1}5s zMIRWxAQZ_U(e%2A+How$DMe(;Hqhezx&SGOKHH^*D@4ftUr(xyrtz`@f6jc@0i^oK zLsYCbpQrvvi>%nE13vCkO2^n|$xq9A%*+R3M3$Iqfkv`M{M5trzm9e@KfuM7oI>_< zw1ZS1N#y2G;&ZfjqhicC6sbcP;HgCzeu%##p$$cB*sEC8lXa@uz2cp}AYRo0!a+Jf z;H}$V=_Mc-W;sB36N8HN0O4h@$kuJW>aA4Ek9A4-n#<-l*>iCX1M5Kcx8pjNXLDK@ zV;veg3(mu9ar$kfn8%x^Jjx+uAtSt84Q6+xaCgbT7KBNP5?w}GdkEctZTEll%*Gw| z9ma7>hkcG>bhhfE0!jV!6^&2!;ek8(4C0E8aGj}$ud!^XLsv)Nqln$bpwH_gBk;bv z`BZ?H0SE(L)yyUed4>0V*@>3!N32-JI36bvpn5!!wG3a4YWo$&RXJ4 zkMxZ_n`8{rHsKPyk*IJPflR(%qiVH%Lxa}IsM5B@7a|8vU{{Pj=}Y+9GPz*3_!Y@} z)q@hnW^TtzUfG6Y+k=r`$B8+AtKY7TM#n)loPA895wgNto|9h z{ePx#=CFB*YFHzKew!naR>I+zj{S^pQk}X&e`T=e11R=1i`}R=+$<(g@iMdc9aPk> z>4%h{D_Fy~v`nDi&5tZ4=6sWx>@mMYcO7Wp_fa+E!lA9Lt@{FBVL@a5f`gX^?dmmT z9%Z=xjSEhyWE!G14V5+yWc4)$i{rp9rI%22CG5tqL1>!IYkv`mw%12K$25T7(o^56 zjS2+CcpBCgn#Om6@ut1fzV_6hN|PmmHkd}G!YFPWev3dxg0)sUjGhdFUf#dEkHixz z#)ViuV6tcj8)IENJVchCt4Urn9<6Rp)(qf3nMUCl{`c@)NPZ-(^1WEnr`y>DCK9fu zpC({GKZui9lK_+HyP8%fcc3?X`XQBPRJSA}p$p+)f;LmO`~uSJy|5y&1)6={KMvmS@cdReG7+`J25I z?fShwn#pEh2zw}49l#&8c)PTC{PXyMNMxfCc^LIj{T0ZH^d}ko6Qtn7HJ5v3e~tH~!hs|B(kGUZ=2t(p(1m>XL0{Zz5H$xVI$1e+Rby{@mgK4flS~T-R8B%K zDKqOM{STnY{n-tQHx<14TbyiQCvcb!s3UJw?VX`puf~%(X#b|#WoGpDy$@XU^;mYt z7O`_EPBqn_vygpCyI`=uvG`%qk0ZZ*i1hIA!}C!Y_9+N6+RTMcuia@1fAdc)oOy11 z0{8T5735{|W)^LO!dCA*uEMGgIfAt`Mz!k7O=EXzewr+_8T7>!6{-{H^oPDV42g-V zKHOR#IbP4ImC^MP7irgRsE^cQd5Jt?gOh6;O@q^v!MfJBSmf8HT&Ks#pSP$cko+yL z!}n8YiiSUOL7-omm0zi3W3Gb%x^vi~g%-pX5-}Sh%--rs{ZO@cj`bHue{*CL`$~S) zIJ|Kgk8?GP0W!mDN&u=}qEGJ)rw6My5*lq>E1pS(zNU~G5>&_f+H2Uc4X!B|U4O<9QX4>DJO5W2i}foWR}t5FT(K4#^=pd~T(A{s0u5L#bl z^R%7>?9po1no@^DYV}6)o3eKPJs__GnXEXCRhlMl#PGqt)o9lK0o-b5^ETC^d4TGD zf&$d9hbxs@HtGnXQ-3uaU${4adsoKJHxHqb{`PmH*`E5y3iMMIcd(0unmLoobGJ2T zR&Y}TYpXdBROToPsw-EG4fC4&ajZBYhNJNCUa=E4AEJoF($4IHi>MJ8Krd7{j^n4P z0&o)BEaYC`bZoDu*53|EW++c&7a|USvzOx6@;Z3@A8X(BG!_lx?$%#|rlR^1^wq$r zHFT~0OVBYV^z`##ZT1JpXt+{uN8&qm4d%j9-w9g{{0u5cYv70I z;yu3Ab!7Fr&Dv@zDyts?&dKU;_spZq{4W-Q;gWRhS68NEv)BK@;XWg)=AvZ;!iDLL zSs+HT!l87SJ1ZUkJHwF?S$%#Q8~%Ax_`BfCKY1pF-;K=tBO0;hU!k-?AJG4gfNczp zATz`N9^2ae<6zYuSMb8-@-Kqbv(giT)g|dES=EKnUG;sjq0!;?Q#6 z;^Lx$BHz5S@}>FZg&C;$tN2Tb=7orvuB^a>9Any~iNPFW!WEfD$BrGdOY)Z&mHTG+ z@ZVxpoDGBpIW>wL<-;}BH_kWSm+1@mCio`$g2pJH;WJhmGmNQ5p0To{5vnXN9qBXh z)^$Agj>gIv#>%P2$~>qLR%MkjD&5a_nF1#Zyj)$~uE<$XTrnBJkX=?$QH=lY zuWgV>biito=v!V^S?(h*!;;dn&;l_QZ7DNyr({kwGAB*X&Ki5=w7~eO(=v_nqJlDL z@{!f}zf%AED=;O~Cn9}HrjrcgvfMy!z&G{sz_bZjQ?EE1`f^KQa%re|UU5;OZ&CiT ze!fMO6(Qf;B41H4JVoJIR_>dMrYtEc2q8sA=1tB+7nI}|6!CvEn3rFL zr%n!ZGzMk(D8haD^YLG{LFCv;V>%jxZODAzg33ktrJw{#@!u-?3KoAF%QQoB>z}xE*jcU|$TwTLHHM?ge}t@GxLA zU;-J5IUx(*B-?=*Ed)3hi>|GJr(wN$fFM?XL-9?|_psWY1^CHU$OY_(t>#w1d$4Uj z0Jsnf@1uZ+0K4Ot(gr@<+L{AsV8gZ&@M@e3YzEB4if0#K$#bv+aNW+<)+GFzTo$%D zLjgy;2t9xY09OKDz6)~u8pa)f-Oo3ShXB)I_X~jJj5(X9|0@`{1R{-VDDF2Tektu1v~(_ z4)6%zQ-DeM?Z;d8z&^lDfH{C3EO0`A{Qx%rjs$!LFbD8mz*4}YfCm86@SB=`timz@ z7Xuao-UqlEa68~u!2bc<3)m4$*TaD6fC>2h(^-J&fR|wBk_A`@SORzh;5xu>0G|Og zu+w`Nun!>pqVZh7?)X{RtT*5MA zUcjz^38y3e0n-8V0W$#?0~P|_0=OFREx@gSEr16A)82<(z^eh1@Lv;D0rmrY1~3bd zer2cx@F?Iqz@GuP0s1~beZX0OM*!afOvC@t(gK(XNWbb-2zUkHYQVLCTLB*j+zYrL z@G#(C0Ta%Ie86I0So&I0@za3x^UC#Vm28sIL#48TKxGXakS(ho4Eonshp0%ijK6R;4l`={_5Ug8SqoUU4TCU9s1$a>t>H}s29tR8ork{)YfSG{%01E-H{sM6ZSOvHZ z@O8igfZqZh0ZeO#-REI^0qh5O2VfT9p8!h$laD|zU_ZcJfFl790p16A9B>z4T5tI0 zU(gFU1+WnCcEHtuTL8BL?gHEkIN(d@1VxqZupi()z#PD%fFVHlR~SzK(*U0V zoC5eRApO?{M*)`ucJFH#^j{(j1>6ak1Nb>$2=L#48vyfKP#X4D4ru%b#Fo=m{*-?X-3`osV4)H&s5cV_3*Nu9Y!G79mxcYSLsx<%;YPii+8 ziclo_YWy7l9nFZ+=SAsTfj$WO5G%bjO5Y3o5zw!&(%sXTf#e^?U;6J_TbIYsLnb`| z?Y-dy^mNbWQ3HmFbUu2~(i_!~0{}^;kchUA`N9n6UU-?vPE2i-%eR7n( z74%Zjv8;*GCq?OdL7xSB)c^4BrBV7}(COqK%Zq6JtSCJJ{d@5V^iwt0itH?okoF$> zFWWuVI7tUR1@%_|CcOKQU&R1y2vm98i=%o6nrE% z!GrmELu>1ExR0^@F_Vq?lAw3O##TBxG7_$^$YuTRZ;6}YEeG=c`ebV>rmd*FE0rvw zhd^%tJ!qx7$1?-jL;u~tN6@p2+Ifvd5B%wQidw1c-UT`3ceS>50-x1xk4y28c#ePY zUB0QcwKpL+KhZY@${uci0>)#|@36}WN97P-68!o4?=c>cT^nt7y`p%z{g7As$JW+s zt@_+0tdQFedL8J~W9U;%`UcRCZFlz12H5c~>c5Tp2@l8G;eJ)Mi}W0VoRypLKQUU{ z<(a{T5}p35lNau8ZKWR+HvQshWO_Q$p=Z^-7`Kr43HvO1g6N0SI1&r zBfqSD#Ba)?{yJIth4`|-x9k!1SSaC-v3%}lmEFWg@saW<4n#@bXh@)2>6H2On!~y~RqWoLr@J5t{PlF!VJ%(c1bI?h_7L^hv(B|0l{%_H|Fd zz6kv@p7_7B@ZS*SBmd57hkOMemaS3yaupBJSAzZk=uYF>X3#f)evP%hTTKj9e;4SD zpgWBxhd}=Vbf2~U%&7k3Lhoy(7e(px4d0`vAJ2aB1HIAwCFtyjADsPA2ss^)?@sMp z4LZfUQ#-eUo{9QSc5HKZIJW*GtPPrfZpOj zr+zsAJzs#%{+{(}j(JybMgYM*y9MJoN?$q9#4p>Kk{spzSFxC#4 zez@N@Lrx;j+noHm3v{;wo!Yw#dXDeF&wAoMVO^{q_jS?uNl3!D069+akq&wg^gh=9 zv-Usemw_HH?tR0)48rzWWjuKr;7&UJd$aD;@J( zIXH-Z81x50pJ1b}6nX;A5#I#eslO87=g&bui`J8yV*Tjpq1KY5Ckt{ueBRklC7^!} zx|5&Qfqn#ZgmKhQmVL%H(BA_+Xr;@#k@Oz`{b$f;#L%akemVmBuotjjw9?C%%<)F& zxtD-Wvf}kqKhP(D-rq`>^*Og6^y#2GwXX#98K67ulh%P=3A$51YyQER@}I^TIv@WH=)dI867W3; zJ|};!1AQClPX62m`s<)O`SSqidqH>d=Mm89d4rRFI=BDu1oVEOe*!wfE1DmceRvk= z4WP%fkNi{uI@w=gt*`cu^L6Brzv=lvkC)>22g#x51{t9LQokM|drlzdIOz2KvtR1B zbR0}{u8rUSWN#+ush~Ugr4aOXp!c-4dvl9P6F`sWce3v= z=s%;KnO6N6H&(y|^5jntE^9iB%(Ux;6dfr06%`nbN zzdqVddJc05=uYuR&u6BBKFC_%vX0vZ`kWKgKLGkX(4G8nMCv=uFG<~%eNO$<5A-a^ zA8oa7scK(8;QGPO3qUW&eZpRgAN4*`)(ljg{5}i(kAR=_B{W$0ZGNZcPFum})+eLv{&{7P}R74*ZP zkHozhcb0wIUeJFA-RZpPFzClYcgoKMJV*Nibf@;EgHHP6`H%WN9sd0ubnf?eE&b@w z?>XQfv0M7R(ZX-*_s!5d7<^gQcDpBXz>!~efqpgUPVG7bdKT#M?56t1L7xq})4DJX z&j(k7?$ocNK`#Z}$#1hjUjRCq8|}BL(eYp<=(9k_> z$M%Ds4Z4&4$3Y)?g8KAav^VHZ?W56 z-N`?PKu>^tr@S~0x*K#S|D-|j5y*G)?`Y892i?g(vp|0r^fRpeJHyidp#S9r@;8HC z2YRWszPmUY|Dbn<{Wr$YX;xG7)gjOqf$n7AanLC~o!Xa%ikE}#)IXy^zXWtA|IY&b z3J3i({;vf6GSFvO?N{p|c{-umu@!v3agalKLeIyqJAoba+ynP+c+pYFah|;q_{|0j6(MeAU=pTWehVxc)9KZBdPffx)Z&f=_ zk_V!wJsZIH*H_~A8_C&#ememA9k@?0w)st2WN$cX&mqVezQ?(LkAvO|bhsyKkL7$e z4aS^x0{UpsPX*m+e4Pb)U(lV#*Oj1WgWlV!U!F^VWNgOA4A6a6y5;i$vI08AZgU@N5 zl!SruZP1<($O66f1oRTn6Y+kNll*m{XMpY$PuoBr1A4svqIC$puhJj% zQu4zHiy!nlM9!i?X1^bYylcP@w?zGF8K2Ye-pB$6ecb<`Uk>^LYkjv0V4}|g{T|Tc zE4VlIiDjt(?M?my~0Y5vv17;-zeyDimwvT>Af~5f2;$2BWHTBDkMfGz)FF1kx5a_c(cd~B- z=$D>A|1+S^0^PCwpp$=`>^lnjOwgU;wmUW|_k-?~7ehhc0=kp^IiO$lJLhwp5a>%m z$F?NuKg;_N8$d6AEB^Zs6ptHxINyW*9NZ^lZu6UcpkgvekxzWPz(;=i$ql|73m-kd zZBgg8#CI5cgZG0E_X+DPd^CRYQ+>5xO@iMNUu$iB!Ueu<7CzSNxu2d?ki4PbTmL$q zPm|scEPSN*mFRi#%5yNsz3Du^Z3g`m&@X~avyGPbN_K%h6!dt0L)oy7wMmckHx@;346(H?wi}q>+G*;uNFKe zC+3V+R}%dY)f8{8Q3{CifRh2w_2OsthIxN>8&`Ro+(xmpMD$Cp^P!{8 z<*i93+kWV5Jnr`HOg18J@784FUXShT^)HufcWA5Ae zhWx4jQl@xcb{W+!?`tk&hYO1z&=QAvFEXYnD-!+Q>2NkjSgWU(>$IMT@|#@4|K)~S zBokbW7YRLq_uU3ESzRPTS2OGU#x=az?fQ)Bd`@-l@dOUq>Rje6G?tTEt>;$P@H;%N zZ(LLGtb!W$jwi6n6QhUCo#>rn%%ys&S&1=a&#A8DLhsEk*Kerxn_V3%OaZN)9@at5{#SOr{n%9w|AA-c+-6&?pr+r{*3zs?*^~2ORUgdWY3zth#ob2$J)ENPwsM_ z(HAZM|9@ro@UxP;PEl~o2n91M75q`)K;dI%eCWWm!;!Riw9qqc<$Nh8DK?|7i=XdK zlJd4Cs*EipU)vv>!w^}-7wfyg04gbu zF;SJ<5fN8V=zQja^54Z?-ZP_&{^yJ5G`S}rY)5ReOBG-zsHoM~jqqCMo$+{r@|NNPpNBeJ=g{y}))|m0c$b zJXhc_ffEE?E^wZ}B?502c&ESz1nv;HPvCn3KNtADz;@k4zrb?^4ih**;N=4630xxZ zW`TDKd_dq1f%^o$C-8HD-wSNlUGxh)SKuEir^aGpTBUnh@i!Tzyu6a)xdnLz6_t7Oic5=);#eF|Az%!n0)JvYYGS!3=Kn!pM#g}O z`g z%qQjj2WJc#lrdxgY%nHH$@Pt$?i-vjcu2+|!?o(Std?><(RBkpU9aJTuFaxX!+hY} zuEhBS-0epZNNAryAhCTPrnRG{x!stKF~}r%i%UbGc`H#$NNn$RwOfokFYQQOr>>#T z4xT!3dAlo6Hu|C6ZhRToH04#o;?h0yu&}QMP9%FeP^I_AFox|&P@282AAobMcInDp zrLuczVmsHfL|f?c2~GqCLfzi}QGBT4pK+J?DHT^V z;j;t&jE=>I>$;)1`G87Br^G}2`3XM72}wjfDH%e^#?D5vi|$iMT?#4T4^$*-mj-;e zMtw=2t}YP*7pa2b>SCm{>*DI_@+6*~*ej8KaTYjNug={%c{-oonJ6ikEZpfvr%o3G zgOeXElH70fYWl<-a)l6X?$n|CzW0I7>^ODE} zKZ(q6*^upAP|@CN%Ao%wAu(zRT-nK$3tUIw5|wqt(kU5jA?uQqktexale&?p&S%5o z-MP zGhCjOjEm2{I4j-L*;lz_*-Rw8%XJR8+{PIs)2_gvRL>|NImYey!(I%ZZP+-Ik+n#0 z42+WN{VOoS^e>@da{xxo0mY>SC6$Fm*ld=}>mQYi!KkokUd95o=IP+pvG1vJxlZ$3 z{f(!~J)W}nJY5n)p0d%NF7rHPmv}mlp7~h)?e24630bDT$AUQ;t7&|T1^e*z7Ch0l zP`z%T{V82KnZl~rW}Et}ho}A9D;uS@xV!;=c7FuQS z3_x6YA(FquND*iG1-gx;iTeKcg7X+l>*O{Hbj4gjVPmXsZ!=L>NBPxV+gdrg)-7f& zN|KnXZLQ06tu?~vGG@h8K|v#~Gg+qFS@hDlw-B_{B~qRwkmgak{QQYW4FcPMjEd!p zLiuxzjEYdXf(!H=f}p5;v5|q_GbqX!J8n|{Q2u-=O|P6DklXpCl^Js@i%Sao7Z(~C zRKge67Z@3Z%S$0z!BDxPEGa6dbxKSj547^4l6@)i`Lt}a1nK|x;8vVx+;p**ytq)5q7;ihEh`-KIl2z~jBiVIM$ z3@Y%E!FrXBxfK;gMge|=0AH{NYth`w`KXK^5hwy)6&F{|g@98k%4LHjBiiuAZM!tF;1?>`7a@2ePz4;i*}(V(H3 z_Aa`9j@yqC&X@(^<5KiP@5?l15N@pXLvBBl=x3bh()%4%!lbBg1dax@)?erLGljmZ zMVB5&RjF-#${w2Hwf)=Oew46{6T}>8FzKKRlQCb~j;Sc&tB+;6zTRJ^2*U{Bx7Qc6 zaV2hOZ>j6+{bx|><4lk*(o3dj{n{`2z+Ah&qcH0ID_Hol_g^uvw0G3?^?q?D zP3*YlDq!wgHJ^qwsL)I z*&1x`zo$jNuD|U%KkM2i6Vz5)1)DhIWn2C1)vA8>Y8GRxPFGNW+Qb=efI#in`swSP zbiMl!17n3vp{;0q2sY|ticPxodDHgCRJpeT=BHhM6DY~})AjXv)Iq6l=eL)?LtV08 z*Kd4m4oZg6_$%xG2wsX^U0<7E68l zwP@?*vleilCi(~3@VfqGHoR_*hP|Y|jSb(QRhT(8g1tRM9qJE!N>!wdyY}`q>WkUw%eu7-FknD;ifj)Ia*Hs(+@ff~{yQbf};DoT@)VH&mdGAB|or z_1pBH)bC+asEZojB=xmC4cF{ccRy={KwVFxYaHrVJ+C;jHKRlQF2L*9wX(h=_3=b5 z=CTzz_iSCv{4KAlYK!|R*av_%0@{Ci{_6l-JpFUNQT0yAQc!=|^=o`QNRO39xczNN z9*ovGaq%7_6c?Xhtc#2HVx8tU?3V{4qF#qtX&$U%^!h3mpJ?cHQ!KuNq1QvP_>P8N z=fvVW8G8K^i%&B2x+E5VlKK227T?*>>xfuk} zo1y35SbTTPr+zDn?>$BjbH20^J;urAbD3EDDVW#hSW$fM!75+RTUMgSI2H3yJbr9( zx5vYuZs_?VR!*9s=Y?229VxZFJO*C8igS64v*KVWe|!%3vmNj~9q{Kk;BAW_;qn;0 z9Qe;|gQvVrFurbWLvX;;I1!J(8}M$dc=Q3bmZvOFF?KESYZOB#IT@hFlYb%bE~9On zOaPwr)^+#eE_%(xE#X^i_)@{!pIfd5-i5bHwm&@wcWUiI@D9Fj8@De2PxAG1QsSj+ zAO2i%;{P+?(c7ysySv?FfFo@Z?KoC-YYz3LP{YT`Wx{=|RkAb9<}wuj*7 z0e>RB1DE=l6Ks5Gy*nNBx<~k#PwQPQdiC>Rtyj%|I5S_N`1Sl!`wRA@3cuYR`Yl|# zG+z6meWjoA+8(@G!T!J^FdM zwugSZCSJcd#eXvRT}C&f!8YEW!T7d$LAJ${--r3zj+0}6$G6qmjL+GE*ZUvhqN{-A zv>l&IfcF_~$J?dAcR@Vs@s@tSnXVe(dm^6ixZ2O<{``sW^#I>h?yZ3S7arojVTPa4 zJ%vcWQ4){8Ncfk`Q~b2vp=+%J|GmQR5&44@yFverE$RJRrk^n*1iug)N5bEJjl$Eq zjjrDb{*f#{m-TrW{ZDtqzh$AqcV?<#oa0sa7w0Ryo`G%_{1TBfRQPub{zs9c^?n9? zJU<*4{@x>%d>VJ?I=h|HyG`1q{WD4Mo#*?RPx~PZd_4L0F+RD?^NOcL&WMYZoL(#q z5B>yiT&3{3AAc4(hleRVjlXpD#z77FEp?Qi%j5YIvI`F8#4u;eTtIPQ3z!s=gtuduYFi0 z`0K@f?f<_C-mdp&!52!qbiM>TC_4vSuH@_X{!#FUFH?9OKko>>-%N!+)lkL!GAPG;dMUVE%=erk9|eXUj;vHmg3j``H$dJ zr^U)i?WXj;E^(sm?+ZMtw7KYY2C{ROv}=%XEEoJmHu>KOe)L6t=G5}Lc2{y5W!&g5 zayAJ5G-;Pl@Xrc<{$+l~Xg_=<_@6|t_U9@r6v{20&AQ+WQ(JJ9NdKWBu(Yh7;(K6SFf>vnll$)03mM7hGhE#uy~z>}Y!l6GnT zTq*c31%E1Z(sjMyXURA=RH2P$1>YcfG(zwLP%+-Tb`j%+$pTgZPxh=3Kj?MQ!-DU5 zm7lq@qz-*omiXJ-#*Hh`5W=51Tk+p0{7(Z9J#~!7_?D*RJjc=u<8Kc9^qoc0+a&82 z3?qCc!hwWeAby)6_>qDSjqo!jMevsj{;7!ykLi!EHGqV_E#hY#Keqtyle$*075J1m`@|y|l!f4IQU67)EKhv3V_4_eL}f}bz^8lQ2tl7Dc% zlB4lg3BJ5Y;qNlkwMX!`*yJAup2mS$CoBHt!vBNtr^&dX?K}gCPwmPaqxkhYXOiIW zo~`h@e^&~A|2&1CAoA}Kd{5~w-7n7pA1}_|68?)N9&~$8JxAGdPo9#`-vx(`iv|B} zmcr}!nI-r~E?0Pn&PV#L7PWWDD8;Y!&Jlc;*stf=<$~{gvEuKm#2dc{ zK3=vJq@AnINwz#ShZ$2`ihl_3q}QI0R|$TF_y_6C*8;(RF7cz|n2L%7VjKg|dqTi^G7tiCsK=`w-R`T_{zfJJv3l(0= z`B3oo^-nYK)Q?+xD1NwwuO9{9AowAI@0g+Zx1Hi=4E+W6wO1SW3s=bs9doS?{` z13cNY!>924Tjijw5dL>BQh1$Te-ivh5^tC$_&TEH+w$w2!Aicp--iHC_Snx$a|AzN zp3 zpE-5@&I6wMcVC*qw~CyVjF*B1Y!Es2^}yc*Z$D@FPVn~g$#aIqZ`Uy3sb4OaxEe3I zFBg2JZC>~b%R!tB@iV7S#)pXTZ<(R+dOl4XuH@U#!Nv>zXUShZ4lEUXrxGRS4Ax>8 z{}8-S@&(f?UkM|WeET_4K=AhShf=|B&h>MBJsz$G-p82Ok2{3le*X57;CqXmI^MiU zOzPid!~HDi77=$k@Z{$&CH{3hUn=~!O1|rM6$<}>nM#h9f3M)}&m-ytUs9>~eWJG! zcpCTiKRrh<3Va59yg2uaRCeAk{gQC9!e1fyk-(EZ z@6S|to!8e0zE>uY~L2t4)6B|R0M{?84%UJ-u#bE0O!AMyK{57R4OUB)QA z2gmritn+2E;5*CwlBU>=4T9f3OYxTq{?EWuUet9{ctIQg68>Q}`MtqLezu>7X9FKE zze?CmU-Q;|A9g;-6PhB)_dI!3{3@?H9TZ`IS90rr-t_hAF<1$140# zi8np}t_7atZ0qG`KK?&MaCeXJ+vkN^!S@w^_TgH1&sgxcUa91i3;x`3O7EP@6<+Jz zBKXzf|1*T&g$aoK*-OSB-H#=}$Mfe6z|*;qeO)&Wbo};M_GR;bsq_5i@5s1rYv+;2zq9j`xs3l(fB30hZ`axX|Gi!x*WG@Oaazy5 z((U*4hX2y>UyNSy$Xgx%ZkFEH5yokrIIr^0I{xRnuiw&n{$0oa?4!(Ydi}e2P>OCH zjMMzTp?22jQ|S0#zLt4Re*Q|w|ND>X$dn$KyQz zPj&p)Z)N^J+>w9(sN+BUV;TQ99sfTakK@PA_vN`iQ~F?e{O>0iC;f`!ufNsnV_f=A z9p6#AWBU8sJ()kQ7yN~e|AXR^(eqz*JkA6BQpf*A^$})>|8?J`>3PcIz!~)`jPKv) z@n+xYCB}*G*Zo&KukrnFbo}p>&bH3~(eXI${=N4y&(Hs)KF^mr{)->V_|Nz$_}-?D z|3M++-_!B`(DA>%k#Sp(o%f}qe{|#zM}J4d$;91F=QBMo>XyZDBCiD)Em!609-kkl zGpFxP`|iA#51iY%DVD|ExWw5-x0<>U&a>i-USi0(o4LE2%&#%w4Zd<*@>h*<=5H}6 zR`@RPVQ0UKnG+ZB^Ys`j&Ic}^cjP?c&HZ%xj9Y@g>L*+2(kuF^_-CWVV#j^VSLfXm z{@U;3xGdagj&CL}??*VHOFtdsTZf~pm`bp$d|c~AJ4m3!rkfTOK}Pv#a?8Yr@+;50!fI2OP4Ug>@OZX!Z~Lz=GKViEgRR12{cm0P zhqrI@Y~Tj3-<)T31rf{hg^m#i19INjo&DhQ^+oS=hmLugOo7;Yqw(z3tIyASZ%)7Z z%Hbs&V8La+qOIP~Xcne;aRVMLo_pul-7M?w*>5tKuey8m0eLru=nWxIy{juBdzK%# zEE{y(z~#p-Kf+S+NSYh8ojqd%4>x7m9u8kaLTKydX*YX_SAs?F z+NMK-INaad{Q*&<%<^4FlgsuGT)yx6c-{a*LgVhC-;Y}@hvQY*!|!@?cH)(ymv>yR z{~rIFW!c$aH0fgEN@s2t?sm~}*E?&9OTpw3|Oecv-+mAReGuyCPTk3+!DZsiu`Rx!ia8UR^HB#d$(` zqF2)}NZ6`H8HxEMq6gQoLNgH}kR^T5@pSm)=4t&V~!Tz+nZU_4nn>Gt8SS zhit-#HD?6zw5*{icLq&{6n2Gtgj$4Qj-hG@DC=YaMKb6mv<5N@dWe3uJc#gt2@O$k zQ__g-e|T$omPKcl%0VyEzv zR=vSe*w#Jaad&0P7(@gUf_Wm+n~n(N7=onrNlBDJ-*fCxaIi-}#V~ME%;+T^ZhYJO zs$5=TE!{(+#1p>^=2J0Q6w4maAv<^&PVS3rn(Z?>^u@m-AgPP1ZO?3&|8)$HUrY?E zD|{b7f5QvIe8&k_ut{@M%M1t_>JoFayI+If-520*T@6IKgV2avmkZ^`5ruqC`O9e&47K?B`833k;DR9?l`&6mv75A~YKnW$C?A zy#3}bL*yp+csC$}QM`H&`#>>>_`t%LZf9J6jyKtS!0UMguEJ2EJFo zUXh(=iy7{p#Y|z`5yjjJcbJ8nuMAd`j6V#?8t_Dj3b~5mX>V(IItE+$g+}1e(+~*_ z4gz1jLg0y)EIGV(kl6k{FZabUO!&#i<9W&6)_xD6DOtqCMeC`&g&CFDvNBDiZ{%62 zR3^!02CW{py<=%cwDHZuwhAXARc?g|a>g?c69fs#m3xLq8}7sM$fomE@#EeI_jl<< zX%?%FGAQ~e%dWA-^tg_+gce5**gOF4GeD?UZVJIv@E_o*NQW8oaHd=id*R;_O-bN!BR}2am z${RG;RI=bHFG<2|@^KRJIsg$!O&OXDxsxhWlezpXLhA^r#!s0fT3SR(By^2;*D8#r zM$q9P#Zk+Eq{+{)uUW*30ll*Y#1i{cU#ZRq$Q`mGKJrg$hb^eC*WY3~MjpVC*!@zY zvp_Uz2FGK!R|-S34JN39#K7L;o~BdQ%{EDrs#4Nf&ftTZhMkbTB@Ju0Nh&ARCfY-8 zfQ)+8l%T_3WrX}}Q-*kL-gu?IcuZKc0t3I0y}O)k<2+UvPb2tYJ?$PNlKwO3DWAd@|G$Dj~VeK2cgqSxmC5N~?fE z=5jT{UL*T%R$WtHtz2P=E$5C!)b4XzzI;-2y!S`ZV|qUrW-sgg^FXJ9YoM91`g`?l1xzotHaFY zcDbTA=B`9ebQhV=&P$wVF;2}?3vjsZj!{GtDP_CFRw4qRm$VW>;DnDkTTu`UFY^FZ z9Z5em?JJPRTUY@dkzft77#%|nkYJF?_|U;bQ+OzA|vniW1cCGQzUAx0%$U(zO9YK0U;9ax{JmXzE+Qn_FGoLhwE zHUF|p0RygfgM|@ruHmmJ4T$w27xV~n>1v|hw_9^l={jHnC7cy5LPMM?Dw&*kD2CpX z5t51x7dyPS7HzTaCux4t?*~NY4FxD)H*p$riVCF_$ki&R;Z|C5feAyfPs{A}<=NQ> zU_ke9SuheUi(6>!Y*dgiNJj62xI7K?GHKY(5O8ja0M8O5gnL^5FiS(FQxhyprEjsr zDqkJNy0_USNptiqauS0*X%vUyqCMX9YPsKxKgo(Dw@+64M7SRGBl8| zDn4n#;mY02Tp#xU5_`RCI=Bj~K1-VGjh`A~1@qu(* zQ=*M3dNo`u)()!gnTu5kSTqCd52~rlA-YY6D@W~qk(|-+Eyp%tVC8|$-BjMxN7O;MDuILXR0ZdHF?Rnea1Y2cFsI8*5RoTEga9hiO4OuIQ6%#e-drt=L`fU?;jDvGkMyXtLeBpUNa~ z#+!E^#PYhUHK9C=kSAQ!;mkop7}c3KK+PGc^z&s%v&e;07S=Pkgbiy`N}y6ytoOk# z?u{FUzIh^KGguuF+mOFU5K!Vk3chkGB?8&sF|t^-H2rv4X8m=2`H@s?-*S_N7B%jn zVn&QG4D_K7+52)x`{|9L&+r=f&A5@gE~7D?pnpvXjxBv`UopbByXaR8AVTaN*uvn zNP!}13gtqi7JJw(Y>t9FH^q*qCE7Nj6s|s!CxsXvn(d*VxHkpEspeC?I7O3`dD>K7?RLrtvBDQQ&xwkI;2lr6t{+t25@YveaceiOC&Z>Qlk;AM(I z3B3GCEedYv)-Eo+2GM7)^@dQu13u5Yq~Q9sFfsM*Fkn#>~P4`SSo}2OLNw)4}~+ z&?AQfprcPw*DzEEVkd`6uj$M#oe6C=qilS-8D?O*BBo~|Wp8{lI@eE8tS~}Q$RC{_ z3sI{UulZ6l@W4Mt35Em`40c^s_@Tp%8OwwU$129Tj7rPGGfv@ZYxot(j<5w?RdXCO z9n8^AF`nHC=hqOIXY{NMo@Mk?FpZ85MqnLXye1+ImXbmv*+d2DVNxB8@ab2%PU?&l zH6w6?08UconN$}tHFb|F zn#BxzUIrzCX49M&i*{f4LC@lNH5xN22^Cwwxw(uS?qg4hNCPLQ z^s1^UxTPC7JQ*T@E)XDIt3jX2j(TREPTnD`|6Y~w1CfkCSMI1~JAyW`S}aU_OOi#| zha7W_E|hgh&;@m~E$Kq#GHJNPlV9Q}D;Ydl;9-)V%n6+M=(T@992nqT10b7md6SP} zB3wN)Y;c!&0-;GFjw<-m*T@5WyPK@_t@uqwnITIN!18E40(2VD(dDmUzEm9PL>Q&{ z+}+cYL+Dk`XLxPK>e)SXBD-nj-os*8KARSE9loXJEqoP_RUCcKT!PmplK`PDE1ze#>TVDczh0yHnCOY(9 zyr$V)YR22+RT6>lND_5dz}&{Y{A=s-lDZA64efRL4Q8$~f?)-|atxw4#D+L^9F!ZbpUpgVeOL)okMsKNWMc!{Ex0?*SI5h?Uk{;GT!C&l41xFa6>3$#5 zMo@E#U*G~5K(txRuTgM{4i^MlUe|4aki%Nnt<`{pd5>|ivEN9R0HINx|4iQQ(UKHX zzekf|t1-g?y|qVcxcm+we(ewIZ?J`za;?h8gq63KTi-DHATXz;pUA656lEGTs;iQ? zvJ6J+WoKR5ru7V6q9C8JMrucp{IGZ&OlMCK7vn_277dQzN8s@5gllsBz(~#Y|3B24 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 52/75] 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 53/75] 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 54/75] 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 55/75] 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 56/75] 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 57/75] 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 58/75] 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 59/75] 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 60/75] 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 61/75] 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 62/75] 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 63/75] 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 80cd2abf98995c6f1ec2ada92baec1cbaa0d4a2a Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 21:48:04 -0500 Subject: [PATCH 64/75] 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 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 65/75] 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 66/75] 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 67/75] 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 68/75] 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 fea54020ff7229c9d93a0b9f5880f0b37875d889 Mon Sep 17 00:00:00 2001 From: Alexander Huddleston Date: Tue, 27 Oct 2015 22:30:11 -0500 Subject: [PATCH 69/75] 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 70/75] 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 71/75] 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 72/75] 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 73/75] 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 74/75] 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 75/75] 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