E-mail: magikgod@mail.ru

Игра Морской Бой часть 3
break;
case 6: case 7: case 8: case 9:
size = 1;
break;
}

while(tmp == FAILED)
{
tmp = setShipToRandomPlace(gameplace.ship[numberOfShip],
gameplace.field, size);
}

numberOfShip++;
tmp = FAILED;
}

}

//проверить, проиграл ли игрок
int GamePlace :: LOST(GAMEPLACE gameplace)
{
int lost = 1;
for(int i = 0; i < 10; i++)
if(getShipStatus(gameplace.ship[i]) == LIVE)
lost = 0;

return lost;
}

//организовать выстрел в данную клетку
//возвращает: попал, убил, мимо или вторичный выстрел
int GamePlace :: fire(GAMEPLACE &gameplace, int x, int y)
{
int result;

//если клетка пустая
if((getSign(gameplace.field, x, y) == EMPTY)||
(getSign(gameplace.field, x, y) == ZERO))
{
setSign(gameplace.field, x, y, MISSED);
result = MISSED;
}
else
//если на клетке есть корабль
if(getSign(gameplace.field, x, y) == CSHIP)
{
setSign(gameplace.field, x, y, WOUNDED);

int num;
num = getNumberOfShip(gameplace, x, y);
if(!IsLive(gameplace, num))
{
killShip(gameplace.ship[num], gameplace.field);
result = KILLED;
}
else
{
setShipStatus(gameplace.ship[num], WOUNDED);
result = WOUNDED;
}

setZeroSigns(gameplace, num);
}
else
//если в клетку уже стреляли
if((getSign(gameplace.field, x, y) == WOUNDED)||
(getSign(gameplace.field, x, y) == KILLED)||
(getSign(gameplace.field, x, y) == MISSED))
result = DOUBLE;

return result;
}


//ввод координат (для стрельбы при помощи клавиатуры)
COORD GamePlace :: enterCoord(GAMEPLACE gameplace, COORD computersCoord)
{
COORD coord = {0, 0}, oldCoord;
FIELD field;
copyField(field, gameplace.field, WITHSHIPS);
char ch;
int tmpSign;


while(ch!=13)
{

ch = getch();
oldCoord = coord;

switch(ch)
{
case 77:
coord.X++;
break;
case 75:
coord.X--;
break;
case 80:
coord.Y++;
break;
case 72:
coord.Y--;
break;
default:
break;
}
if(coord.X > 9) coord.X = 0;
if(coord.Y > 9) coord.Y = 0;
if(coord.X < 0) coord.X = 9;
if(coord.Y < 0) coord.Y = 9;


tmpSign = getSign(field, coord.X, coord.Y);
setSign(field, coord.X, coord.Y, CURSOR);


//перереисовка предыдущей и текущей ячейки
drawCell(field, computersCoord, coord.X, coord.Y);
drawCell(field, computersCoord, oldCoord.X, oldCoord.Y);


setSign(field, coord.X, coord.Y, tmpSign);


}

return coord;
}

//функция организует ход игрока
void GamePlace :: playerMove(GAMEPLACE &gameplace,
COORD fieldCoord)
{
COORD coord;
int result = FIRSTTIME;
//стрелять до промаха
while(((result == FIRSTTIME)||(result == WOUNDED)||
(result == KILLED)||(result==DOUBLE))&&(!LOST(gameplace)))
{
drawField(gameplace.field, fieldCoord);
coord = enterCoord(gameplace, fieldCoord);
result = fire(gameplace, coord.X, coord.Y);
}
}

//функция, которая позволяет пользователю расставить корабли
void GamePlace :: setShipsWithKeyboard(GAMEPLACE &gameplace,
COORD fieldCoord)
{
int size;
COORD coord = {0, 0}, oldCoord;
FIELD field;
char ch;
int tmpSign;
int numberOfShip = 0;

drawField(gameplace.field, fieldCoord);

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;
break;
case 6: case 7: case 8: case 9:
size = 1;
break;
}



copyField(field, gameplace.field, WITHSHIPS);


while((ch != ''h'')&&(ch != ''v''))
{
oldCoord = coord;
ch = getch();

switch(ch)
{
case 77:
coord.X++;
break;
case 75:
coord.X--;
break;
case 80:
coord.Y++;
break;
case 72:
coord.Y--;
break;
default:
break;
}
if(coord.X > 9) coord.X = 0;
if(coord.Y > 9) coord.Y = 0;
if(coord.X < 0) coord.X = 9;
if(coord.Y < 0) coord.Y = 9;


tmpSign = getSign(gameplace.field, coord.X, coord.Y);
setSign(gameplace.field, coord.X, coord.Y, CURSOR);

setShowMode(gameplace.field, SHOWSHIPS);

//прорисовка предыдущей и текущей чейки
//(чтобы не перерисовыать все поле)
drawCell(gameplace.field, fieldCoord,
coord.X, coord.Y);

drawCell(gameplace.field, fieldCoord,
oldCoord.X, oldCoord.Y);


setSign(gameplace.field, coord.X, coord.Y, tmpSign);


}

if(ch == ''h'')
{
//если нажата кнопка h, попытаться поставить
//корабль горизонатльно
if(setShip(gameplace.ship[numberOfShip],
gameplace.field, coord, size, HORIZONTAL) == SUCCEEDED)
{
gameplace.ship[numberOfShip].shipStatus = LIVE;
drawField(gameplace.field, fieldCoord);
numberOfShip++;
}
}
else
if(ch == ''v'')
{
//если нажата кнопка v, попытаться поставить
//корабль горизонатльно
if(setShip(gameplace.ship[numberOfShip],
gameplace.field, coord, size, VERTICAL) == SUCCEEDED)
{
gameplace.ship[numberOfShip].shipStatus = LIVE;
drawField(gameplace.field, fieldCoord);
numberOfShip++;
}
}



ch = 0;
}
}




//////////////////////////////////////////////////////////
//utils.h
//////////////////////////////////////////////////////////

#ifndef __utils
#define __utils

namespace MyUtils{

//залить фон синим цветом
void fill();
//вывести текст на экран
void WriteText(char *, int size, int x, int y);

};

#endif __utils




//////////////////////////////////////////////////////////
//utils.cpp
//////////////////////////////////////////////////////////


#include <iostream.h>
#include <windows.h>
#include <fstream.h>
#include <string.h>
#include <stdio.h>
#include "utils.h"

//залить экран синим цветом
void MyUtils :: fill()
{
COORD top = {0, 0};
int colour = BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
LPDWORD lpdwN;
HANDLE Handle;
LPDWORD lpNumberOfCharsWritten;
LPVOID lpReserved;
Handle = GetStdHandle(STD_OUTPUT_HANDLE);

for(int i = 0; i < 25; i++)
{
for(int j = 0; j < 80; j++)
WriteConsole(Handle, " ", 1,
lpNumberOfCharsWritten, lpReserved);
}

for(i = 0; i < 25; i++)

Hosted by uCoz