跪求软件大神教我大一c++课程设计(看我这么虔诚,帮帮我吧!)
  • 浏览:877 评论:0 人

  • 扑克牌对抗游戏
    2.6.1程序功能简介
    此题为一个简单的扑克牌人机对弈的程序。首先生成一副无序的扑克牌,共52张(不含大、小王)。每次给玩家和计算机各发两张牌,比较玩家和计算机牌的大小,决定胜负。
    2.6.2 课程设计要求
    1.生成一副无序的牌,共52张(不含大、小王)。其中,J、Q、K对应的数值是11,12,13,而A对应的数值是14(比K大)。玩家和计算机的牌从此副牌中发出。由于每局游戏要用掉4张牌(玩家和计算机各2张牌),52张牌只够玩13次,之后应该重新生成一副牌。
    2.每局游戏结束时应询问玩家是否继续玩牌,以决定是否进行下次游戏。
    3.玩家和计算机各有两张牌,两张牌比大小的规则如下:
    1)同花色的一对大于不同花色的一对(相同牌型则比点值)。
    2)一对大于两张散牌。
    3)散牌比大小时,先比较各自的最大牌,如果最大牌的点值不同,则立刻分出胜负,如果最大牌点值相同,再比次大牌,以此类推,最终比出大小,如果所有点值相等,则平局。
    4.在发牌前,玩家先下盲注,发牌后,玩家可根据自己的牌,决定是否继续下注。下注金额超过玩家自有赌本时,应提示玩家重新下注。
    5.选做:该程序只考虑2张牌比大小,可考虑更多牌比较大小的情况。
    2.6.3程序算法说明
    2.6.4节给出了单张扑克牌类PlayingCard和一副扑克牌类Deck。在此基础上再增加一个扑克牌玩家类CardPlayer。每个玩家有两张牌,每张牌是单张扑克牌类PlayingCard的对象。CardPlayer中还应包括玩家输、赢及平局的次数,总赌本和每牌下的赌注。CardPlayer类的设计如下,仅供参考。
    class CardPlayer
    {
    private:
    PlayingCard card[2];//每个玩家2张牌
    int nWin;//赢的次数
    int nLose;//输的次数
    int nDraw;//平局的次数
    int nBet;//赌注
    int nMoney;//总的赌本
    public:
    friend intCompare(CardPlayer&,CardPlayer&);//友元函数
    CardPlayer();//构造函数
    void GetCard(Deck&);//从整副牌中获得两张牌
    void DisplayCard();//显示玩家的牌
    void Win();//赢时修改赢的次数,收回赢的钱(是赌注的两倍,含自己的赌注在内)
    void Lose();//输时修改输的次数
    void Draw();//平局时修改平局次数,并把赌注收回
    void SetBet(int);//下赌注
    int GetBet();//获得总赌注
    void AddBet(int);//加赌注
    void Show();//显示最后结果
    int GetMoney();//返回当前钱数
    };
    为了使CardPlayer类中的成员函数void GetCard(Deck&)能访问Deck对象的私有数据,应将CardPlayer类声明为Deck类的友元类或将 GetCard函数声明为Deck类的友元函数。
    为了比较玩家和计算机的两张牌的大小,可设计一个全局函数Compare(CardPlayer& player,CardPlayer& cpu)进行大小的比较,为了能访问CardPlayer对象的私有数据,应将Compare函数声明为CardPlayer类的友元函数。
    2.6.4部分关键源代码注解
    以下程序代码仅供参考。
    /*第6题 扑克牌对抗游戏--源代码及关键源代码注解如下:*/
    #include<iostream.h>
    #include<string.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<time.h>
    //*******************************************************************
    classPlayingCard //扑克类
    {
    private:
    int nValue; //扑克牌面值对应的数值
    char chSuit ; //扑克的花色(黑、红、梅、方)
    public:
    PlayingCard(); //构造函数
    void ShowCard(); //显示扑克牌
    void CardMake(int,char); //生成扑克牌
    int GetValue();//返回当前牌的面值
    char GetSuit();//返回当前牌的花色
    };

    classDeck //一副扑克(52张)
    {
    private:
    PlayingCard m_cardarray[52]; //52张扑克
    int nLastDelt; //当前可用扑克牌的位置,初值为0
    public:
    friend class CardPlayer;
    Deck(); //构造函数
    void MakeDeck(); //生成一副扑克牌
    void DealOne(); // 从整副牌中发出(删除)一张扑克牌
    void ShowDeck(); // 显示一副牌
    };
    //全局子函数声明
    voidCenterText(char []); // 居中显示字符串
    charpause(); // 暂停,按任意键继续

    PlayingCard::PlayingCard() // 构造函数
    {
    chSuit= ' '; // 初始化为空
    nValue= 0;
    }
    intPlayingCard::GetValue()//返回当前牌的面值
    {
    return nValue;
    }
    charPlayingCard::GetSuit()//返回当前牌的花色
    {
    return chSuit;
    }
    voidPlayingCard::ShowCard() //显示单张扑克牌
    {
    cout<<" ";
    switch(nValue)
    {
    case14:cout<<"A";break;
    case13:cout<<"K";break;
    case12:cout<<"Q";break;
    case11:cout<<"J";break;
    default:cout<<nValue;break;
    }
    cout<<(char)chSuit;
    cout<<" ";
    cout.flush();
    }

    voidPlayingCard::CardMake(int num,char suit)//生成一张牌
    {
    nValue = num;
    chSuit = suit;
    }

    Deck ::Deck() //构造函数,生成一副空牌
    {
    int i;
    for(i=0;i<=51;i++)
    {
    m_cardarray= PlayingCard();
    }
    nLastDelt = 0;//当前牌的有效起始位置
    }

    voidDeck::MakeDeck() //生成一副无序的牌,相当于洗牌之后的牌
    {
    int i, j, index;
    char suit[4]={6,3,5,4};//ASCII码为6的是红桃,3黑桃,5梅花,4方块
    int flag[52]={0}; //记录52张牌的位置中哪些位置已经有牌了,1表示已经有牌了
    nLastDelt=0;
    for(i=2;i<=14;i++) //2-A共13种面值的牌,其中A的值为14,比K大
    {
    for(j=0;j<4; j++) //每个面值的牌又有4个花色
    {
    do
    {
    index= rand()%52; //生成0-51之间的随机数
    }while(flag[index]==1);//如果随机选的位置上已经有牌了,则重新选择
    m_cardarray[index].CardMake(i, suit[j] );
    flag[index]=1;
    }
    }
    }
    voidDeck::ShowDeck()
    {
    int index = nLastDelt; //从当前可用的牌开始显示,即不显示已经发出去的牌
    int newline = 0;
    // CenterText("完整的一副牌");
    cout << endl;
    while(index<=51)
    {
    if(newline% 11 == 0) cout << endl;
    m_cardarray[index].ShowCard();
    newline++;
    index++;
    }
    }
    voidDeck::DealOne()
    {
    if(nLastDelt <52) //检查是否还有牌可以发出去
    {
    //cout<<"被删除的牌是:";
    // m_cardarray[nLastDelt].ShowCard();
    nLastDelt++;
    }
    else
    {
    cout << "没有牌可以发了";
    cout<<"请按任意键继续……"<<endl;
    getch();
    }
    }
    intmain()
    {
    srand( (unsigned)time( NULL ) ); // Seeds GetRandInt
    CenterText("欢迎来到扑克牌游戏");
    cout << endl<<'\n';
    char ans;
    Deck deck_1;//定义一副牌对象
    //询问玩家是否玩牌,若是,才有以下操作,否则程序结束
    //52张牌只够玩13次,之后应该重新洗牌
    cout<<"重新洗牌……"<<endl;
    deck_1.MakeDeck(); //乱序生成一副牌
    deck_1.ShowDeck();//显示整副牌,此行为调试用,玩游戏时不能看到整副牌
    pause();//暂停,按任意键继续
    //玩家下盲注
    //给两个玩家各发两张牌
    //显示玩家的牌,询问是否加注
    //询问玩家是否要增加赌注,当下注资金超过现有资金,报错,重新下注
    //显示玩家和计算机的牌
    //比较玩家和计算机牌的大小
    //输出本次牌的比较结果
    //显示目前为止,胜、负、平局次数及玩家现有总资金数

    cout<<"\n请按任意键退出程序……"<<endl;//玩家选择不玩游戏后,结束程序
    getch();
    return 1;
    }

    charpause()
    {
    char x;
    x = cin.get();
    cout << endl;
    return x;
    }

    voidCenterText(char ShellText[80])
    {
    int length;
    int center;
    length= strlen(ShellText);
    center = (80 - length)/2;
    for(;center!=0;center--)
    {
    cputs("");
    }
    cputs(ShellText);
    }