Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349953
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:09:16

1.程序说明
    本程序完成两个功能:洗牌与对抗。两个功能分别对应两种要求。
2 。程序设计要求
   (1)增加大小王
     (2)将完成的牌平均分成4组,并完成将花色相同的牌按大小排列起来;根据牌点的大小排列起来。
    (3)4组牌可以依次删除指定的牌,如红桃5,黑桃A等,并将余牌显示,即模仿4个人依次出牌。
   (4)将双方出的牌扩大为两张,若出现一组对子,则对子牌点大于任何单牌,若双方均为对子,则比较牌点之和。
     (5)在一开始设置总赌资,根据输赢及下注的多少统计赌资,同时统计输赢的结果。
    (6)出牌时,先显示自己的牌点,然后根据自己的牌来确定是否加注,即拿到好牌时,可再继续加注。
    (7)设计程序,使高级玩家可以利用输入一键(如H键),然后输入密码来看自己的下一张牌,如不好,则可以再要,知道满意为止。
    (8)可以按任意键(如C)来查看计算机的牌,然后决定自己的赌注。
#include
#include
#include
#include
using namespace std;
void ProgramInit();                 //显示本程序信息
void DeckMakeDriver();              //完成洗牌和删除牌的功能
int GetRandInt(int min,int max);    //获得随机数
void PlayCard();

class CCard                         //扑克牌类
{
private:
char szFace[3];                 //扑克牌的数字大小
char chSuit;                    //扑克牌的花色(黑,红,梅,方)
int nNumber;                    //**返回牌面的大小(本成员数据函数用于对抗游戏)
public:
CCard();
void ShowCard();
void CardMake(int);
int GetCardNum();
};
CCard::CCard()                      //构造函数
{
int i;
for(i=1;i<3;)                    //初始化扑克牌的牌的大小(为空)                            
{
szFace[i]=' ';
i++;
}
chSuit=' ';                      //初始化牌面花色
}
int CCard::GetCardNum(){return nNumber;}//**返回牌面的大小(本成员函数用于对抗游戏)
void CCard::ShowCard()//显示牌面
{
cout<}
void CCard::CardMake(int num)
{
int i=0;
char j;
int face_num=num%13;           //每种花色13张牌
nNumber=face_num;
switch(face_num)
{
case 0: strcpy(szFace,"A");break;   //当牌面为非数字情况时
case 9: strcpy(szFace,"10");break;
case 10: strcpy(szFace,"J");break;
case 11: strcpy(szFace,"Q");break;
case 12: strcpy(szFace,"K");break;
default://牌面为数字时
j=char(face_num +49);
if(i<3)
{
szFace[i]=' '; i++;
szFace[i]=j; i++;
szFace[i]=NULL;
break;
}
}
if(num<=12)chSuit=6;
if(num>12&&num<=25)chSuit=3;
if(num>25&&num<=38)chSuit=5;
if(num>38&&num<=51)chSuit=4;
}
class CDeck                 //1副扑克牌(52张)
{
protected:
CCard CardArray[52];                //52个扑克牌对象
int nLastDelt;//最后
public:
CDeck(){}                           //构造函数
void MakeDeck();                    //生成1副扑克牌
void DealOne();                     //删除1张牌
void ShowDeck();                    //显示这1副牌
void DeckShuff(int);                //洗牌
};
void CDeck::MakeDeck()                  //产生1副牌(52)张
{
nLastDelt=51;
while(nLastDelt>-1)
{
CardArray[nLastDelt].CardMake(nLastDelt);//调用CCard类成员函数
nLastDelt--;
}
}
void CDeck::ShowDeck()                  //显示牌面
{
int nIndex=nLastDelt+1;
int newline=0;
cout< while(nIndex<=51)
{
if(newline%13==0)cout< CardArray[nIndex].ShowCard();       //显示牌面
newline++;
nIndex++;
}
}
void CDeck::DeckShuff(int times)           //洗牌次数
{
int split;                             //spilt是分开成两部分的位置,如上部分,下部分
cout<<"\n\t\t洗牌后......\n";
for(int i=0;i<=times;i++)               //每次循环洗1次牌
{
split=GetRandInt(20,35);
CDeck topdeck;                     //将分开的牌组成两副牌
CDeck bottomdeck;
int bottomdeckindex=1;
int topdeckindex=1;
for(int j=0;j<=split-1;j++)        //第1副牌赋值
{
topdeck.CardArray[topdeckindex]=this->CardArray[j];
topdeckindex++;
}
for(int k=(split);k<52;k++)         //第2副牌赋值
{
bottomdeck.CardArray[bottomdeckindex]=this->CardArray[k];
bottomdeckindex++;
}
int deckoutindex=0;
int numcardstomovetop;
int numcardstomovebottom;
bottomdeckindex=52-split;
topdeckindex=split;
while(deckoutindex<=51)
{
numcardstomovetop=GetRandInt(2,7);    //从上部分抽取的张数是2~7之间的随机数
numcardstomovebottom=GetRandInt(2,7);
for(j=0;j<=numcardstomovebottom;j++)
{
if(bottomdeckindex>0)
{//将下部分的牌还原
this->CardArray[deckoutindex]=bottomdeck.CardArray[bottomdeckindex];
deckoutindex++;
bottomdeckindex--;
}
for(int l=0;l<=numcardstomovetop;l++)
{
if((topdeckindex>0)&

--------------------next---------------------

阅读(1895) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~