• 🚨 Ещё можно успеть на курс «OSINT: технология боевой разведки» от Академии Кодебай

    🔍 Изучите методы разведки с использованием открытых источников (OSINT) для проведения успешных атак.
    🛠️ Освойте ключевые инструменты, такие как Maltego, TheHarvester и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальную разведку.
    🧠 Развивайте навыки, которые помогут вам стать экспертом в области информационной безопасности.

    Запись открыта до 23 мая Подробнее о курсе ...

Морской Бой по сети C++

  • Автор темы Автор темы MiRiN
  • Дата начала Дата начала
M

MiRiN

Приветствую всех! Очень нужна помощь... Не как не могу разобраться с Сокетами(( В общем есть программа вернее игра консольный Морской бой.. Нужно реализовать возможность игры по сети... То есть запускает игру один игрок и другой и рубят друг с другом, желательно реализовать это без сервера... Ну то есть может быть чтобы один из Игроков был сервером и клиентом... В общем что то как то я не могу додуматься как это реализовать... Вот моя исходник:
Код:
//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;
}
}

Очень благодарен буду за помощь...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD