C ++代码编译但不运行

时间:2016-10-16 16:31:32

标签: c++

我目前正在撰写德州扑克代码,以便更多地了解c ++和获取经验。但是我最近遇到了一个问题,我不知道该怎么做。我的代码编译得很好而没有错误但是一旦我运行它到达一个特定的函数它就停止工作(因为我从CodeBlock得到一个错误)说你的程序已停止工作)。我已经尝试在功能中切出诸如循环之类的部件,以查看哪个特定部分是问题但是在几天后我仍然停下来。 以下是我认为是问题的功能和类:

class Player{
string name;
int bank=100;
static string cards[53];
static string final_card[2][6];
static string table_cards[5];

public:
void set_name(string a){name=a;}
string print_name(){return name;}
void card_generator();
string set_cards(int c){return cards[c];}
int print_bank(){return bank;}
void set_final_card(int i, int max_i);
void print_cards(){for(int i=0;i<6;i++){cout<<final_card[0][i]<<endl;}}
};

void Player::set_final_card(int i, int max_i){
srand(time(NULL));
int tempV = 17;//create temp cards
string tempCards[tempV];
int randNB[tempV];

int check1 = 0, tmp;
while (check1==0){
    for(int g=0; g<tempV;g++){

        tempCards[g]=cards[rand()%53];
        check1=1;
        tmp = g - 1;
        for(int o=tmp; o!=0; o--){
            if (tempCards[g]==tempCards[o]){
              check1=0;
            }
        }

    }

}
int p=0,k;
while(p<6){
    k=0;
    final_card[0][k]=tempCards[p];
    k++;
    p++;
}
while(p<12){
    k=0;
    final_card[1][k]=tempCards[p];
    k++;
    p++;
}
while(p<17){
    k=0;
    table_cards[k]=tempCards[p];
    k++;
    p++;
}
}

以下是我错误的问题来源的完整代码:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <ctime>
using namespace std;

class Player{
    string name;
    int bank=100;
    static string cards[53];
    static string final_card[2][6];
    static string table_cards[5];

    public:
    void set_name(string a){name=a;}
    string print_name(){return name;}
    void card_generator();
    string set_cards(int c){return cards[c];}
    int print_bank(){return bank;}
    void set_final_card(int i, int max_i);
    void print_cards(){for(int i=0;i<6;i++){cout<<final_card[0][i]<<endl;}}
};

    string Player::cards[53];
    string Player::final_card[2][6];
    string Player::table_cards[5];

int main () {
  int choice1=0, i, max_i, tempV;
  string username;

  cout<< "Welcome to Texas Hold'Em!\n1-Play\n2-Quit\n";//menu

  while((choice1!=1)&&(choice1!=2)){//Makes sure that user enters correct input```
    cin>>choice1;
    if ((choice1!=1)&&(choice1!=2)){
        cout<<"Invalid Input!\nTry again!\n";
    }
  }
  system ("cls");
  if (choice1==2){//End Program
    return 0;
  }
  cout<<"How many players?[2-6]"<<endl;
  while((i!=2)&&(i!=3)&&(i!=4)&&(i!=5)&&(i!=6)){//Makes sure that user enters correct input
    cin>>i;
    if ((i!=2)&&(i!=3)&&(i!=4)&&(i!=5)&&(i!=6)){
        cout<<"Invalid Input!\nTry again!\n";
    }
  }
  Player player[i];//creating array of players
  player[0].card_generator();
  max_i = i;//max_i is nb of players
  i--;//since arrays start at 0
  system("cls");

  player[0].set_final_card(i,max_i);
  player[0].print_cards();

  if (choice1==1) {//SET NAMES OF ALL PLAYERS
    for(i=0; i<max_i; i++){
        cout<< "Whats your name?\n";
        cin>>username;
        player[i].set_name(username);
        cout<<"Your name is "<< player[i].print_name()<< " and you have "<<                 player[i].print_bank()<<"$\n";

        tempV=i+1;//used bc arrays start at 0
        if(tempV!=max_i){
            cout<< "Give PC to player "<< i+2 <<endl;
        }
        _sleep(3000);
        system("cls");
    }
  }

  return 0;
}

    void Player::set_final_card(int i, int max_i){
    srand(time(NULL));
    int tempV = 17;//create temp cards
    string tempCards[tempV];
    int randNB[tempV];

    int check1 = 0, tmp;
    while (check1==0){
        for(int g=0; g<tempV;g++){

            tempCards[g]=cards[rand()%53];
            check1=1;
            tmp = g - 1;
            for(int o=tmp; o!=0; o--){
                if (tempCards[g]==tempCards[o]){
                  check1=0;
                }
            }

        }

    }
    int p=0,k;
    while(p<6){
        k=0;
        final_card[0][k]=tempCards[p];
        k++;
        p++;
    }
    while(p<12){
        k=0;
        final_card[1][k]=tempCards[p];
        k++;
        p++;
    }
    while(p<17){
        k=0;
        table_cards[k]=tempCards[p];
        k++;
        p++;
    }
    }

    void Player::card_generator(){
    string card_value[13];
    card_value[0]="1";
    card_value[1]="2";
    card_value[2]="3";
    card_value[3]="4";
    card_value[4]="5";
    card_value[5]="6";
    card_value[6]="7";
    card_value[7]="8";
    card_value[8]="9";
    card_value[9]="10";
    card_value[10]="J";
    card_value[11]="Q";
    card_value[12]="K";

    string card_type[4];
    card_type[0]="of hearts";
    card_type[1]="of diamonds";
    card_type[2]="of clubs";
    card_type[3]="of spades";
    string card[53];
    int x=0;
    fill_n(card,53,0);

    for (int j=0;j<4;j++){
      for (int q=0;q<13;q++){
            card[x]=card_value[q]+" "+card_type[j];
            cards[x]=card[x];
            x++;

      }
    }
    }

