Приветствую всех! Очень нужна помощь... Не как не могу разобраться с Сокетами(( В общем есть программа вернее игра консольный Морской бой.. Нужно реализовать возможность игры по сети... То есть запускает игру один игрок и другой и рубят друг с другом, желательно реализовать это без сервера... Ну то есть может быть чтобы один из Игроков был сервером и клиентом... В общем что то как то я не могу додуматься как это реализовать... Вот моя исходник: | Код | //MyHead.h
#include <clocale> #include <conio.h> #include <stdlib.h> #include <iostream> #include <ctime> #include <winsock.h> #include <windows.h>
enum direction{h,v};
class player { public: bool defeat_flag; // переменная хранит информацию о поражении int hits[10][10]; // массив "выстрелов" объекта int ships[10][10]; // массив кораблей объекта
player (): defeat_flag(0) {} // конструктор
void ships_init(); void set(int deck); int place_ship(int s, int c, direction dir, int deck); void turn(player&, int character, int digit); void turn(player&); }; const int s = 13, c = 29; char map[s][c] = { " 0123456789 0123456789 ", " #----------# #----------#", "0| | 0| |", "1| | 1| |", "2| | 2| |", "3| | 3| |", "4| | 4| |", "5| | 5| |", "6| | 6| |", "7| | 7| |", "8| | 8| |", "9| | 9| |", " #----------# #----------#" };
void map_init(char map[s][c]); void show (char map[s][c]); int input(char&, char&); void test(); int check_ending();
char numbers[10] = { '0','1','2','3','4','5','6','7','8','9'};
SeaWar.cpp
#include "MyHead.h"
player human; player computer;
int main() { setlocale(LC_CTYPE, "Russian"); int message = 0; srand( static_cast<unsigned int>(time(NULL)) ); human.ships_init(); computer.ships_init(); map_init(map);
/* message может содержать три значения: 0 - всё нормально 1 - пользователь нажал неверную клавишу 2 - кто-то победил, конец игры */ while (message != 2) { int user_input = 0; system("cls"); show(map); if (message == 1) std::cout << "Вы ввели неверное значение!\n"; message = 0;
char character, digit; user_input = input(character, digit); if (user_input == 1) { message = 1; continue; }
human.turn(computer,character, digit); computer.turn(human); message = check_ending(); } _getch(); return 0; }
void map_init(char map[s][c]) { for (int i=0;i < 10; i++) { for (int j=0; j < 10; j++) { if (human.ships[i][j] == 2) map[i+2][j+2] = 'К'; } } }
void show(char map[s][c]) { for (int i=0; i<10; i++) { for (int j=0; j<10; j++) { /* Заполняем поле игрока */ if (computer.hits[i][j] == 1 && human.ships[i][j] == 3) { map[i+2][j+2] = 'Х'; } else if (computer.hits[i][j] == 1 && human.ships[i][j] != 3) { map[i+2][j+2] = 'О'; }
/* Заполняем поле компьютера */ if (computer.ships[i][j] == 3 && human.hits[i][j] == 1) { map[i+2][j+2+15] = 'Х'; } else if (computer.ships[i][j] != 3 && human.hits[i][j] == 1) { map[i+2][j+2+15] = 'O'; } } }
for (int i = 0; i < s; i++) { for (int j = 0; j < c; j++) { std::cout << map[i][j]; } std::cout << "\n"; } }
// ввод координат int input(char& character, char& digit) { character = _getche(); // ввод "горизонтальной" координаты int match = 0; for (int i = 0; i < 10; i++) if (numbers[i] == character) { match = 1; character = i; } if (match == 0) return 1; std::cout << '-'; match = 0; digit = _getche(); // ввод "вертикальной" координаты for (int i = 0; i < 10; i++) if (numbers[i] == digit) { match = 1; digit = i; } if (match == 0) return 1; return 0; }
// В функции устанавливаются и проверяются флаги defeat_flag игроков. int check_ending() { int flag = 0; int human_flag = 0; int computer_flag = 0; for (int i=0; i<10;i++) { for (int j=0; j<10;j++) { if (human.ships[i][j] == 2) human_flag = 1; // у пользователя ещё остались неповреждённые корабли if (computer.ships[i][j] == 2) computer_flag = 1; // у компьютера ещё остались неповреждённые корабли } } if (human_flag == 0) flag = 2; if (computer_flag == 0) flag = 1; if (flag == 1) { std::cout << "Победил игрок!\n"; return 2; } if (flag == 2) { std::cout << "Победил компьютер!\n"; return 2; } }
void player::ships_init() { // инициализация массивов hits и ships for (int i = 0; i < 10; i++) { for (int j = 0; j< 10; j++) { ships[i][j] = 1; hits[i][j] = 0; } }
// Установка кораблей set(4); set(3); set(3); set(2); set(2); set(2); set(1); set(1); set(1); set(1); }
void player::set (int deck) { int my = deck - 1; bool isset = 0; int s,c; direction dir; while (isset == 0) { dir = static_cast<direction>(rand()%2); s = rand()%10; c = rand()%10; int e = 0; switch (dir) { case h: if (ships[s][c+deck-1] == 1) { e = place_ship(s,c,dir,deck); if (e == 0) { for (int i = 0; i < deck; i++) { ships[s][c+i] = 2; } isset = 1; } } break; case v: if (ships[s+deck-1][c] == 1) { e = place_ship(s,c,dir,deck); if (e == 0) { for (int i = 0; i < deck; i++) { ships[s+i][c] = 2; } isset = 1; } } break; } } }
int player::place_ship(int s, int c, direction dir, int deck) { int e = 0; switch (dir) { case h: if (ships[s-1][c-1] == 2) { e = 1; /* #------- |X | 2222 | */ } if (ships[s-1][c+deck] == 2) { e = 1; /* #------- | X | 2222 | */ } if (ships[s+1][c-1] == 2) { e = 1; /* #------- | | 2222 |X */ } if (ships[s+1][c+deck] == 2) { e = 1; /* #------- | | 2222 | X */ }
if (ships[s][c-1] == 2) { e = 1; /* #------- | |X2222 | */ } if (ships[s][c+deck] == 2) { e = 1; /* #------- | | 2222X | */ } for (int i = 0; i < deck; i++) { if (ships[s-1][c+i] == 2) { e = 1; /* #------- | XXXX | 2222 | */ } if (ships[s+1][c+i] == 2) { e = 1; /* #------- | | 2222 | XXXX */ } } break; case v: if (ships[s-1][c-1] == 2) { e = 1; /* #------- |X | 2 | 2 | 2 | 2 | */ } if (ships[s-1][c+1] == 2) { e = 1; /* #------- | X | 2 | 2 | 2 | 2 | */ } if (ships[s+deck][c-1] == 2) { e = 1; /* #------- | | 2 | 2 | 2 | 2 |X */ } if (ships[s+deck][c+1] == 2) { e = 1; /* #------- | | 2 | 2 | 2 | 2 | X */ }
if (ships[s-1][c] == 2) { e = 1; /* #------- | X | 2 | 2 | 2 | 2 | */ } if (ships[s+deck][c] == 2) { e = 1; /* #------- | | 2 | 2 | 2 | 2 | X */ } for (int i = 0; i < deck; i++) { if (ships[s+i][c-1] == 2) { e = 1; /* #------- | |X2 |X2 |X2 |X2 | */ } if (ships[s+i][c+1] == 2) { e = 1; /* #------- | | 2X | 2X | 2X | 2X | */ } } break; } return e; }
// Ход компьютера: вносим изменения в массивы human.ships и computer.hits void player::turn(player& enemy) { bool flag = 0; while (flag == 0) { int character = rand()%10; // Координаты по которым будет стрелять компьютер int digit = rand()%10; // выбираются случайно if (hits[character][digit] != 1) // проверка: выбирал ли уже компьютер эти координаты { hits[character][digit] = 1; flag = 1; if (enemy.ships[character][digit] == 2) { enemy.ships[character][digit] = 3; } } } }
// Ход игрока: вносим изменения в массивы computer.ships и human.hits void player::turn(player& enemy, int character, int digit) { hits[character][digit] = 1; if (enemy.ships[character][digit] == 2) { enemy.ships[character][digit] = 3; } } |
Очень благодарен буду за помощь...
|