第五题 扑克牌对抗游戏课程设计题目

第6题  扑克牌对抗游戏
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 int Compare(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>   
//*******************************************************************
class PlayingCard    //扑克类
{
private:
    int nValue;    //扑克牌面值对应的数值
    char chSuit ;    //扑克的花(黑、红、梅、方)
public:
    PlayingCard();    //构造函数                           
    void ShowCard();    //显示扑克牌                   
    void CardMake(int,char); //生成扑克牌
锚钉
    int GetValue();//返回当前牌的面值
    char GetSuit();//返回当前牌的花
};
class Deck    //一副扑克(52张)                                       
{
private:
    PlayingCard m_cardarray[52];    //52张扑克
    int nLastDelt;  //当前可用扑克牌的位置,初值为0
public:
    friend class CardPlayer;
    Deck();    // 构造函数
    void MakeDeck();    //生成一副扑克牌
    void DealOne();    // 从整副牌中发出(删除)一张扑克牌
    void ShowDeck();    // 显示一副牌
};   
//全局子函数声明
void CenterText(char []);    // 居中显示字符串
char pause();    // 暂停,按任意键继续
PlayingCard::PlayingCard()    // 构造函数
{
        chSuit = ' ';    // 初始化为空
        nValue = 0;
}
int PlayingCard::GetValue()//返回当前牌的面值
{
    return nValue;
}
char PlayingCard::GetSuit()//返回当前牌的花
{
    return chSuit;
}
void PlayingCard::ShowCard() //显示单张扑克牌
{       
    cout<<"  ";
    switch(nValue)
    {
        case 14:cout<<"A";break;
        case 13:cout<<"K";break;
        case 12:cout<<"Q";break;
        case 11:cout<<"J";break;
        default:cout<<nValue;break;           
    }
    cout<<(char)chSuit;
    cout<<" ";   
    cout.flush();
}
void PlayingCard::CardMake(int num,char suit)//生成一张牌
{
    nValue = num;
    chSuit = suit;
}
Deck :: Deck()  //构造函数,生成一副空牌
{
    int i;
    for(i=0;i<=51;i++)
    {
        m_cardarray[i] = PlayingCard();                   
    }
    nLastDelt = 0;//当前牌的有效起始位置
}
void Deck::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++) lc谐振放大器//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;
        }
    }                                       
}
void Deck::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++;
    }
}
void Deck::DealOne()
{
    if(nLastDelt <52)        // 检查是否还有牌可以发出去
    {       
        //cout <<"被删除的牌是:";
    //    m_cardarray[nLastDelt].ShowCard();
        nLastDelt++;
    }
    else
    {
            cout << "没有牌可以了";
            cout<<"请按任意键继续……"<<endl;
            getch();
    }
}                                                                   
int main()
{
    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;                                   

本文发布于:2024-09-22 03:53:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/220515.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:玩家   扑克牌   程序   是否   显示
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议