→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Морской бой...Help! 
Автор Сообщение
Начинающий

Регистрация: 03.06.2011
Сообщения: 1
Языки:
Специальность:

Репутация: 0 [ ? ]
Сообщение Морской бой...Help!
//Ship.h
#include "stdafx.h"


# ifndef SHIP_H
# define SHIP_H
#include <windows.h>

#include <set>
#include <map>
#include <string>
//include "CyrIOS.h"

#define N 10

struct Cell;
typedef std::set<Cell> CellSet;

struct Cell
{
Cell (int _r=0, int _c=0):row(_r), col(_c) {}
bool InSet(const CellSet&) const;
bool operator<(const Cell&) const;
int row;
int col;
};

struct Rect
{
Rect() {}
Rect(Cell _It, Cell _rb):It(_It), rb(_rb) {FillCset();}
void FillCset();
bool Intersect(const CellSet& cs) const;
Cell It;
Cell rb;
CellSet cset;
};

class Ship
{
friend class UserNavy;
friend class RobotNavy;
public:
Ship():nDeck(0), nLiveDeck(0) {}
Ship(int, std::string, Rect);
protected:
Rect place;
std::string name;
int nDeck;
int nLiveDeck;
};

# endif /* SHIP_H */
//Ship.cpp
#include <iostream>
#include <string>
#include <algorithm>
#include "Ship.h"
using namespace std;
bool Cell::InSet(const CellSet& cs) const
{
return (cs.count(Cell(row. col))>0);
}
bool Cell::operator <(const Cell& c) const
{
return ((row<c.row) || ((row==c.row) && (col<c.col)));
}

void Rect::FillCset()
{
for (int i=It.row; i<=rb.row; i++)
for (int j=It.col; j<=rb.col; j++)
cset.insert(Cell(i,j));
}

bool Rect::Intercset(const CellSet& cs) const
{
CellSet common_cell;
set_intersection(cset.begin(), cset.end(), cs.begin(), cs.end(),
inserter(common_cell, common_cell.begin()));
return (common_cell.size()>0);
}

Ship::Ship(int _nDeck, string _name, Rect _place):
place(_place), name(_name), nDeck(_nDeck), nLiveDrck(_nDeck) {}



#include "Ship.h"
#define DECK 176
#define DAMAGE 'X'
#define MISS '0'

typedef unsigned char Field[N][N];
typedef std::map<Cell, int>ShipMap;

enum CurrentState {Miss, Damage, Kill};

struct Space
{
public:
static Cell u_fire;
static Cell r_fire;
static CurrentState u_state;
static CurrentState r_state;
static int step;
};

class Navy:public Space
{
public:
Navy();
void AllocShip(int, int, std::string);
void Show() const;

int GetInt();
bool IsLive() {return (nLiveShip>0);}
Rect Shell(Rect) const;
void AddToVetoSet(Rect);

protected:
Ship ship[10];
Field ownField;
Field enemyField;
ShipMap shipMap;
CellSet vetoSet;
CellSet crushSet;
int nLiveShip;
};

class UserNavy:public Navy
{
public:
UserNavy() {Allocation();}
void Allocation();
void FireOff();
void ResultAnalys();
void GetFire();
void FillDeadZone(Rect r, Field&);
};

class RobotNavy:public Navy
{
public:
RobotNavy();
void Allocation();
void FireOff();
void ResultAnalys();
void GetFire();
private:
bool isCruchContinue;
bool upEmpty;
};


#include <iostream>
#include <cstlib>
#include <time.h>
#include <algorithm>
#include "Navy.h"
using namespace std;

Cell Space::u_fire;
Cell Space::r_fire;
CurrentState Space::u_state=Mass;
CurrentState Space::r_state=Mass;
int Space::step=1;

string gap(int n) {return string(n, ' ');}

Navy::Navy():nLiveShip(10)
{
for (int i=0; i<N; i++)
for (int j=0; j<N; j++)
{
ownField[i][j]='.';
enemyField[i][j]='.';
}
}

Rect Navy::Shell(Rect r) const
{
Rect sh(r);
sh.It.row=(-sh.It.row<0) ? 0:sh.It.row;
sh.It.col=(-sh.It.col<0) ? 0:sh.It.col;
sh.rb.row=(++sh.rb.row>(N-1)) ? (N-1):sh.rb.row;
sh.rb.col=(++sh.rb.col>(N-1)) ? (N-1): sh.rb.col;
return sh;
}

void Navy::AddToVetoSet(Rect r)
{
for (int i=r.It.row; i<=r.rb.row; i++)
for (int j=r.It.col; j<=r.rb.col; j++)
vetoSet.insert(Cell(i,j));
}

