【发布时间】:2021-09-03 02:38:01
【问题描述】:
我用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 ostream& operator<<(ostream& 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 ostream& operator<<(ostream& 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/11\n";
do {
cin >> Ace;
}
while (Ace != 1 && Ace != 11);
cout << "\n";
return Ace;
}
friend iostream& operator<<(iostream& out, Player p);
};
ostream& operator<<(ostream& 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;
}
ostream& operator<<(ostream& 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 << "True\n";
}
else {
cout << "False\n";
}
}
}
cout << "\n";
return out;
}
ostream& operator<<(ostream& 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 << "$" << "\n\n";
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' && x != 'N') {
cout << "Do you want to take another card?\nPress: Y/N\n";
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];
}
}
【问题讨论】:
-
很多代码似乎与问题无关。无论如何,只是略读一下,似乎您正在将诸如“播放器”之类的内容按值传递给函数,这意味着它将被复制。如果你想在函数内部修改它,你需要通过引用传递它,比如
Pack DividingCards(Pack pack, Player players[], Player& cp)(注意与号) -
您能否更具体地说明什么不起作用?您期望的输出是什么?
srand(time(0));通常只能在程序开始时调用一次。调高编译器警告级别并注意它们。 -
Pack TakingAnotherCard(Pack pack, Player player)这个函数也应该使用引用参数。
标签: c++ function object call blackjack