如果您对代码本身有任何批评,即使没有与问题直接相关,请随时告诉我,因为我这样做是为了学习:D。提前谢谢!!

2 个答案:

答案 0 :(得分:2)

#include <iostream>
#include <string>
#include <stdlib.h>
#include <ctime>

在你做的事情上保持一致。包括<stdlib.h><ctime>看起来很奇怪。可以包含<cstdlib><ctime>,也可以包含<stdlib.h><time.h>

using namespace std;

不要这样做。此usingstd命名空间导入所有名称,这些名称有几百个。只导入您实际需要的名称,或者写入std::time而不是不合格的time。这清楚地表明您指的是标准库中的time而不是您自己定义的那个。{/ p>

class Player{
    string name;
    int bank=100;
    static string cards[53];
    static string final_card[2][6];
    static string table_cards[5];

这些卡片不应该表示为字符串,而应该表示为名为Card的单独数据类型,其中包含suitrank以及to_string方法等属性。

    public:
    void set_name(string a){name=a;}

要快速启动程序,请将a作为const std::string &而不是简单的string传递。这将防止一些数据复制。您应该为参数指定一个更好的名称,例如void set_name(const std::string &name) { this.name = name; }

    string print_name(){return name;}

此方法不会打印任何内容,因此不能将其称为print_name

    void card_generator();

方法通常用动词命名,而不是用名词命名。所以generate_cards会是一个更好的名字。但generate在这里意味着什么? (我不是母语为英语的人,但draw_cards会准确地描述它吗?)

    string set_cards(int c){return cards[c];}

名为set_*的方法通常会修改某些内容。这个没有。你为什么这么说?

    int print_bank(){return bank;}
    void set_final_card(int i, int max_i);

为参数提供更好的名称。仅阅读此声明,我不知道imax_i可能意味着什么。

    void print_cards(){for(int i=0;i<6;i++){cout<<final_card[0][i]<<endl;}}
};

    string Player::cards[53];
    string Player::final_card[2][6];
    string Player::table_cards[5];

卡片存储在Player类中看起来很奇怪,因为没有扑克玩家应该对所有52张牌都有所了解。为什么53?你的游戏中有小丑吗?这三个字段应移至class Table。这允许您拥有多个独立的表,这对于大型锦标赛来说非常好。

int main () {
  int choice1=0, i, max_i, tempV;
  string username;

  cout<< "Welcome to Texas Hold'Em!\n1-Play\n2-Quit\n";//menu

  while((choice1!=1)&&(choice1!=2)){//Makes sure that user enters correct input```

在阅读choice1变量之前,必须对其进行初始化。由于你没有这样做,你调用未定义的行为,程序之后所做的一切都是不可预测的。

    cin>>choice1;
    if ((choice1!=1)&&(choice1!=2)){
        cout<<"Invalid Input!\nTry again!\n";
    }
  }
  system ("cls");
  if (choice1==2){//End Program
    return 0;
  }
  cout<<"How many players?[2-6]"<<endl;
  while((i!=2)&&(i!=3)&&(i!=4)&&(i!=5)&&(i!=6)){//Makes sure that user enters correct input

同样在这里。用户尚未输入任何内容,那么您如何查看呢?

    cin>>i;

通过将其包含在if子句中来为每个输入添加错误处理:if (std::cin >> i) {

    if ((i!=2)&&(i!=3)&&(i!=4)&&(i!=5)&&(i!=6)){
        cout<<"Invalid Input!\nTry again!\n";
    }
  }
  Player player[i];//creating array of players

请勿使用数组,而是使用std::vector。这使您可以轻松扩展表格以拥有10名玩家。最后,您的计划中不应该只有一个6

  player[0].card_generator();
  max_i = i;//max_i is nb of players

为什么在评论中说max_i会是一个更好的名字时,会调用此变量max_players

  i--;//since arrays start at 0
  system("cls");

  player[0].set_final_card(i,max_i);
  player[0].print_cards();

  if (choice1==1) {//SET NAMES OF ALL PLAYERS
    for(i=0; i<max_i; i++){
        cout<< "Whats your name?\n";
        cin>>username;
        player[i].set_name(username);
        cout<<"Your name is "<< player[i].print_name()<< " and you have "<<                 player[i].print_bank()<<"$\n";

        tempV=i+1;//used bc arrays start at 0
        if(tempV!=max_i){

V中的tempV是什么意思?

            cout<< "Give PC to player "<< i+2 <<endl;
        }
        _sleep(3000);
        system("cls");
    }
  }

  return 0;
}

    void Player::set_final_card(int i, int max_i){
    srand(time(NULL));
    int tempV = 17;//create temp cards

这是一个神奇的数字。将它写成5 + 6 * 2会更好,因为这样可以更清晰。

    string tempCards[tempV];
    int randNB[tempV];

    int check1 = 0, tmp;
    while (check1==0){
        for(int g=0; g<tempV;g++){

            tempCards[g]=cards[rand()%53];

53这里错了。我只能错了。当您从相同概率的52张牌中进行选择时,它必须是% 52

            check1=1;
            tmp = g - 1;
            for(int o=tmp; o!=0; o--){
                if (tempCards[g]==tempCards[o]){
                  check1=0;
                }
            }
        }
    }

答案 1 :(得分:2)

长颈鹿队长在评论中回答了这个问题。如果像我这样的任何新手面临类似的问题,请查看调试器是什么,因为这些错误称为运行时错误。请查看此页面以获得简单说明:http://www.cplusplus.com/forum/articles/28767/