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++)
|