yys365 2022-07-24 19:19 采纳率: 80%
浏览 34
已结题

程序发生错误,Dev-C++,非VS Code!

2022年7月,我在Dev-C++6.3-Beta2上编了一个Blackjack,原来的代码在《C++游戏:编程入门(第4版) - [美]Michael Dowson》第300页。可是我只换了函数的顺序就出错了。我的代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <windows.h>
#include <ostream>
#include <bits/stdc++.h>
#include <time.h>
using namespace std;
//类区 
class Card
{
    public:
        enum rank{ACE=1,TWO,THREE,FOUR,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING};
        enum suit{CLUBS,DIAMONDS,HEARTS,SPADES};
        friend ostream& operator<<(ostream& os,const Card& aCard);
        Card(rank r=ACE,suit s=SPADES,bool ifu=true);
        int GetValue() const;
        void Flip();
    private:
        rank m_Rank;
        suit m_Suit;
        bool m_IsFaceUp;
};
class Hand
{
    public:
        Hand();
        virtual ~Hand();
        void Add(Card* pCard);
        void Clear();
        int GetTotal() const;
    protected:
        vector<Card*>m_Cards;
};
class GenericPlayer:public Hand{
    friend ostream& operator<<(ostream& os,const GenericPlayer& aGenericPlayer);
    public:
        GenericPlayer(const string& name="");
        virtual ~GenericPlayer();
        virtual bool IsHitting()const=0;
        bool IsBusted()const;
        void Bust()const;
    protected:
        string m_name;
};
class Player:public GenericPlayer{
    public:
        Player(const string& name="");
        virtual ~Player();
        virtual bool IsHitting()const;
        void win()const;
        void lose()const;
        void push()const;
};
class House:public GenericPlayer{
    public:
        House(const string& name="House");
        virtual ~House();
        virtual bool IsHitting()const;
        void FlipFirstCard();
};
class Deck:public Hand{
    public:
        Deck();
        virtual ~Deck();
        void Pop();
        void Shuff();
        void Deal(Hand& aHand);
        void AdditionCards(GenericPlayer& aGenericPlayer);
};
class Game{
    public:
        Game(const vector<string>& names);
        ~Game();
        void Play();
    private:
        Deck m_Deck;
        House m_House;
        vector<Player> m_Players;
};
//Card代码区 
Card::Card(rank r,suit s,bool ifu):m_Rank(r),m_Suit(s),m_IsFaceUp(ifu)
{}
int Card::GetValue() const{
    int value=0;
    if(m_IsFaceUp){
        value=m_Rank;
        if(value>10){
            value=10;
        }
    }
    return value;
}
void Card::Flip(){
    m_IsFaceUp=!(m_IsFaceUp);
}
//Hand代码区 
Hand::Hand(){
    m_Cards.reserve(7);
}
Hand::~Hand(){
    Clear();
}
void Hand::Add(Card* pCard){
    m_Cards.push_back(pCard);
}
void Hand::Clear(){
    vector<Card*>::iterator iter=m_Cards.begin();
    for(iter=m_Cards.begin();iter!=m_Cards.end();++iter){
        delete *iter;
        *iter=0;
    }
    m_Cards.clear();
}
int Hand::GetTotal()const{
    if(m_Cards.empty()){
        return 0;
    }
    if(m_Cards[0]->GetValue()==0){
        return 0;
    }
    int total=0;
    vector<Card*>::const_iterator iter;
    for(iter=m_Cards.begin();iter!=m_Cards.end();++iter){
        total+=(*iter)->GetValue();
    }
    bool containsAce=false;
    for(iter=m_Cards.begin();iter!=m_Cards.end();++iter){
        if((*iter)->GetValue()==Card::ACE){
            containsAce=true;
        }
    }
    if(containsAce and total<=11){
        total+=10;
    }
    return total;
}
//GenericPlayer代码区
GenericPlayer::GenericPlayer(const string& name):
    m_name(name)
{}
GenericPlayer::~GenericPlayer()
{}
bool GenericPlayer::IsBusted()const{
    return (GetTotal()>21);
}
void GenericPlayer::Bust()const{
    cout<<m_name<<"降级了\n";
}
//Player代码区
Player::Player(const string& name):
    GenericPlayer(name)
{}
Player::~Player()
{}
bool Player::IsHitting()const{
    cout<<m_name<<",你想攻击吗?(y/n):";
    char resP;
    cin>>resP;
    return (resP=='y' or resP=='Y'); 
}
void Player::win()const{
    cout<<m_name<<"赢了\n";
}
void Player::lose()const{
    cout<<m_name<<"输了\n";
}
void Player::push()const{
    cout<<m_name<<"打平\n";
}
//House代码区
House::House(const string& name):
    GenericPlayer(name)
{}
House::~House()
{}
bool House::IsHitting()const{
    return (GetTotal()<=16);
}
void House::FlipFirstCard(){
    if(!(m_Cards.empty())){
        m_Cards[0]->Flip();
    }else{
        cout<<"没有牌需要翻!\n";
    }
}
//Deck代码区
Deck::Deck(){
    m_Cards.reserve(52);
    Pop();
}
Deck::~Deck()
{}
void Deck::Pop(){
    Clear();
    for(int s=Card::CLUBS;s<=Card::SPADES;++s){
        for(int r=Card::ACE;r<=Card::ACE;++r){
            Add(new Card(static_cast<Card::rank>(r),static_cast<Card::suit>(s)));
        }
    }
}
void Deck::Shuff(){
    random_shuffle(m_Cards.begin(),m_Cards.end());
}
void Deck::Deal(Hand& aHand){
    if(!m_Cards.empty()){
        aHand.Add(m_Cards.back());
        m_Cards.pop_back();
    }else{
        cout<<"没牌了,无法成交\n";
    }
}
void Deck::AdditionCards(GenericPlayer& aGenericPlayer){
    cout<<"\n";
    while(!(aGenericPlayer.IsBusted()) and aGenericPlayer.IsHitting()){
        Deal(aGenericPlayer);
        cout<<aGenericPlayer<<endl;
        if(aGenericPlayer.IsBusted()){
            aGenericPlayer.Bust();
        }
    }
}
//Game代码区
Game::Game(const vector<string>& names){
    vector<string>::const_iterator pName;
    for(pName=names.begin();pName!=names.end();++pName){
        m_Players.push_back(Player(*pName));
    }
    srand(static_cast<unsigned int>(time(0)));
    m_Deck.Pop();
    m_Deck.Shuff();
}
Game::~Game()
{}
void Game::Play(){
    vector<Player>::iterator pPl;
    for(int i=0;i<2;++i){
        for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
            m_Deck.Deal(*pPl);
        }
        m_Deck.Deal(m_House);
    }
    m_House.FlipFirstCard();
    for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
            cout<<*pPl<<"\n";
    }
    cout<<m_House;
    for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
        m_Deck.AdditionCards(*pPl);
    }
    m_House.FlipFirstCard();
    cout<<endl<<m_House;
    m_Deck.AdditionCards(m_House);
    if(m_House.IsBusted()){
        for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
            if(!(pPl->IsBusted())){
                pPl->win();
            }
        }
    }else{
        for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
            if(!(pPl->IsBusted())){
                if(pPl->GetTotal()>m_House.GetTotal()){
                    pPl->win();
                }else if(pPl->GetTotal()<m_House.GetTotal()){
                    pPl->lose();
                }else{
                    pPl->push();
                }
            }
        }
    }
    for(pPl=m_Players.begin();pPl!=m_Players.end();++pPl){
        pPl->Clear();
    }
    m_House.Clear();
}
//main主程序
ostream& operator<<(ostream& os,const Card& aCard);
ostream& operator<<(ostream& os,const GenericPlayer& aGenericPlayer);
int main(){
    cout<<"打牌\nVersion 1.16.5";
    Sleep(3000);
    system("cls");
    cout<<"\t\t欢迎来到打牌游戏!\n\n";
    int numP=0;
    while(numP<1 or numP>7){
        cout<<"有多少玩家?(1-7)";
        cin>>numP;
    }
    vector<string> names;
    string name;
    for(int i=0;i<numP;++i){
        cout<<"输入玩家名称:";
        cin>>name;
        names.push_back(name);
    }
    cout<<"\n";
    Game aGame(names);
    char ag='y';
    while(ag!='n' and ag!='N' and ag!='c' and ag!='C'){
        aGame.Play();
        cout<<"\n按\"c\"查看源代码\n你想重玩吗?(y/n/c):";
        cin>>ag;
    }
    if(ag=='c'){
        //system("start http://");
    }
    return 0;
}

报错内容:

img

求帮助!

  • 写回答

1条回答 默认 最新

  • 亖夕 Python领域新星创作者 2022-07-24 19:46
    关注

    换了函数顺序就报错,可能的原因是某个函数没有初始化就使用。
    比如当函数func1在main函数前定义时main函数可以直接调用的,但是当func1在main后定义那么main不初始化就调用fun1就会报错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月3日
  • 已采纳回答 7月28日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置