Всем хорошего воскресенья!
Я пытаюсь научить себя С++, поэтому я делаю программу Battleship.
Эта версия достаточно стандартна. Игрок вводит координаты ячейки, чтобы попытаться поразить корабль. Программа, сообщающая о попадании в корабль. Если все ячейки, занятые кораблем, поражены, программа выводит сообщение о том, что этот корабль потоплен. После каждой попытки программа выводит текущее состояние, показывая доску со всеми успешными попытками, отмеченными "*"
или "x"
соответственно.
У меня возникли проблемы с написанием функции уровня в моем классе Board, которая суммирует все уровни кораблей на доске.
Итак, у меня есть такая доска для линкоров.
a b c d e f g h i j
+-------------------+
0| |
1| |
2| |
3| |
4| |
5| |
6| |
7| |
8| |
9| |
+-------------------+
Это мой файл заголовка доски для контекста:
#ifndef BOARD_H
#define BOARD_H
#include "Ship.h"
#include <vector>
class Board
{
public:
Board(void);
void addShip(char type, int x1, int y1, int x2, int y2);
void print(void);
void hit(char c, int i);
int level(void);
private:
std::vector<Ship *> shipList;
char score[10][10];
Ship *shipAt(int x, int y);
};
#endif
У меня также есть класс корабля для хранения координат корабля
Вот мой заголовок корабля (возможно, нет необходимости читать все, просто посмотрите на функцию уровня):
//
// Ship.h
//
#ifndef SHIP_H
#define SHIP_H
class Ship
{
public:
virtual ~Ship(void) {}
virtual const char *name(void) const = 0;
virtual int size(void) const = 0;
int getX(int i) const;
int getY(int i) const;
void print(void) const;
bool includes(int x, int y);
int level(void) const;
void decreaseLevel(void);
static Ship *makeShip(char ch, int x1, int y1, int x2, int y2);
protected:
void setPos(int a1, int b1, int a2, int b2);
int lev;
private:
bool checkConfig(int x1, int y1, int x2, int y2);
int x1,y1,x2,y2;
};
class AircraftCarrier : public Ship
{
public:
AircraftCarrier(int x1, int y1, int x2, int y2);
virtual const char *name(void) const;
virtual int size(void) const;
};
class BattleShip: public Ship
{
public:
BattleShip(int x1, int y1, int x2, int y2);
virtual const char *name(void) const;
virtual int size(void) const;
};
class Cruiser: public Ship
{
public:
Cruiser(int x1, int y1, int x2, int y2);
virtual const char *name(void) const;
virtual int size(void) const;
};
class Destroyer: public Ship
{
public:
Destroyer(int x1, int y1, int x2, int y2);
virtual const char *name(void) const;
virtual int size(void) const;
};
#endif
Вот мой класс корабля (возможно, нет необходимости читать все, поэтому я просто поставил функцию уровня)
#include "Ship.h"
#include <iostream>
#include <stdexcept>
using namespace std;
//LOTS OF CODE I OMITTED FOR BREVITY
int Ship::level (void) const
{
return lev;
}
}
В моем классе кораблей
int level(void)
функция возвращает текущее значение защищенной переменной lev
Вот что у меня есть для моего Board.cpp (извините за длинные куски кода, но необходимо предоставить контекст для этого вопроса):
#include "Board.h"
#include "Ship.h"
#include <iostream>
using namespace std;
#include <vector>
#include <string.h>
#include <stdexcept>
//member function definitions
Board::Board(void)
{
//char score[10][10] = " ";
char score[10][10] = {{' '}};
}
void Board::addShip(char type, int x1, int y1, int x2, int y2)
{
if(shipList.size()<=9)
{
shipList.push_back(Ship::makeShip(type ,x1 , y1, x2, y2)) ;
}
}
void Board::print(void){
cout<< " a b c d e f g h i j"<< endl;
cout <<" +-------------------+"<< endl;
for (int i = 0; i < 10; i++) {
cout<<" "<< i <<"|" ;
for (int j = 0; j < 10; j++) {
cout << score[i][j];
}
if(i == 0){
cout << " |";
}
else{
cout << " |";
}
cout<< endl;
}
cout <<" +-------------------+"<< endl;
}
void Board::hit(char c, int i){
if (c<'a' || c>'j' || i > 9 || i<0){
throw invalid_argument("invalid input");
}
Ship* ship = shipAt(i, c-'a');
if (ship) {
score[i][c-'a']= '*';
}
else{
score[i][c-'a']= 'x';
}
}
Ship* Board::shipAt(int x, int y){
Ship* ship = shipAt(x, y);
if (ship){
return ship; }
else{
return NULL;
}
}
int Board::level(void)
{
}
В int level(void)
функция должна возвращать сумму уровней всех кораблей на доске.
По сути, я не знаю, как бы я реализовал int level(void)
в своем классе платы. Я пытаюсь вызвать уровень каждого указателя корабля и добавить к сумме, указывая указатель shipList на уровень в каждой итерации цикла. Но я изо всех сил пытаюсь это сделать.
auto
) 26.05.2014auto
войну, поэтому я его изменю. 26.05.2014