冰之龙设计实验一21点纸牌游戏专业:软件工程班级:09软工学号:1200911041XX 姓名:XXX实验日期:2010-09-30 实验地点:B102 指导老师:吴景岚一.实验原理“21点”是一个古老的扑克牌游戏,游戏规则是:各个参与者设法使自己的牌达到总分21而不超过这个数值。
扑克牌的分值取它们的面值,A充当1分或者11分(由玩家自己选择一种分值),J.Q和K人头牌都是10分。
二.实验目的庄家对付1到7个玩家。
在一局开始时,包括庄家在内的所有参与者都有两张牌。
玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐蔽的。
接下来,只有愿意,各个玩家都有机会依次再拿一张牌。
如果某个玩家的总分超过了21(称为“引爆”),那么这个玩家就输了。
在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。
只要庄家的总分等于或小于16,那么他就必须再拿牌,如果庄家引爆了,那么还没有引爆的所有玩家都将获胜。
引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。
如果二者的总分相同,则玩家与庄家打成平局。
三.实验方法1.首先定义表示扑克牌花色与面值的枚举类型,这样程序可读性更强2.其次,方法Game()用来运行游戏,下面为用伪代码描述的整个游戏的流程:洗牌给庄家和玩家发最初的二张牌隐藏庄家的第一张牌显示庄家和玩家手中的牌依次向玩家发额外的牌显示庄家的第一张牌给庄家发额外的牌if(庄家引爆)没有引爆的玩家人赢引爆的玩家平局elsefor(每个玩家)if(玩家没有引爆且玩家的总分比庄家大) 宣布玩家赢else if(玩家的总分与庄家相等) 宣布平局else 宣布玩家赢四.实验步骤(1)建立工程game_of_21_point(2)将软件包中的utlity.h复制到game_of_21_point文件夹中,并将utility.h加入到工程中。
(3)建立头文件card.h,声明相关用户自定义类型,结构体Card 的运算符 << 进行重载,具体内容如下://文件路径名:game_of_21_point\card.h#ifndef__CARD_H__#define__CARD_H__Typedef enum{ //扑克牌面值:ACE(A),TWO(2)到TEN(10),JACK(J),QUEEN(Q),KING(K)ACK=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING} RankType;Typedef enum{ //扑克牌花色:(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑桃)CLUBS,DIAMONDS,HEARTS,SPADES} suitType;Struct card{ //扑克牌结构体RankType rank;suitType suit;};Ostream &operator<<(ostream,const card &card)//操作结果:重载<<运算符{ //输出花色if(card.suit==CLUBS) outStream<< “梅花”;else if(card.suit==DIAMONDS) outStream<<“方块”;else if(card.suit==HEARTS) outStream<<“红桃”;else if(card.suit==SPADES) outStream<<“黑桃”;//输出面值if(card.rank==ACE) outStream<<“A”;else if(card.rank==JACK) outStream<<“J”;else if(card.rank==QUEEN) outStream<<“Q”;else if(card.rank==KING) outStream<<“K”;else cout<<(int)card.rank;return outStream;}#endif(4)建立头文件game_of_21_point.h,声明及实现21点游戏类GameOf21Point.具体内容如下://文件路径名:game_of_21_point\game_of_21_point.h#ifndef__GAME_OF_21_POINT_H__#define__GAME_OF_21_POINT_H__#include“card.h”#define LEN_OF_MAX_NAME 21//21点游戏类 Gameof21point声明Class Gameof21point{ private:Card deck[52];int dealpos;card hands[8][21];int numofcard[8];char name[8][LEN_OF_MAX_NAME];int numofplayer;void shuffle();int GetTotalscore(card hand[21],int n);void showstatus(int num,bool hideFirsrcardAndTotalscore=false);card Dealonecard(){ return deck[dealpos++];}public:Gameof21Point();Virtual~GameOf21Point(){ }Void Game();};GameOf21Point::GameOf21Point(){int curPos=0;for(int suitPos=0;suitPos<4;suitPos++){ deck[curPos].suit=(suitType) suitPos;Deck[curPos].rank=(RankType) rankPos;curPos++;}}cout << “多少人加入游戏?(1~7):”;cin >> numOfPlayer;while(numOfPlayer<1 || numOfPlayer>7){cout << “人数只能在1~7之间,请重新输入人数:”;cin >>numOfPlayer;}dealPos=0;int i;for(i=0;i<numOfPlayer;i++) numOfCard[i]=0;strcpy(name[0],“庄家”);for(i=1;i<numOfPlayer;i++){ cout <<“输入第”<<i<<“位玩家的姓名:”;cin >> name[i];}cout << “游戏开始” << endl;}Void GameOf21Point::Shuffle(){Rand::SetRandSeed();for (int curPos=51;curPos>0;curpos--){int pos=Rand::GetRand(curPos+1);swap (deck[pos],deck[curPos]);}}int GameOf21Point::GetTotalScore(Card hand[21],int n) {int pos;int totalscore=0;for(pos=0;pos<n;pos++){if (hand[pos].rank==ACE totalscore+=11;else if (hand[pos].rank>TEN) totalscore+=10;else totascore+=(int)hand[pos].rank;}for(pos=0;totalscore>21&&pos<n;pos++){ if (hand[pos].rank==ACE) totalscore-=10;}return totalscore;}Void GameOf21Point::showstatus(int num,bool hideFirstcardAndTotalscore){cout << name[num] << “:”;if (hideFirstcardAndTotalscore) cout << “<隐藏>”;else cout << hands[num][0];for (int i=1;i<numOfcard[num];i++)cout << hands[num][i];for(i=1;i<numOfPlayer;i++){if(GetTotalscore(hands[i],numOfcard[i])<=21)cout << name[i] << “,恭喜你,你赢了!” <<endl;else cout << name[i] <<“,哎,你打平局了!”<<endl;}}else{for(i=1;i<=numOfPlayer;i++){ if(GetTotalscore(hand[i],numOfcard[i])<=21&&GetTotalscore(hands[i],numOfcard[i]) >GetTotalscore (hands[0],numOfcard[0]){ cout << name[i] << “,恭喜你,你赢了!” << endl;}elseif(GetTotalscore(hands[i],numOfcard[i])==GetTotalscore(hands[0],numOfcard[0]) { cout << name[i]<< “,唉,你打平局了!” << endl;}else{ cout << name[i] << “,对不起,你输了!” << endl;}}}}#endif(5)建立源程序文件 main.cpp,实现main()函数,具体代码如下:#include“utility.h”#include“game_of_21_point.h”int main(void){do{ GameOf21Point objGame;objGame.Game();if (!hideFirstcardAndTotalscore)cout << “总分值 << GetTotalscore(hands[num],numOfcard[num]);cout << endl;if (GetTotalscore(hands[num],numOfcard[num])>21)cout << name[num]<<“引爆!”<< endl;}Void GameOf21Point::Game(){Shuffle()int i,j;for(i=0;i<2;i++)hands[0][numOfcard[0]++]=DealOneCard();ShowStatus(0,ture);for(i=1;i<=numOfPlayer;i++){for(j=0;j<2;j++)hands[i][numOfcard[i]++]=DealOneCard();ShowStatus(i);}cout << endl;for(i=1;i<numOfPlayer;i++){ cout << name[i] << “,你想再要一张牌吗”;if (UserSaysYes()){ hands[i][numOfcard[i]++]=DealOneCard();ShowStatus(i);}}ShowStatus(0);While (GetTotalscore(hands[0],numOfCard[0])<=16){ hands[0][numOfCard[0]++]=DealOneCard();ShowaStatus(0);}cout << endl;if (GetTotalscore(hands[0],numOfCard[0])>21){ cout << “你想再玩一次吗”;}while (UserSaysYes());syetem(“PAUSE”);return 0;}(6)编译及运行21点游戏五.实验测试与结论测试时,屏幕显示如下:多少人加入游戏?(1~7):2输入第1位玩家的姓名:方超输入第2位玩家的姓名:赵建游戏开始庄家:<隐藏>方块7方超:梅花3 红桃2 总分值5赵建:方块9 红桃10 总分值19方超:你想再要一张牌吗(y,n)?y方超:梅花3 红桃2 黑桃k 总分值15赵建:你想再要一张牌吗(y,n)?n庄家:梅花Q 方块7 总分值17方超:对不起,你输了!赵建:恭喜你,你赢了!你想再玩一次吗(y,n)?n。