Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <math.h>
- #include <stdio.h>
- #include <time.h>
- #include <chrono>
- #include <ctime>
- #include <SFML/Network.hpp>
- #include <SFML/Graphics.hpp>
- #include <SFML/Graphics/RectangleShape.hpp>
- #include <SFML/System/Vector2.hpp>
- #include <vector>
- #include <thread>
- #include <string>
- #include <sstream>
- #include "Database.h"
- #pragma region CONSTANTS
- #define SIZE 10.F
- //Tamaño en pixeles de la ventana
- #define W_WINDOW_PX 800
- #define H_WINDOW_PX 600
- //Tamaño en celdas de la ventana
- #define W_WINDOW_TITLE 80
- #define H_WINDOW_TITLE 60
- #pragma endregion
- enum class GameState {AWAKE, INIT, LOGIN, REGISTER, GAME, ROULETTE};
- bool connected;
- GameState gameState;
- std::vector<sf::TcpSocket*> sockets;
- Database database;
- void Disconnect(sf::TcpSocket* _socket)
- {
- sockets.erase(std::remove(sockets.begin(), sockets.end(), _socket));
- delete _socket;
- connected = false;
- std::cout << "Client has been disconnected" << std::endl;
- }
- void AskForRegisterOrLogin(sf::Packet &_packet, std::string &_send, std::string &_recieve, sf::TcpSocket* _socket)
- {
- // PASO1: Preguntamos al cliente que quiere hacer (Loguearse o registrarse)
- _send = "Press L to Log In or Press R to Register";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Ask1)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO2: Recibimos la información que ha dado el cliente
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Ask2)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- // PASO3: Cambiamos el estado del servidor según lo que demanda el cliente
- if(_recieve == "R" || _recieve == "r")
- {
- gameState = GameState::REGISTER;
- }
- else if(_recieve == "L" || _recieve == "l")
- {
- gameState = GameState::LOGIN;
- }
- else
- {
- gameState = GameState::INIT;
- }
- }
- }
- _packet.clear();
- }
- void Login(sf::Packet &_packet, std::string &_send, std::string &_recieve, sf::TcpSocket* _socket, int &_userID)
- {
- std::string username, password;
- // PASO1: Envia mensaje conforme ha entrado en LOGIN
- _send = " ------ LOGIN ------ ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Login1)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO2: Envia mensaje para informar al usuario que tiene que introducir el username
- _send = "Enter your username: ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Login2)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO3: Recibe el username introducido por el usuario
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Login3)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- // PASO4: Guardamos el username para comprobar más adelante si ha iniciado sesión correctamente
- username = _recieve;
- // PASO5: Envia mensaje para informar al usuario que tiene que introducir la password
- _send = "Enter your password: ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Login5)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO6: Recibe la password introducida por el usuario
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Login6)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- // PASO7: Guardamos la password para comprobar más adelante si ha iniciado sesión correctamente
- password = _recieve;
- // PASO8: Comprobar que ha iniciado sesión correctamente y mandar al usuario al paso correspondiente
- if(database.Login(username, password))
- {
- _send = "true";
- _packet.clear();
- _packet << _send;
- //PASO 9: Enviar true para saber que se ha conectado correctamente
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: unable to send packet to client (Login7)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _userID = database.UserID(username);
- gameState = GameState::ROULETTE;
- }
- }
- else
- {
- _send = "false";
- _packet.clear();
- _packet << _send;
- //PASO 10: Enviar false para saber que no se ha conectado correctamente
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: unable to send packet to client (Login8)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- gameState = GameState::INIT;
- }
- }
- }
- }
- }
- }
- }
- _packet.clear();
- }
- void Register(sf::Packet &_packet, std::string &_send, std::string &_recieve, sf::TcpSocket* _socket)
- {
- std::string username, password, r_password;
- // PASO1: Envia mensaje conforme ha entrado en REGISTER
- _send = " ------ REGISTER ------ ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Register1)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO2: Envia mensaje para informar al usuario que tiene que introducir el username
- _send = "Choose your username: ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can't send packet to client (Register2)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- // PASO3: Recibe el username introducido y comprueba que no existe
- _packet.clear();
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Register3)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- username = _recieve;
- if(database.UserExist(username))
- {
- _send = "true";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register4)";
- Disconnect(_socket);
- }
- else
- {
- gameState = GameState::INIT;
- }
- }
- else
- {
- _send = "false";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register5)";
- Disconnect(_socket);
- }
- else
- {
- //PASO 4: Enviar mensaje de password
- _send = "Set a password for your account: ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register6)";
- Disconnect(_socket);
- }
- else
- {
- _packet.clear();
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Register7)";
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- password = _recieve;
- //PASO 5: Por seguridad volvemos a pedir la password
- _send = "Repeat your password for security: ";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register8)";
- Disconnect(_socket);
- }
- else
- {
- _packet.clear();
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to receive packet from client (Register9)";
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- r_password = _recieve;
- //PASO 6: Comprobamos que ambas contraseñas son iguales
- if(password == r_password)
- {
- _send = "true";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register10)";
- Disconnect(_socket);
- }
- else
- {
- database.Register(username, password);
- gameState = GameState::INIT;
- }
- }
- else
- {
- _send = "false";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to send packet to client (Register11)";
- Disconnect(_socket);
- }
- else
- {
- gameState = GameState::INIT;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- _packet.clear();
- }
- void DrawField()
- {
- sf::RenderWindow window(sf::VideoMode(800, 600), "Game Screen");
- sf::RectangleShape shape(sf::Vector2f(SIZE, SIZE));
- shape.setOutlineColor(sf::Color::Black);
- shape.setOutlineThickness(2.f);
- while (window.isOpen())
- {
- sf::Event event;
- bool playerMoved = false;
- while (window.pollEvent(event))
- {
- switch(event.type)
- {
- case sf::Event::Closed:
- window.close();
- break;
- }
- }
- window.clear();
- for (int i = 0; i < W_WINDOW_TITLE; ++i)
- {
- for (int j= 0; j < H_WINDOW_TITLE; ++j)
- {
- shape.setFillColor(sf::Color(90, 90, 90, 255));
- shape.setPosition(sf::Vector2f(i*SIZE, j*SIZE));
- window.draw(shape);
- }
- }
- window.display();
- }
- }
- void Game()
- {
- DrawField();
- }
- std::string CurrentDateTime() {
- time_t now = time(0);
- struct tm tstruct;
- char buf[80];
- tstruct = *localtime(&now);
- strftime(buf, sizeof(buf), "%Y%m%d%H%M", &tstruct);
- return buf;
- }
- long CurrentDateToLong()
- {
- std::string s = CurrentDateTime();
- int i = -1;
- long aux = 0;
- for (char c: s)
- {
- i++;
- }
- for (char c: s)
- {
- aux += ((int)c - 48) * std::pow(10, i);
- i--;
- }
- return aux;
- }
- int TiraleAlaRuleta()
- {
- return rand() % 5;
- }
- void Roulette(std:: string &_send, std:: string &_recieve, sf::Packet &_packet, sf::TcpSocket* _socket, int &_userID, int (&_gems)[5])
- {
- if(database.CanRoulette(_userID) < CurrentDateToLong())
- {
- _send = "true";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can not send packet to client (Roulette1)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- //Recibimos si o no desde el cliente
- _packet.clear();
- if(_socket->receive(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can not receive packet from client(Roulette3)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- _packet >> _recieve;
- if(_recieve == "y" || _recieve == "Y")
- {
- int aux = TiraleAlaRuleta();
- switch(aux)
- {
- case 0:
- _send = "You've got a diamond";
- break;
- case 1:
- _send = "You've got a emerald";
- break;
- case 2:
- _send = "You've got a saphire";
- break;
- case 3:
- _send = "You've got a ruby";
- break;
- case 4:
- _send = "You've got a ambar";
- break;
- }
- _gems[aux] += 1;
- database.WriteGems(_userID, _gems);
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can not send packet to client (Roulette1)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- //Actualizar el tiempo de conexion
- long auxLong = CurrentDateToLong() + 100;
- database.UpdateRoulette(_userID, auxLong);
- gameState = GameState::GAME;
- }
- }
- else if(_recieve == "n" || _recieve == "N")
- {
- database.ReadGems(_userID, _gems);
- for(int i = 0; i < 5; ++i)
- {
- std::cout << _gems[i] << ", ";
- }
- std::cout << std::endl;
- gameState = GameState::GAME;
- }
- }
- }
- }
- else
- {
- _send = "false";
- _packet.clear();
- _packet << _send;
- if(_socket->send(_packet) != sf::Socket::Done)
- {
- std::cout << "Error: Can not send packet to client (Roulette2)" << std::endl;
- Disconnect(_socket);
- }
- else
- {
- gameState = GameState::GAME;
- }
- }
- }
- void GameController(std:: string &_send, std:: string &_recieve, sf::Packet &_packet, sf::TcpSocket* _socket, int &_userID, int (&_gems)[5])
- {
- switch(gameState)
- {
- case GameState::INIT:
- AskForRegisterOrLogin(_packet, _send, _recieve, _socket);
- break;
- case GameState::REGISTER:
- Register(_packet, _send, _recieve, _socket);
- break;
- case GameState::LOGIN:
- Login(_packet, _send, _recieve, _socket, _userID);
- break;
- case GameState::GAME:
- Game();
- break;
- case GameState::ROULETTE:
- Roulette(_send, _recieve, _packet, _socket, _userID, _gems);
- break;
- }
- }
- void Connection(sf::TcpSocket* _socket)
- {
- std::string send, recieve;
- int userID = 0;
- int gems[5];
- sf::Packet packet;
- connected = true;
- gameState = GameState::INIT;
- while(connected)
- {
- GameController(send, recieve, packet, _socket, userID, gems);
- }
- }
- int main()
- {
- connected = false;
- gameState = GameState::AWAKE;
- sf::TcpListener dispatcher;
- sf::Socket::Status status = dispatcher.listen(53005);
- sf::TcpSocket* socket = new sf::TcpSocket;
- if(status != sf::Socket::Done)
- {
- std::cout << "Error: Unable to create listener (Server1)" << std::endl;
- return 0;
- }
- else
- {
- while(1)
- {
- if(dispatcher.accept(*socket) != sf::Socket::Done)
- {
- std::cout << "Error: Unable to connect (Server2)" << std::endl;
- socket->disconnect();
- }
- else
- {
- std::cout << "New client connected" << std::endl;
- sockets.push_back(socket);
- std::thread connections(&Connection, socket);
- connections.detach();
- }
- }
- }
- socket->disconnect();
- dispatcher.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement