1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
#pragma once
#include "places.h"
#include "dice.h"
#include "cards.h"
#include <vector>
#include <initializer_list>
#include <iostream>
#include <tuple>
// Represents the Monopoly board
class Board {
std::vector<Places> places { // Specifies the details of each place on the board
{Go, new cGo},
{OldKentRoad, new cProp(2, 10, 30, 90, 160, 250, 60, 50, 50, 30), {WhitechapelRoad}},
{CommunityChest1, new cComm},
{WhitechapelRoad,new cProp(4, 20, 60, 180, 320, 450, 60, 50, 50, 30), {OldKentRoad}},
{IncomeTax, new cTax(200)},
{KingscrossStation, new cStation(25, 50, 100, 200, 200, 100), {MaryleboneStation, FenchurchStreetStation, LiverpoolStreetStation}},
{TheAngelIslington, new cProp(6, 30, 90, 270, 400, 550, 100, 50, 50, 50), {EustonRoad, PentovilleRoad}},
{Chance1, new cChance},
{EustonRoad, new cProp(6, 30, 90, 270, 400, 550, 100, 50, 50, 50), {TheAngelIslington, PentovilleRoad}},
{PentovilleRoad, new cProp(8, 40, 100, 300, 450, 600, 100, 50, 50, 60), {TheAngelIslington, EustonRoad}},
{Jail, new cJail},
{PallMall, new cProp(10, 50, 150, 450, 625, 750, 140, 100, 100, 70)},
{ElecticCompany, new cUtility(150, 75)},
{Whitehall, new cProp(10, 50, 150, 450, 625, 750, 140, 100, 100, 70)},
{NorthumberlandAvenue, new cProp(12, 60, 180, 500, 700, 900, 160, 100, 100, 80)},
{MaryleboneStation, new cStation(25, 50, 100, 200, 200, 100)},
{BowStreet, new cProp(14, 70, 200, 550, 750, 950, 180, 100, 100, 90)},
{CommunityChest2, new cComm},
{MarlboroughStreet, new cProp(14, 70, 200, 550, 750, 950, 180, 100, 100, 90)},
{VineStreet, new cProp(16, 80, 220, 600, 800, 1000, 200, 100, 100, 100)},
{Freeparking, new cParking},
{Strand, new cProp(18, 90, 250, 700, 875, 1050, 220, 150, 150, 110)},
{Chance2, new cChance},
{FleetStreet, new cProp(18, 90, 250, 700, 875, 1050, 220, 150, 150, 110)},
{TrafalgarSquare, new cProp(20, 100, 300, 750, 925, 1100, 240, 150, 150, 120)},
{FenchurchStreetStation, new cStation(25, 50, 100, 200, 200, 100)},
{LeicesterSquare, new cProp(22, 110, 330, 800, 975, 1150, 260, 150, 150, 130)},
{CoventryStreet, new cProp(22, 110, 330, 800, 975, 1150, 260, 150, 150, 130)},
{WaterWorks, new cUtility(150, 75)},
{Picadilly, new cProp(22, 120, 360, 850, 1025, 1200, 280, 150, 150, 140)},
{GoToJail, new cGoJail},
{RegentSreet, new cProp(26, 130, 390, 900, 1100, 1275, 300, 200, 200, 150)},
{OxfordStreet, new cProp(26, 130, 390, 900, 1100, 1275, 300, 200, 200, 150)},
{CommunityChest3, new cComm},
{BondStreet, new cProp(28, 150, 450, 1000, 1200, 1400, 320, 200, 200, 160)},
{LiverpoolStreetStation, new cStation(25, 50, 100, 200, 200, 100)},
{Chance3, new cChance},
{ParkLane, new cProp(35, 175, 500, 1100, 1300, 1500, 350, 200, 200, 175)},
{SuperTax, new cTax(100)},
{Mayfair, new cProp(50, 200, 600, 1400, 1700, 2000, 400, 200, 200, 200)}
};
cDice dic; // Dice to use
cCards community { CCBegin, CCEnd }; // Community cards
cCards chance { CBegin, CEnd }; // Chance cards
public:
Board() {
// Set pointer for each place to Board class
for (auto& p : places)
p.setBoard(this);
}
~Board() {
for (auto& p : places)
delete p.getPlaceC();
}
// Can't copy or assign Board class
Board(const Board&) = delete;
Board& operator=(const Board&) = delete;
// Number of board elements
unsigned size() const noexcept {
return unsigned(places.size());
}
// Display the board
void display() noexcept {
for (auto& b : places) {
for (const auto& ps : b.getPlayers())
std::cout << sNames[ps] << " ";
b.getPlaceC()->display(b);
std::cout << '\n';
}
std::cout << '\n';
}
// Get specified place
Places& getPlace(unsigned pos) noexcept {
return places[pos];
}
// Shake the dice
Dice shake() noexcept {
return dic.shake();
}
// Release owned places
void release(Symbols owner) {
for (auto& b : places)
if (b.getOwner() == owner)
b.setOwner(None);
}
// Get community
cCards& getComm() {
return community;
}
// Get chance
cCards getChance() {
return chance;
}
};
// Return info re player, board, places
inline auto getPBP(Players& pls) {
auto& p { pls.getCurr() }; // Player
auto& board { pls.getBoard() }; // Board
auto& plc { board.getPlace(p.position) }; // Places
return std::tuple<decltype(p), decltype(board), decltype(plc)> {p, board, plc};
}
// Return info re player, places
inline auto getPP(Board& brd, Players& pls) {
auto& p { pls.getCurr() }; // Player
auto& plc { brd.getPlace(p.position) }; // Places
return std::tuple<decltype(p), decltype(plc)> {p, plc};
}
|