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 01/11] 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 02/11] 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 03/11] 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 04/11] 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 05/11] 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 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 06/11] 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 07/11] 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 08/11] 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 09/11] 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 10/11] 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 11/11] 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