#c #function #object #call #blackjack
Вопрос:
Я делаю игру в блэкджек на c , и у меня есть функция, которая распределяет карты между игроком дома и другими игроками, эта функция получает объект, представляющий собой колоду карт, объект, являющийся игроком дома, и массив объектов, являющихся другими игроками, проблема в том, что при выходе из функции объект не содержит карт, сданных ему в функции, по сравнению с массивом объектов (других игроков), поскольку он содержит
#include <iostream>
using namespace std;
#define NumberOfPlayers 1
class Card {
public:
int CardValue;
string type;
string RoyalCard = "";
friend class Pack;
friend class Player;
friend ostreamamp; operator<<(ostreamamp; out, Card c);
};
class Pack {
public:
Card P[13][4];
bool visible[13][4];
Pack() {
for (int i = 0; i < 13; i ) {
for (int j = 0; j < 4; j ) {
visible[i][j] = true;
}
}
for (int i = 0; i < 13; i ) {
for (int j = 0; j < 4; j ) {
P[i][j].CardValue = i 1;
switch (j) {
case 0: {
P[i][j].type = "Heart";
break;
}
case 1: {
P[i][j].type = "Diamond";
break;
}
case 2: {
P[i][j].type = "Clover";
break;
}
case 3: {
P[i][j].type = "Leaf";
break;
}
}
switch (P[i][j].CardValue) {
case 1: {
P[i][j].RoyalCard = "Ace";
break;
}
case 11: {
P[i][j].CardValue = 10;
P[i][j].RoyalCard = "Prince";
break;
}
case 12: {
P[i][j].CardValue = 10;
P[i][j].RoyalCard = "Queen";
break;
}
case 13: {
P[i][j].CardValue = 10;
P[i][j].RoyalCard = "King";
break;
}
}
}
}
}
friend ostreamamp; operator<<(ostreamamp; out, Pack p);
};
class Player {
public:
string Name;
int Points = 0;
int Money = 200;
int NumberOfPlayerCards = 0;
Card PlayerCards[6];
Player() {
cout << "Enter player name: ";
cin >> Name;
cout << "n";
}
Player(string name, int money) {
Name = name;
Money = money;
}
int ChooseValueOfAce() {
int Ace;
cout << "Select the value of your Ace card: 1/11n";
do {
cin >> Ace;
}
while (Ace != 1 amp;amp; Ace != 11);
cout << "n";
return Ace;
}
friend iostreamamp; operator<<(iostreamamp; out, Player p);
};
ostreamamp; operator<<(ostreamamp; out, Card c)
{
if (c.CardValue == NULL || c.type == "") {
return cout;
}
else {
if (c.RoyalCard != "") {
cout << c.RoyalCard << " " << c.type << " ";
}
else {
cout << c.CardValue << " " << c.type << " ";
}
}
return out;
}
ostreamamp; operator<<(ostreamamp; out, Pack pack)
{
for (int i = 0; i < 13; i ) {
for (int j = 0; j < 4; j ) {
cout << pack.P[i][j] << " ";
if (pack.visible[i][j]) {
cout << "Truen";
}
else {
cout << "Falsen";
}
}
}
cout << "n";
return out;
}
ostreamamp; operator<<(ostreamamp; out, Player player) {
cout << "Name: " << player.Name << "n";
if (player.NumberOfPlayerCards > 0) {
cout << "Cards: ";
for (int i = 0; i < player.NumberOfPlayerCards; i ) {
cout << player.PlayerCards[i] << " ";
if (i == player.NumberOfPlayerCards - 1) {
cout << "n";
}
else {
cout << "n ";
}
}
}
cout << "Points: " << player.Points << "nMoney: " << player.Money << "$" << "nn";
return out;
}
Pack DividingCards(Pack pack, Player players[], Player cp) {
srand(time(0));
int chooseCardValue;
int chooseCardType;
for (int j = 0; j < 2; j ) {
chooseCardValue = rand() % 13;
chooseCardType = rand() % 4;
if (pack.visible[chooseCardValue][chooseCardType]) {
cp.PlayerCards[j] = pack.P[chooseCardValue][chooseCardType];
cp.NumberOfPlayerCards ;
pack.visible[chooseCardValue][chooseCardType] = false;
if (cp.PlayerCards[j].CardValue != 1) {
cp.Points = cp.PlayerCards[j].CardValue;
}
}
else {
j--;
}
}
for (int i = 0; i < NumberOfPlayers; i ) {
for (int j = 0; j < 2; j ) {
chooseCardValue = rand() % 13;
chooseCardType = rand() % 4;
if (pack.visible[chooseCardValue][chooseCardType]) {
players[i].PlayerCards[j] = pack.P[chooseCardValue][chooseCardType];
players[i].NumberOfPlayerCards ;
pack.visible[chooseCardValue][chooseCardType] = false;
if (players[i].PlayerCards[j].CardValue != 1) {
players[i].Points = players[i].PlayerCards[j].CardValue;
}
}
else {
j--;
}
}
}
return pack;
}
Pack TakingAnotherCard(Pack pack, Player player) {
char x = NULL;
while (x != 'Y' amp;amp; x != 'N') {
cout << "Do you want to take another card?nPress: Y/Nn";
cin >> x;
}
if (x == 'N') {
return pack;
}
else {
srand(time(0));
int chooseCardValue;
int chooseCardType;
while (1) {
chooseCardValue = rand() % 13;
chooseCardType = rand() % 4;
if (pack.visible[chooseCardValue][chooseCardType]) {
player.PlayerCards[player.NumberOfPlayerCards] = pack.P[chooseCardValue][chooseCardType];
pack.visible[chooseCardValue][chooseCardType] = false;
if (player.PlayerCards[player.NumberOfPlayerCards].CardValue != 1) {
player.Points = player.PlayerCards[player.NumberOfPlayerCards].CardValue;
}
player.NumberOfPlayerCards ;
break;
}
}
}
return pack;
}
int main() {
Player cp("CPU", 500);
Player players[NumberOfPlayers];
Pack pack;
pack = DividingCards(pack, players, cp);
cout << pack;
cout << cp;
for (int i = 0; i < NumberOfPlayers; i ) {
cout << players[i];
}
for (int i = 0; i < NumberOfPlayers; i ) {
for (int j = 0; j < players[i].NumberOfPlayerCards; j ) {
if (players[i].PlayerCards[j].CardValue == 1) {
players[i].Points = players[i].ChooseValueOfAce();
for (int i = 0; i < NumberOfPlayers; i ) {
cout << players[i];
}
}
}
}
for (int i = 0; i < NumberOfPlayers; i ) {
pack = TakingAnotherCard(pack, players[i]);
cout << players[i];
}
}
Комментарии:
1. Это много кода, который, по-видимому, не имеет отношения к проблеме. В любом случае, просто просматривая его, кажется, что вы передаете такие вещи, как «Игрок», в функцию по значению, что означает, что она будет скопирована. Если вы хотите изменить его внутри функции, вам нужно передать его по ссылке, например
Pack DividingCards(Pack pack, Player players[], Playeramp; cp)
(обратите внимание на амперсанд)2. Не могли бы вы уточнить, что именно не работает? Какой результат вы ожидаете?
srand(time(0));
как правило, следует вызывать только один раз в начале вашей программы. Повысьте уровень предупреждений компилятора и обратите на них внимание.3.
Pack TakingAnotherCard(Pack pack, Player player)
эта функция также должна использовать ссылочные параметры.
Ответ №1:
Это просто выбито на клавиатуре, но Card
это тип значения. Похоже, что вы также дублируете карты, которые находятся в колоде (у дилера), и карты игрока (видны на столе). Может быть, вы можете начать здесь:
/* This code is very incomplete
*/
class Card
{
public:
enum Type { Heart, Diamond, Clover, Leaf, NumberOfTypes };
enum Value { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Prince, Queen, King, NumberOfValues };
Card(Type t, Value v)
: m_type(t), m_value(v)
{
}
Type type() const { return m_type; }
Value value() const { return m_value; }
};
class Dealer
{
public:
/** brief Give the initial set of cards to the players
*/
void dealTo(std::vector<Player>amp; players);
/** brief Move a random card from the dealer's pack into the player's pack
*/
void giveCardTo(Playeramp; player);
private:
std::set<Card> generatePack()
{
std::set<Card> pack;
for(int type = 0; type < NumberOfTypes; type)
for(int value = 0; value < NumberOfValues; value)
pack.insert(Card((Card::Type)type, (Card::Value)value));
return pack;
}
};
class Player
{
public:
/** brief Add the card to our own pack
*/
void receive(Card card);
/** brief The points are calculated based on the current pack
*/
int points() const;
private:
std::set<Card> pack;
};
Таким образом, всегда остается только 52 карты. Чтобы дать игроку карту, вы перемещаете карту из набора, представляющего колоду дилера, в набор, представляющий руку игрока. Это также следует из инструкции «Не спрашивайте философии», потому что дилер передает карту игроку в блэкджек. Игрок не берет карту.