void Navy::AllocShip(int indShip, int nDeck, string name)
{
int i,j;
Cell It, rb;
while (1)
{
It.row=rand() % (N+1-nDeck);
It.col=rb.col=rand() % N;
rb.row=It.row+nDeck-1;
if (!Rect(It, rb).Intersect(vetoSet)) break;
}
ship[indShip]=Ship(nDeck, name, Rect(It, rb));

for (i=It.row; i<=rb.row; i++)
for (j=It.col; j<=rb.col; j++)
{
ownField[i][j]=DECK;
shipMap[Cell(i,j)]=indShip;
}

AddToVetoSet(Shell(Rect(It, rb)));
}

void Navy::Show() const
{
char rowName[10]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
string colName("1 2 3 4 5 6 7 8 9 10");
int i,j;
cout<<"________________________\n";
cout<<gap(3)<<"Мій флот"<<gap(18)<<"Флот ворога"<<endl;
cout<<gap(3)<<colName<<gap(6)<<colName<<endl;

for (i=0; i<N; i++)
{
//Own
string line=gap(1)+rowName[i];
for (j=0; j<N; j++)
line +=gap(1)+(char)ownField[i][j];
//Enemy
line +=gap(5)+rowName[i];
for (j=0; j<N; j++)
line +=gap(1)+(char)enemyField[i][j];
cout<<line<<endl;
}
cout<<endl;
cout<<"=================================\n";
cout<<step<<"."<<"Мій постріл: ";
step++;
}

int Navy::GetInt()
{
int value;
while (true)
{
cin>>value;
if ('\n'==cin.peek()) {cin.get(); break;}
else
{
cout<<"Повторіть введення колонки (очікується ціле число):"<<endl;
cin.clear();
while (cin.get() != '\n') {};
}
}
return value;
}

void UserNavy::Allocation()
{
srand((unsignet)time(NULL));
AllocShip(0, 4, "Авіаносець 'Варяг'");
AllocShip(1, 3, "Лінкор 'Муромець'");
AllocShip(2, 3, "Лінкор 'Микитович'");
AllocShip(3, 2, "Крейсер 'Чудний'");
AllocShip(4, 2, "Крейсер 'Добрий'");
AllocShip(5, 2, "Крейсер 'Справедливий'");
AllocShip(6, 1, "Міноносець 'Хоробрий'");
AllocShip(7, 1, "Міноносець 'Ушлий'");
AllocShip(8, 1, "Міноносець 'Моторний'");
AllocShip(9, 1, "Міноносець 'Сміливий'");
vetoSet.clear();
}

void UserNavy::FillDeadZone(Rect r, Field& field)
{
int i,j;
Rect sh=Shell(r);
for (i=sh.It.row, j=sh.It.col; j<=sh.rb.col; j++)
if (sh.It.row<r.It.row) field[i][j]=' ';
for (i=sh.rb.row, j=sh.It.col; j<=sh.rb.col; j++)
if (sh.rb.row>r.rb.row) field[i][j]=' ';
for (j=sh.It.col, i=sh.It.row; i<=sh.rb.row; i++)
if (sh.It.col<r.It.col) field[i][j]=' ';
for (j=sh.rb.col. i=sh.It.row; i<=sh.rb.row; i++)
if (sh.rb.col>r.rb.col) field[i][j]=' ';
}

void UserNavy::FireOff()
{
string capital_letter="ABCDEFGHIJ";
string small_letter="abcdefghij";
unsigned char rowName;
int colName;
int row;
int col;

bool success=false;
while (!success)
{
cin>>rowName;
row=capital_letter.find(rowName);
if (-1==row) row=small_letter.find(rowName);
if (-1==row) {cout<<"Помилка. Повторіть ввід.\n"; continue'}
colName=GetInt();
col=colName-1;
if ((col<0)||(col>9))

cout<<"Помилка. Повторіть ввід.\n"; continue;
}

success=true;
}

u_fire=Cell(row, col);
}

void UserNavy::ResultAnalys()
{
//r_state;
//u_fire;
switch(r_state)
{
case Maiss:
enemyField[u_fire.row][u_fire.col]=MISS;
break;
case Damage:
enemyField[u_fire.row][u_fire.col]=DAMAGE;
crushSet.insert(u_fire);
break;
case Kill:
enemyField[u_fire.row][u_fire.col]=DAMAGE;
crushSet.insert(u_fire);
Rect kill;
kill.It=*crushSet.begin();
kill.rb=*(-crushSet.end());
FillDeadZone(kill, enemyField);
crushSet.clear();
}
}

