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;
}
}
Очень благодарен буду за помощь...