Форум программистов, компьютерный форум CyberForum.ru

Динамически создать массив - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не могу найти ошибку! http://www.cyberforum.ru/cpp-beginners/thread775826.html
Вобщем вот программа. #include <iostream.h> #include <math.h> #include <iomanip.h> #include <conio.h> int main () { const int max = 500;
C++ Выбор контейнера Есть два варианта. Первый: map <pair <int,int>, int> my_map; map <pair <int,int>, int>::iterator p; p = my_map.find(make_pair(100,150)); Второй: http://www.cyberforum.ru/cpp-beginners/thread775824.html
C++ Перегрузка операторов -> <-
Здравствуйте в столь позднее время.. Какова особеность перегрузки операторов -> и . ? Что возвращают ? Если можно ссылки на стандарт...Заранее спасибо.
C++ Объекты класса
Приветствую вас) Подскажите пожалуйста какая структура у класса и его объектов в c++bilder К примеру создание класса и 3-х объектов внутри. Мучаюсь уже сутки и не могу понять...а нормальной литературы найти не получается( Заранее спасибо!
C++ Ошибка с статическими членами класса http://www.cyberforum.ru/cpp-beginners/thread775797.html
Доброго времени суток, форумчане! Недавно пришлось вернуться с С# на С++ и я тут же заметил что я все забыл( Итак по сути: Есть определение класса: static class control { public: static double u0;
C++ Найти все простые числа вида n^(n) + 1, меньше за 10^19 Мне надо создать программу. Задание вот такое: Найти все простые числа вида nn + 1, меншье за 1019. подробнее

Показать сообщение отдельно
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
01.02.2013, 09:36     Динамически создать массив
Цитата Сообщение от eoLithic Посмотреть сообщение
Объект класса Gambler вызывает функцию getCard(). В зависимости от того сколько очков у игрока, функция выдает ему определенное количество очков. Но функция getCard() в своем теле вызывает функцию giveACard() класса KolodaKart и giveACard() должна узнавать сколько очков у объекта типа Gamber, который вызвал ее. В этом и вся проблема.
Это проблема в архитектуре. Класс отвечает за слишком многое, потому и возникают такие дилеммы. Старайтесь, чтобы класс отвечал за как можно более узкую область и при этом был как можно более универсальным.

Пример на коленке:
Три (относительно) универсальных класса для игры в очко.
Card -- карта, знает название ранков и мастей (rank & suit)
Deck -- колода, содержит карты, умеет выдавать случайную карту (drow)
Hand -- "рука" игрока, держит карты, умеет уже считать очки (value).
C++
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <cstdlib>
#include <ctime>
#include <string>
#include <iomanip>
#include <iostream>
#include <set>
#include <vector>
#include <stdexcept>
#include <algorithm>
 
class Card {
 public:
  static const std::string RANKS[];
  static const std::string SUITS[];
  static const int NUMBER_OF_CARDS_PER_SUIT = 15;
  Card(int id) : id(id) {}
  Card(int rank, int suit) : id(suit * NUMBER_OF_CARDS_PER_SUIT + rank) {}
  int getId() const { return id; }
  int getRankId() const { return id % NUMBER_OF_CARDS_PER_SUIT; }
  int getSuitId() const { return id / NUMBER_OF_CARDS_PER_SUIT; }
  const std::string &getRankName() const { return RANKS[getRankId()]; }
  const std::string &getSuitName() const { return SUITS[getSuitId()]; }
 private:
  int id;
};
 
const std::string Card::RANKS[] = {"zero", "one",
  "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
  "jack", "queen", "king", "ace"};
const std::string Card::SUITS[] = {"hearts", "diamonds", "clubs", "spades",
  "joker"};
 
std::ostream &operator<<(std::ostream &stream, const Card &card) {
  if (card.getSuitId() < 4) {
    stream << card.getRankName() << " of " << card.getSuitName();
  } else {
    stream << card.getSuitName();
  }
  return stream;
}
 
// Г*Г*äî äëÿ Г¬Г*îæåñòâГ*
bool operator<(const Card &a, const Card &b) {
  if (a.getRankId() == b.getRankId())
    return a.getSuitId() < b.getSuitId();
  return a.getRankId() < b.getRankId();
}
 
class Deck {
 public:
  Deck() : cards() {}
  Card drow() {
    if (cards.empty()) {
      throw std::underflow_error("no cards in deck");
    }
    std::set<Card>::iterator randomCardIterator = cards.begin();
    std::advance(randomCardIterator, rand() % cards.size());
    Card randomCard = *randomCardIterator;
    cards.erase(randomCardIterator);
    return randomCard;
  }
  void reset(int startRankId, int endRankId = Card::NUMBER_OF_CARDS_PER_SUIT,
    int numberOfJokers = 0) {
    cards.clear();
    for (int i = 0; i < 4; ++i) {
      for (int j = startRankId; j < endRankId; ++j) {
        cards.insert(Card(j, i));
      }
    }
    for (int i = 0; i < numberOfJokers; ++i) {
      cards.insert(Card(i, 4));
    }
  }
  bool isEmpty() const {
    return cards.empty();
  }
  int getSize() const {
    return cards.size();
  }
  friend std::ostream &operator<<(std::ostream &stream, const Deck &deck) {
    for (std::set<Card>::const_iterator i = deck.cards.begin();
      i != deck.cards.end(); ++i) {
      stream << (*i) << std::endl;
    }
    return stream;
  }
 private:
  std::set<Card> cards;
};
 
// ðóêГ* äëÿ èãðû Гў 21
class Hand {
 public:
  Hand() : cards(), value(0) {}
  // äîáГ*âëåГ*ГЁГҐ ГЄГ*ðòû Гў ðóêó Г± ïåðåñ÷åòîì î÷êîâ
  void addCard(const Card &card) {
    cards.insert(card);
    if (card.getRankId() == 13) { // Ace
      value += ((value + 11 > 21) ? 1 : 11);
    } else if (card.getRankId() < 11) { // 0 .. 10
      value += card.getRankId();
    } else { // Jack = 2, Queen = 3, King = 4
      value += card.getRankId() - 9;
    }
  }
  int getValue() const {
    return value;
  }
  void clear() {
    value = 0;
    cards.clear();
  }
 private:
  std::set<Card> cards;
  int value;
};
 
int getNumberOfAliveHands(const std::vector<Hand> &hands) {
  int numberOfPlayers = 0;
  for (int i = 0; i < hands.size(); ++i) {
    if (hands[i].getValue() <= 21) {
      ++numberOfPlayers;
    }
  }
  return numberOfPlayers;
}
 
int main(int argc, char **argv) {
  srand(time(0));
 
  // êîëîäГ*
  Deck deck;
  // ñáðîñ ГЁ Г§Г*ïîëГ*ГҐГ*ГЁГҐ êîëîäû Г§Г*Г*Г·ГҐГ*èÿìè îò 6 äî ГІГіГ§Г*
  // ÷åòûðåõ Г¬Г*Г±ГІГҐГ©
  deck.reset(6);
  
  // 4 "ðóêè" èãðîêîâ
  std::vector<Hand> hands(4);
  
  int i = 0;
  do {
    if (hands[i].getValue() < 21) {
      Card card = deck.drow();
      hands[i].addCard(card);
      std::cout << "Player " << i << " got " << card << " and now has " <<
        hands[i].getValue() << " points." << std::endl;
    }
    if (hands[i].getValue() == 21) {
      std::cout << "Player " << i << " wins." << std::endl;
      break;
    } else if (hands[i].getValue() > 21) {
      std::cout << "Player " << i << " has lost." << std::endl;
    }
    i = (i + 1) % hands.size();
  } while (getNumberOfAliveHands(hands) > 1); // óñëîâèå îêîГ*Г·Г*Г*ГЁГї Г*Г*äî ëó÷øå ïðîäóìГ*ГІГј
 
  std::cin.get();
  return 0;
}
 
Текущее время: 09:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru