1、纸牌游戏21点实验设计报告湖北第二师范学院面向对象程序设计课程设计报告书 题 目: 纸牌游戏“21点” 院 系: 计算机学院 专 业: 网络工程 姓 名: 李林 学 号: 0850311013 同组人员: 陈易俊 、吴鑫、易龙、张帅 指导老师: 张琪 设计时间: 2011年2月26日2011年3月19日目 录一 课程设计目的 3二 问题描述 3三 需求分析 4四概要设计 54.1系统中类类型定义及系统各类类成员功能说明 54.2 系统各类间关系 6五详细设计 75.1 数据类型定义及伪代码描述 75.2系统主要子程序详细设计(加注释的源程序) 8六 测试分析 19七技术难点及创新 19八 自己
2、完成模块说明 23九 源程序清单 231课程设计目的 在Visual C+6.0或者C+ Builder 6.0环境中编译运行纸牌游戏“21点”,通过编程练习、程序调试、程序纠错等过程训练,真正掌握所学知识、提高编程水平。2问题描述 “21点”是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),J.Q和K人头牌都是10分。 庄家对付1到7个玩家。在一局开始时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐蔽的。接下来,只有愿意,各个玩家都
3、有机会依次再拿一张牌。如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌,如果庄家引爆了,那么还没有引爆的所有玩家都将获胜。引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局。(1)将所有的函数与相应的数据封装到类中,并改写主程序,使程序简化。 (2)序中一共有13张扑克牌可以随机抽取,大于10的点数为10,A根据情况点数不同,当前点数小于11时为11点,大于10时则为1点。(3)要求庄
4、家永远不会暴庄,即庄家可以查看下一张牌,若大于21点,则拒绝,当然,在游戏规则上不能泄露这点秘密。(4)将界面的提示说明全部设计为中文界面,界面的解释详细友好,可以吸引更多的玩家。3需求分析 设计程序的的主要目的是编写程序模拟游戏。游戏为纸牌游戏“21点,”也叫Black Jack即黑杰克,该游戏适用于手机,也是网上比较流行的小游戏之一。游戏以计算机作为庄家,17个人作为普通玩家参与游戏。可用字符代表扑克牌面值(A,2,3,4,5,6,7,8,9,10,J,Q,K)和花色(梅花C,方块D,红心H,黑桃S), 模拟实质扑克进行游戏。方便大众在空闲时一个人就可以达到多人娱乐的效果!四概要设计4.1
5、系统中类类型定义及系统各类类成员功能说明“21点游戏”程序中的类类基类说明Card无一张扑克牌 Hand 无 一手牌,Card对象集合 Deck Hand一副牌它具有Hand所不具备的额外功能,如洗牌和发牌 GenericPalayer Hand一个抽象玩家,具有庄家和玩家的共同元素PlayerGenericPalayer普通玩家HouseGenericPalayer庄家Game无一个游戏4.2 系统各类间关系Card类成员说明rank m-Rank牌的面值。Rank是13个面值等级的枚举suit m-Suit牌的花色。Suit是4花色的枚举bool m-IsFace标示牌是否正面朝上的状态,
6、正面朝上为true,否则falseint GetVable()返回牌面值所对应的分值Hand类成员说明vectorm-Cards牌面向量,存储指向Card对象指针void Add(Card*pCard)向手中添加一张牌,即将一个指向Card的指针添加到向量m-Cards中void Clear()清除手中所有牌,即 删除向量m-Card中的所有指针删除所有动态创建Card对象int GetTotal()const返回这首派总值GenericPalayer类(抽象类)成员说明sring m-Name通用玩家的名字vrtual bool IsHitting()const=0指出通用玩家是否想要另一张
7、牌,纯属函数bool IsBusted()const指出通用玩家是否引爆void Bust()const宣布通用玩家引爆Player类成员说明vrtual bool IsHitting()const指出玩家是否想要另一张牌 void Win()const宣布玩家获胜void Lose()const宣布玩家失败void Push()const宣布玩家获得平局House类成员说明vrtual bool IsHitting()const指出玩家是否再拿一张牌Deck类成员说明void Populate() 创建一共52张的标准扑克牌void Shuffle()洗牌void Deal(Hand&Han
8、d)将一张牌发到一手中void AdditionalCards(GenericPalayer&GenericPalayer)只要通用玩家可以并且想要另一张牌,则在给他发一张牌Game类成员说明Deck m-Deck一副牌House m-House 庄家vectorm-Player普通玩家的集合,Player对象的一个向量void Play()玩一局游戏五详细设计5.1 数据类型定义及伪代码描述 1.首先定义表示扑克牌花色与面值的枚举类型,这样程序可读性更强 2.其次,方法Game()用来运行游戏,下面为用伪代码描述的整个游戏的流程:洗牌给庄家和玩家发最初的二张牌隐藏庄家的第一张牌显示庄家和玩家
9、手中的牌依次向玩家发额外的牌显示庄家的第一张牌给庄家发额外的牌if(庄家引爆) 没有引爆的玩家人赢 引爆的玩家平局else for(每个玩家) if(玩家没有引爆且玩家的总分比庄家大) 宣布玩家赢 else if(玩家的总分与庄家相等) 宣布平局 else 宣布玩家赢5.2系统主要子程序详细设计(加注释的源程序)(1) 新建头文件Card.h,为一张单独的扑克牌定义Card类。#ifndef _Card_h_#define _Card_h_#includeusing namespace std;class Cardpublic:enum rankACE=1,TWO,THREE,FOUR,FIV
10、E,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING;enum suitCLUBS,DIAMONDS,HEARTS,SPADES;Card(rank r=ACE,suit s=SPADES,bool ifu=true);/friend ostream& operator10)value=10;return value;void Card:Flip()m_IsFaceUp=!(m_IsFaceUp);(3) 新建头文件Hand.h,为纸牌的集合定义Hand类。#ifndef _Hand_h_#define _Hand_h_#includeCard.h#includ
11、eusing namespace std;class Handpublic:Hand();virtual Hand();void Add(Card* pCard);void Clear();int GetTotal() const;public: vectorm_Cards;#endif(4) 新建Cpp文件Hand.cpp,实现Hand类。#include Hand.hHand:Hand()m_Cards.reserve(7);Hand:Hand()Clear();void Hand:Add(Card* pCard)m_Cards.push_back(pCard);void Hand:Cle
12、ar()vector: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() constif(m_Cards.empty() return 0;if(m_Cards0-GetValue()=0)return 0;int total=0;vector:const_iterator iter;for(iter=m_Cards.begin();iter!=m_Cards.end();
13、+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&total=11)total+=10;return total;(5) 新建头文件GenericPlayer.h,为通用玩家定义抽象的GenericPlayer类。#ifndef _GenericPlayer_h_#define _GenericPlayer_h_
14、#include Hand.h#includeusing namespace std;class GenericPlayer:public Hand public: friend ostream &operator21);void GenericPlayer:Bust()const coutm_Name引爆! n;(7) 新建头文件PlayerHouse.h,从GenericPlayer类派生Player类和House类。#ifndef PlayerHouse_h#define PlayerHouse_h#includeGenericPlayer.h #includeusing namespa
15、ce std;class Player:public GenericPlayerpublic:Player(const string& name= );virtual Player();virtual bool IsHitting()const;void Win()const;void Lose()const;void Push()const;class House:public GenericPlayerpublic:House(const string& name=庄家);virtual House();virtual bool IsHitting()const;void FlipFirs
16、tCard();#endif(8) 新建cpp文件PlayerHouse.cpp,实现Player类和House类的成员函数。#includePlayerHouse.hPlayer:Player(const string& name):GenericPlayer(name)Player:Player()bool Player:IsHitting()constcoutm_Nameresponse;return(response=y|response=Y);void Player:Win()constcoutm_Name,恭喜你,你赢了!n;void Player:Lose()constcoutm
17、_Name,很遗憾,你输了!n;void Player:Push()constcoutm_Name,平局,加油!n;House:House(const string& name):GenericPlayer(name)House:House()bool House:IsHitting()constreturn (GetTotal()Flip();else cout没有扑克牌翻动!n;(9) 新建头文件Deck.h,从Hand类派生Deck类,表示一副牌。#ifndef Deck_h#define Deck_h#includeHand.h#includeGenericPlayer.h#inclu
18、deusing namespace std;class Deck:public Handpublic:Deck();virtualDeck();void Populate();void Shuffle();void Deal(Hand& aHand);void AdditionalCards(GenericPlayer& aGenericPlayer);#endif(10) 新建cpp文件Deck.cpp,实现Deck类的成员函数。#includeDeck.h#includeDeck:Deck()m_Cards.reserve(52);Populate();Deck:Deck()void De
19、ck:Populate()Clear();for(int s=Card:CLUBS;s=Card:SPADES;+s)for(int r=Card:ACE;r=Card:KING;+r)Add(new Card(static_cast(r),static_cast(s);void Deck:Shuffle()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();elsecoutOu
20、t of cards.Unable to deal.;void Deck:AdditionalCards(GenericPlayer& aGenericPlayer)coutendl;while(!(aGenericPlayer.IsBusted()&aGenericPlayer.IsHitting()Deal(aGenericPlayer);coutaGenericPlayerendl;if(aGenericPlayer.IsBusted() aGenericPlayer.Bust(); (11) 新建头文件Game.h定义Game类表示21点游戏。#ifndef _Game_h_#defi
21、ne _Game_h_#includeDeck.h#includePlayerHouse.h#include#include#includeusing namespace std;class Gamepublic:Game(const vector&names);Game();void Play();private: Deck m_Deck;House m_House;vectorm_Players;#endif(12) 新建cpp文件Game.cpp,实现Game类的成员函数。#includeGame.h#include#includeusing namespace std;Game:Gam
22、e(const vector& names) vector:const_iterator pName;for(pName=names.begin();pName!=names.end();+pName)m_Players.push_back(Player(*pName);srand(time(0);m_Deck.Populate();m_Deck.Shuffle(); Game:Game() void Game:Play() /将最初的两张牌发给每一个人 vector:iterator pPlayer; for(int i=0;i2;+i) for(pPlayer=m_Players.begi
23、n();pPlayer!=m_Players.end();+pPlayer) m_Deck.Deal(*pPlayer); m_Deck.Deal(m_House); /隐藏庄家的第一张牌 m_House.FlipFirstCard(); /显示每个人的一张牌 for(pPlayer=m_Players.begin();pPlayer!=m_Players.end();+pPlayer) cout*pPlayerendl; coutm_Houseendl; /向玩家发额外的牌 for(pPlayer=m_Players.begin();pPlayer!=m_Players.end();+pPl
24、ayer) m_Deck.AdditionalCards(*pPlayer); /显示庄家的第一张牌 m_House.FlipFirstCard(); coutendlIsBusted() pPlayer-Win(); else /将仍然在玩的各个玩家与庄家做比较 for(pPlayer=m_Players.begin();pPlayer!=m_Players.end();+pPlayer) if(!(pPlayer-IsBusted() if(pPlayer-GetTotal()m_House.GetTotal() pPlayer-Win(); else if(pPlayer-GetTotal()Lose(); else pPlayer-Push(); /删除每个人的牌 for(pPlayer=m_Players.begin();pPlayer!=m_Players.end();+pPlayer) pPlayer-Clear(); m_House.Clear(); (13) 新建cpp文件Main.cpp编写游戏程序的主函数,并实现重载的operator()函数.#includeGame.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1