Initial commit

This commit is contained in:
2025-04-29 17:45:27 +03:00
commit cc1bb79633
10 changed files with 441 additions and 0 deletions

79
src/client/client.cpp Normal file
View File

@@ -0,0 +1,79 @@
#include "client.hpp"
void print_instructions() {
std::cout << "Доступные команды:\n";
std::cout << " - вперёд\n";
std::cout << " - направо\n";
std::cout << " - налево\n";
std::cout << " - назад\n";
std::cout << " - сдаюсь\n";
std::cout << "Введите команду для хода.\n";
}
int Client::ping(struct sockaddr_in address){
return connect(sock, (struct sockaddr*)&address, sizeof(address)) > 0;
}
void Client::run() {
struct sockaddr_in serv_addr;
// Создание сокета
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
throw std::runtime_error("[Client::request] connect(2) call error");
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Преобразование IP-адреса из текстового вида в бинарный
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
throw std::runtime_error("[Client::request] connect(2) call error");
}
// Подключение к серверу
if (ping(serv_addr)) {
throw std::runtime_error("Connection lost!");
}
std::cout << "Подключено к серверу. Введите ваше имя: ";
std::string player_name;
std::getline(std::cin, player_name);
if (ping(serv_addr)) {
throw std::runtime_error("Connection lost!");
}
// Отправка имени игрока на сервер
send(sock, player_name.c_str(), player_name.size(), 0);
std::cout << "Игра началась!\n";
print_instructions();
char buffer[1024] = {0};
while (true) {
std::cout << "Введите команду: ";
std::string command;
std::getline(std::cin, command);
// Отправка команды на сервер
send(sock, command.c_str(), command.size(), 0);
// Получение ответа от сервера
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(sock, buffer, sizeof(buffer), 0);
if (bytes_received <= 0) {
throw std::runtime_error("Connection lost!");
//break;
}
std::string response(buffer);
std::cout << "Ответ сервера: " << response;
// Проверка завершения игры
if (response.find("вы выиграли") != std::string::npos ||
response.find("вы проиграли") != std::string::npos) {
break;
}
}
close(sock);
}