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;
}
报错内容:
求帮助!