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] 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 +}