void UserNavy::GetFire()
{
string capital_letter="ABCDEFGHIJ";
char rowName=capital_letter[r_fire.row];
int colName=r_fire.col+1;
cout<<"\n Постріл ворога:"<<rowName<<colName<<endl;
if (DECK==ownField[r_fire.row][r_fire.col])
{
cout<<"***Влучив!***";
ownField[r_fire.row][r_fire.col]=DAMAGE;
u_state=Damage;
int ind=shipMap[r_fire];
ship[ind].nLiveDeck-;

if (!ship[ind].nLiveDeck)
{
u_state=Kill;
cout<<gap(6)<<"УУУ жах! Потонув"<<ship[ind].name<<"!!!";
nLiveShip-;
Rect kill=ship[ind].place;
FillDeadZone(kill.ownField);
}
}
else
{
u_state=Miss;
cout<<"***Повз) Не потрапив***";
ownField[r_fire.row][r_fire.col]=MISS;
}
cout<<endl;
}

RobotNavy::RobotNavy()
{
Allocation();
isCrushContinue=falsel
upEmpty=false;
}
void RobotNavy::Allocation()
{
AllocShip(0, 4, "Авіаносець 'Алькаїда'");
AllocShip(1, 3, "Лінкор 'БенЛаден'");
AllocShip(2, 3, "Лінкор 'Хусейн'");
AllocShip(4, 2, "Крейсер 'Підлий'");
AllocShip(5, 2, "Крейсер 'Злий'");
AllocShip(6, 1, "Міноносець 'Бридкий'");
AllocShip(7, 1, "Міноносець 'Мерзенний'");
AllocShip(8, 1, "Міноносець 'Капосний'");
AllocShip(9, 1, "Міноносець 'Задушливий'");
vetoSet.clear();
}

void RobotNavy::FireOff()
{
Cell c, cUp;
if (!isCrushContinue)
{
while (1)
{
c.row=rand() % N;
c.col=rand() % N;
if (!c.InSet(vetoSet)) break;
}
}
else
{
c=cUp=r_fire;
cUp.row-;
if ((!upEmpty)&& c.row && (!cUp.InSet(vetoSet)))
c.row-;
else
{
c=*(-crushSet.end());
c.row++;
}
}
r_fire=c;
vetoSet.insert(r_fire);
}

void RobotNavy::ResultAnalys()
{
switch (u_state)
{
case Mass:
if (isCrushContinue) upEmpty=true;
break;
case Damage:
isCrushContinue=true;
crushSet.insert(r_fire);
break;
case Kill:
isCrushContinue=falsel
upEmpty=false;
crushSet.insert(r_fire);
Rect kill;
kill.It=*cruchSet.begin();
kill.rb=*(-crushSet.end());

AddToVetoSet(Shell(kill));
crushSet.clear();
}
}
void RobotNavy::GetFire()
{
if (DECK==ownField[u_fire.row][u_fire.col])
{
cout<<"***Влучив!***";
r_state=Damage;
int ind=shipMap[u_fire];
ship[ind].nLiveDeck-;

if (!ship[ind].nLiveDeck)
{
r_state=Kill;
cout<<gap(6)<<"Знищений"<<ship[ind].name<<"!!!";
nLiveShip-;
}
}
else
{
r_state=Miss;
cout<<"***Повз) Не потрапив!***";
}
cout<<endl;
}

//Main.cpp
#include <iostream>
#include "Navy.h"
using namespace std;

int main()
{
UserNavy userNavy;
RobotNavy robotNavy;
userNavy.Show();

while (userNavy.IsLive() && robotNavy.IsLive())
{
if (Space::u_state !=Miss)
{
cout<<"пропускається.....:<Enter>"<<endl;
cin.get();
}
else
{
userNavy.FireOff();
robotNavy.GetFire();
userNavy.ResultAnalys();
if (!robotNavy.IsLive())
{
userNavy.Show();
break;
}
}
if (Space::r_state !=Miss)
cout<<"\n Постріл ворога: пропускається..."<<endl;
else
{
robotNavy.FireOff();
userNavy.GetFire();
robotNavy.ResultAnalys();
}
userNavy.Show();
}
if (userNavy.IsLive())
cout<<"\n:))) УРА! Перемога!!! :))))"<<endl;
else
{
cout<<"\n :((( На жаль. Ворого виявився сильніший!"<<endl;
}
cin.get();
return 0;
}


03.06.2011 20:28
Профиль Отправить email
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 


Кто сейчас на конференции

Зарегистрированные пользователи: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»