Я делаю игру змей и лестниц с наследованием и полиморфизмом. Доска состоит из плиток, которые могут быть обычными, змеевыми или лестничными. Таким образом, у меня есть класс Board
с типом переменной Tile
(абстрактный класс), который может быть Snake
(дочерний класс) или Ladder
(дочерний класс). Плата может быть настолько большой, насколько хочет пользователь, по этой причине я использую векторный указатель Tile
.
Я хочу инициализировать такой вектор с фиксированным размером, заданным размером платы, но я получаю сообщение об ошибке «function Board::getBoardSize() is not a type name
», но я обнаружил, что все на inte rnet, даже мой профессор инициализируют такие векторы, как этот.
ПРИМЕЧАНИЕ: Board
создается внутри другого класса (MyGame
), в частности, в функции с именем start()
, и в основном я просто создаю тип объекта MyGame
для вызова функции запуска, чтобы все происходило .
Обновление: раньше в Board не были настроены все переменные для его построения, но теперь они есть (пришлось перемещать функции между классами и переменными).
Теперь вопрос как мне увеличить размер вектора с помощью указателей плитки? Как было указано, мне нужно увеличить его размер в конструкторе Board после того, как станет известен BoardSize, но каков синтаксис для этого? Есть ли необходимость в push_back (новая плитка *)? или просто push_back ()?
Board.h:
#ifndef BOARD_H
#define BOARD_H
#include <vector>
#include "Tile.h"
class Board
{
public:
Board();
~Board();
void setBoardSize();
void setNumSnakes();
void setNumLadders();
void setReward();
void setPenalty();
int getBoardSize();
int getNumSnakes();
int getNumLadders();
int getReward();
int getPenalty();
public:
int boardSize;
int numSnakes;
int numLadders;
int reward;
int penalty;
std::vector<Tile*> place;
};
#endif
Board. cpp:
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include "Board.h"
#include "Snake.h"
#include "Ladder.h"
Board::Board()
{
setBoardSize();
setNumSnakes();
setNumLadders(); //Now it has all it needs to construct
setReward();
setPenalty();
place.reserve(getBoardSize()); // <------------ I think is something like this.
for(int i = 0; i < getBoardSize(); i++)
place.push_back();
//initialize random seed to randomize snakes and ladders.
srand(time(NULL));
int index = rand() % getBoardSize() + 1;
// All tiles are set to 'N' when the array of Tiles is created.
//Creates (numSnakes value) Snake objets inside the vector Tile pointer in random indexes.
for(int i = 0; i < getNumSnakes(); i++)
{
/*
Makes sure it only replaces tiles when:
- with type = 'N'
- there is no 'S' tiles before tile 4.
- there is no 'S' (penlaty value) tiles before the end.
*/
while (index < getPenalty() || index > (getBoardSize() - getPenalty()) || place[index]->getType() != 'N')
index = rand() % boardSize + 1;
place[index] = new Snake(getPenalty());
}
index = rand() % getBoardSize() + 1;
//Creates (numLadders value) Ladder objets inside the vector Tile pointer in random indexes.
for(int i = 0; i < getNumLadders(); i++)
{
/*
Makes sure it only replaces tiles when:
- with type = 'N'.
- there is no 'L' tiles before tile 4.
- there is no 'L' (reward value) tiles before the end.
*/
while (index < getReward() || index > (getBoardSize() - getReward()) || place[index]->getType() != 'N')
index = rand() % boardSize + 1;
place[index] = new Ladder(getReward());
}
}
Board::~Board()
{
}
void Board::setBoardSize()
{
int bz;
std::cout << "Board size: ";
std::cin >> bz;
while (bz < 6);
{
std::cout << "Board size cannot be less than 6 " << std::endl << std::endl;
std::cout << "Board size: ";
std::cin >> bz;
}
boardSize = bz;
}
void Board::setNumSnakes()
{
int numS;
std::cout << "Number of Snake tiles: ";
std::cin >> numS;
if(numS >= 0)
numSnakes = numS;
else
numSnakes = -numS;
}
void Board::setNumLadders()
{
int numL;
std::cout << "Number of ladder tiles: ";
std::cin >> numL;
if(numL >= 0)
numLadders = numL;
else
numLadders = -numL;
}
void Board::setReward()
{
int rew;
std::cout << "Reward (Ladder's consequence): ";
std::cin >> rew;
while (rew == 0);
{
std::cout << "The reward cannot be zero." << std::endl << std::endl;
std::cout << "Reward (Ladder's consequence): ";
std::cin >> rew;
}
if(rew > 0)
reward = rew;
else
reward = (rew * -1);
}
void Board::setPenalty()
{
int pen;
std::cout << "Penalty (Snake's consequence): ";
std::cin >> pen;
while (pen == 0);
{
std::cout << "The penalty cannot be zero." << std::endl << std::endl;
std::cout << "Penalty (Snake's consequence): ";
std::cin >> pen;
}
if(pen < 0)
penalty = pen;
else
penalty = (penalty * -1);
}
int Board::getBoardSize()
{
return boardSize;
}
int Board::getNumSnakes()
{
return numSnakes;
}
int Board::getNumLadders()
{
return numSnakes;
}
int Board::getReward()
{
return reward;
}
int Board::getPenalty()
{
return penalty;
}
MyGame.h:
#ifndef MYGAME_H
#define MYGAME_H
class MyGame
{
protected:
int numPlayers;
int maxTurns;
public:
MyGame();
~MyGame();
void start();
void setNumPlayers(int);
void setMaxTurns(int);
int getNumPlayers();
int getMaxTurns();
};
#endif
MyGame. cpp:
#include <iostream>
#include "MyGame.h"
#include "Board.h"
MyGame::MyGame()
{
}
MyGame::~MyGame()
{
}
void MyGame::start()
{
/*
std::cout << "Number of player: ";
std::cin >> numPlayers;
std::cout << std::endl;
std::cout << "Maximum number of turns: ";
std::cin >> maxTurns;
std::cout << std::endl;
int r = setReward();
int p = setPenalty();
*/
numPlayers = 2;
maxTurns = 20;
Board brd();
//Prints Tile's type (debugging)
for(int i = 0; i < brd.getBoardSize(); i++)
std::cout << i + 1 << brd.place[i]->getType() << std::endl;
}
void MyGame::setNumPlayers(int numP)
{
if(numP > 1)
numPlayers = numP;
else
{
std::cout << "The number of players isn't enough to start." << std::endl;
numPlayers = 0;
}
}
void MyGame::setMaxTurns(int max)
{
if(max > 0)
maxTurns = max;
else
{
std::cout << "The Limit of turns has to be higger than 0" << std::endl;
maxTurns = 0;
}
}
int MyGame::getNumPlayers()
{
return numPlayers;
}
int MyGame::getMaxTurns()
{
return maxTurns;
}
main. cpp:
#include <iostream>
#include "MyGame.h"
using namespace std;
int main()
{
MyGame snakes;
snakes.start();
cin.get();
}