E-mail: magikgod@mail.ru

Игра Морской Бой часть 2
}

}

//установить размер корабля
ship.size = size;

for( i = 0; i < size; i++)
{
//установить координат корабля
//и помететь определенные клетки на поле как занятые кораблем
if(direction == VERTICAL)
{
ship.coord[i] = coord;
setSign(field, coord.X, coord.Y, CSHIP);
coord.Y++;
}
else
{
ship.coord[i] = coord;
setSign(field, coord.X, coord.Y, CSHIP);
coord.X++;
}

}
return SUCCEEDED;
}

//функция установки корабля в случайное место
int MyShips :: setShipToRandomPlace(SHIP &ship, FIELD &field, int size)
{
srand(GetTickCount());
COORD coord;

//присвоить случайные значения переменным coord и direction
coord.X = rand()%10;
coord.Y = rand()%10;
int direction;
if(rand()%2) direction = HORIZONTAL;
else direction = VERTICAL;

//попытаться установить корабль на случайные координаты
return setShip(ship, field, coord, size, direction);
}

//установить статус корабля
void MyShips :: setShipStatus(SHIP &ship, int shipStatus)
{
ship.shipStatus = shipStatus;
}

//узнать статус корабля
int MyShips :: getShipStatus(SHIP ship)
{
return ship.shipStatus;
}


//узнать размер корабля
int MyShips :: getShipSize(SHIP ship)
{
return ship.size;
}


//узнать координаты корабля
COORD MyShips :: getShipCoord(SHIP ship, int deck)
{
return ship.coord[deck];
}

//функция убить корабль
void MyShips :: killShip(SHIP &ship, FIELD &field)
{
COORD coord;
//установить статус корабля
setShipStatus(ship, DESTROYED);
//пометить клетки на поле как "убитый"
for(int i = 0; i < ship.size; i++)
{
coord = ship.coord[i];
setSign(field, coord.X, coord.Y, KILLED);
}
}







//Вспомогательные функции

//функция проверки того, находится ли данная клетка внутри поля
int MyShips :: IsInside(int x, int y)
{
if((x >=0 )&&(x <=9) && (y >=0 )&&(y <=9))
return 1;
else
return 0;
}

//функция проверки, помечена ли данная клетка как "промах"
int MyShips :: IsMissed(FIELD field, int x, int y)
{
if(getSign(field, x, y) == MISSED)
return 1;
else
return 0;
}

//проверка являится ли данная клетка пустой
int MyShips :: IsEmpty(FIELD field, int x, int y)
{
if((((getSign(field, x, y) == EMPTY)||(getSign(field, x, y) == ZERO)||(getSign(field, x, y) == MISSED))
&&(x >=0 )&&(x <=9) && (y >=0 )&&(y <=9))||
((x <= -1)||(y <= -1)||(x >= 10)||(y >= 10)))
return 1;
else return 0;
}




//////////////////////////////////////////////////////////
//gameplace.h
//////////////////////////////////////////////////////////

#ifndef __gameplace
#define __gameplace


#include "field.h"
#include "ships.h"

#define DOUBLE 41


using namespace MyShips;
using namespace MyField;

#define FIRSTTIME 50

namespace GamePlace{

struct GAMEPLACE{
FIELD field;
SHIP ship[10];
};

//расставить все корабли
void setAllShips(GAMEPLACE &gameplace);
//организовать выстрел в данную клетку
//возвращает: попал, убил, мимо или вторичный выстрел
int fire(GAMEPLACE &gameplace, int x, int y);
//расставить знаки говорящие о том,
//что на этой клетке не может быть корабля,
//в качестве параметра принимает номер корабля
void setZeroSigns(GAMEPLACE &gameplace, int num);
//проверить, проиграл ли игрок
int LOST(GAMEPLACE gameplace);
//получить номер корабля расположенный на данной клетке
int getNumberOfShip(GAMEPLACE gameplace, int x, int y);
//жив ли корабль?
int IsLive(GAMEPLACE gameplace, int num);
//ввод координат (для стрельбы при помощи клавиатуры)
COORD enterCoord(GAMEPLACE gameplace, COORD computersCoord);
//функция организует ход игрока
void playerMove(GAMEPLACE &gameplace, COORD fieldCoord);
//расставить корабли при помощи клавиатуры
void setShipsWithKeyboard(GAMEPLACE &gameplace, COORD fieldCoord);
};

