1

私はC++を初めて使用するので、カードのデッキをシミュレートし、デッキからカードをランダムに引き出すことができるようにする必要があります。しかし、コーディングに問題があります。

  #include <iostream>
#include <cstdlib> //for rand and srand
#include <cstdio>
using namespace std;

string suit[] = {"Diamonds", "Hearts", "Spades", "Clubs"};
string facevalue[] = {"Two", "Three", "Four","Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "King", "Ace"};

string getcard()
{string card;
int cardvalue = rand()%12;
int cardsuit = rand()%4;
card += facevalue[cardvalue];
card += "of";
card += suit[cardsuit];
return card;
}

int main ()
{int numberofcards = 0;
for (int = 0; i < numberofcards; i++)
{cout << "You drew a" << getcard() << endl;}

}

コンパイルしようとすると、次のように表示されます。

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data

何が間違っているのかわかりません。

また、プログラムの作成方法がわからないため、1枚のカードを無限にではなく1回だけ描​​画します。

助言がありますか?

4

4 に答える 4

3

するのを忘れた

#include <string>
于 2012-11-05T20:49:47.903 に答える
2

他の回答が言っているように、ファイルの先頭に「#include」を追加して「文字列」ライブラリを含める必要があります。forループでも「i」を宣言するのを忘れました。フェイスバリュー配列に「Queen」がありません。「Queen」を追加したら、カード値の生成方法もrand()%13になるように変更する必要があります。また、同じカードを2回配らないようにするには、どのカードが配られたかを追跡し、getcard()にチェックインして、現在のカードの新しいカードを描画する必要があります。引き分け(未引き出しのカードを入手するには、複数回引き分けが必要になる場合があります)。

これがチェックを行うための迅速で簡単な方法です(私はそれを表示するためにあなたのコードを修正して修正しましたが、これはそれを行うための最良の方法ではないことを覚えておいてください):

#include <iostream>
#include <string>
#include <cstdlib> //for rand and srand
#include <cstdio>
using namespace std;

string suit[] = {"Diamonds", "Hearts", "Spades", "Clubs"};
string facevalue[] = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace"};
int numberOfCardsDrawn = 0;
string drawnCards[52];

string drawCard () {
    string card;
    int cardvalue = rand()%13;
    int cardsuit = rand()%4;
    card += facevalue[cardvalue];
    card += " of ";
    card += suit[cardsuit];
    return card;
}

bool isMyCardAlreadyDrawn (string card) {
    for(int i = 0; i < 52; i++) {
        if(card.compare(drawnCards[i]) == 0) { // if this is true, then both strings are the same
            return true;
        }
    }
    return false; // if the code reaches this point, then the card has not been drawn yet
}

string getCard () {
    string card = drawCard();
    while (isMyCardAlreadyDrawn(card) == true) { // keep drawing until an undrawn card is found
        card = drawCard(); // draw a new card
    }
    drawnCards[numberOfCardsDrawn] = card;
    numberOfCardsDrawn++;
    return card;
}

int main () {
    int numberOfCards = 52;
    for (int i = 0; i < numberOfCards; i++){
        cout << "You drew a " << getCard() << endl;
    }
}
于 2012-11-05T21:08:55.567 に答える
1
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
enum Suit{clubs,diamonds,hearts,spades};
const int jack=11;
const int queen=12;
const int king=13;
const int ace=14;
////////////////////////////////////////////////////////////////////////////////
class card
{
private:
int number;
Suit suit;
public:
card()
{}
void set(int n,Suit s)
{suit = s; number =n;}
void display();
};
//------------------------------------------------------------------------------
void card::display()

{
if(number>=2 && number<=10)
cout<<number;
else
switch(number)
{case jack: cout<<"J";break;
case queen: cout<<"Q";break;
case king: cout<<"K";break;
case ace: cout<<"A";break;
}
switch(suit)
{
case clubs:cout<< static_cast<char>(5);break;
case diamonds:cout<< static_cast<char>(4);break;
case hearts:cout<< static_cast<char>(3);break;
case spades:cout<< static_cast<char>(6);break;
}
}
////////////////////////////////////////////////////////////////////////////////
int main()  
{card deck[52];
int j;
cout<<endl;
for (j=0;j<52;j++)
{
int num=(j%13)+2;
Suit su=Suit(j/13);
deck[j].set(num,su);
}
cout<<"\nOrdered Deck: \n";
for(j=0;j<52;j++)
{
deck[j].display();
cout<<" ";
if(!((j+1)%13))
cout<<endl;
}
srand(time(NULL)); 
for(j=0;j<52;j++)
{
int k=rand()%52;
card temp= deck[j];
deck[j]=deck[k];
deck[k]=temp;
}
cout<<"\nShuffled Deck: \n";
for(j=0;j<52;j++)
{
deck[j].display();
cout<<",";
if(!((j+1)%13))
cout<<endl;
}
getch();
return 0;
}

このプログラムは、カードをシャッフルして残りを自分で行うのに役立ちます。

于 2013-08-22T06:42:05.623 に答える
1

string は C++ の組み込み型ではありません。データ型stringを使用するには、ライブラリを手動で含める必要があります。ライブラリを含めたことがないため、コンパイラはキーワード string を認識せず、string を変数名と見なします。ライブラリには以下が含まれます。

#include <string>
于 2012-11-05T20:54:18.467 に答える