#endif



//////////////////////////////////////////////////////////
//gameplace.cpp
//////////////////////////////////////////////////////////



#include <iostream.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include "utils.h"
#include "gameplace.h"


using namespace MyUtils;

//расставить знаки говорящие о том,
//что на этой клетке не может быть корабля,
//в качестве параметра принимает номер корабля
void GamePlace :: setZeroSigns(GAMEPLACE &gameplace,
int num)
{
COORD coord;
int x, y;

for(int i = 0; i < getShipSize(gameplace.ship[num]); i++)
{
coord = getShipCoord(gameplace.ship[num], i);
x = coord.X;
y = coord.Y;


if((getSign(gameplace.field, x - 1 , y - 1 ) == EMPTY)&&
IsInside(x - 1 , y - 1 )&&
((getSign(gameplace.field, x, y) == WOUNDED)||
(getSign(gameplace.field, x, y) == KILLED)))
setSign(gameplace.field, x - 1, y - 1, ZERO);

if((getSign(gameplace.field, x - 1, y) == EMPTY)&&
IsInside(x - 1, y)&&
(getSign(gameplace.field, x, y) == KILLED))
setSign(gameplace.field, x - 1, y, ZERO);

if((getSign(gameplace.field, x - 1 , y + 1 ) == EMPTY)&&
IsInside( x - 1 , y + 1 )&&
((getSign(gameplace.field, x, y) == WOUNDED)||
(getSign(gameplace.field, x, y) == KILLED)))
setSign(gameplace.field, x - 1, y + 1, ZERO);

if((getSign(gameplace.field, x, y - 1) == EMPTY)&&
IsInside( x, y - 1)&&
(getSign(gameplace.field, x, y) == KILLED))
setSign(gameplace.field, x, y - 1, ZERO);

if((getSign(gameplace.field, x, y + 1) == EMPTY)&&
IsInside( x, y + 1)&&
(getSign(gameplace.field, x, y) == KILLED))
setSign(gameplace.field, x, y + 1, ZERO);

if((getSign(gameplace.field, x + 1 , y - 1 ) == EMPTY)&&
IsInside( x + 1 , y - 1 )&&
((getSign(gameplace.field, x, y) == WOUNDED)||
(getSign(gameplace.field, x, y) == KILLED)))
setSign(gameplace.field, x + 1, y - 1, ZERO);


if((getSign(gameplace.field, x + 1, y) == EMPTY)&&
IsInside( x + 1, y)&&
(getSign(gameplace.field, x, y) == KILLED))
setSign(gameplace.field, x + 1, y, ZERO);

if((getSign(gameplace.field, x + 1 , y + 1 ) == EMPTY)&&
IsInside( x + 1 , y + 1 )&&
((getSign(gameplace.field, x, y) == WOUNDED)||
(getSign(gameplace.field, x, y) == KILLED)))
setSign(gameplace.field, x + 1, y + 1, ZERO);
}

}

//получить номер корабля расположенный на данной клетке
int GamePlace :: getNumberOfShip(GAMEPLACE gameplace,
int x, int y)
{
COORD coord;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < getShipSize(gameplace.ship[i]); j++)
{
coord = getShipCoord(gameplace.ship[i], j);
if((coord.X == x)&&(coord.Y == y))
return i;
}

}
return ERROR;
}

//жив ли корабль?
int GamePlace :: IsLive(GAMEPLACE gameplace, int num)
{
COORD coord;

//проверить каждую (жива ли?)
for(int i = 0; i < getShipSize(gameplace.ship[num]); i++)
{
coord = getShipCoord(gameplace.ship[num], i);
if(getSign(gameplace.field, coord.X, coord.Y) != WOUNDED)
return 1;
}
return 0;
}


//расставить все корабли(на случайные места)
void GamePlace :: setAllShips(GAMEPLACE &gameplace)
{
srand(GetTickCount());
clearField(gameplace.field);
for (int i = 0; i < 10; i++)
setShipStatus(gameplace.ship[i], LIVE);

int tmp = FAILED;
int numberOfShip = 0;
int size = 0;


//пытаться расставить корабли начиная с наибольшего
//на случайное место
while(numberOfShip < 10)
{
switch (numberOfShip)
{
case 0:
size = 4;
break;
case 1: case 2:
size = 3;
break;
case 3: case 4: case 5:
size = 2;

Hosted by uCoz