教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 初中教育 >

C++程序课程设计报告_21点游戏

来源:网络收集 时间:2026-03-27
导读: C++面向对象程序设计 课程设计报告 设计题目: 21点游戏 专业班级: 学生学号: 学生姓名: 指导教师: 黄旭红、蔡志明 一、 设计任务分析 1、21点游戏介绍 21点游戏是一个古老的扑克游戏,游戏的规则是:各个 参与者设法使自己的牌达到总分21而不超过这个数

C++面向对象程序设计

课程设计报告

设计题目: 21点游戏 专业班级: 学生学号: 学生姓名: 指导教师: 黄旭红、蔡志明

一、 设计任务分析

1、21点游戏介绍

21点游戏是一个古老的扑克游戏,游戏的规则是:各个 参与者设法使自己的牌达到总分21而不超过这个数值。扑克牌的分值取它们的面值,A充当1或者11分,J,Q和K人头牌都是10分。

庄家VS1~7个玩家。在开局时,包括庄家在内的所有参与者都有两张牌。玩家可以看到他们的所有牌以及总分,而庄家有一张牌暂时是隐藏的。接下来,只要愿意,各个玩家都有机会依次再拿一张牌。如果是玩家的总分超过了21(称为引爆),那么这个玩家就输了。在所有玩家都拿了额外的牌后,庄家将显示隐藏的牌。只要庄家的总分等于或小于16,那么他就必须再拿牌。如果庄家引爆了,那么还没有引爆的所有玩家都将获胜,引爆的玩家打成平局。否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于庄家的总分,则玩家获胜。如果二者的总分相同,则玩家与庄家打成平局中。

2、实现以下功能: 1) 洗牌; 2) 发牌; 3) 隐藏或显示牌; 4) 计算总分; 5) 判断胜负。

3、界面显示要求:

多少人加人游戏? (1~7):2 输入第 1 位玩家的姓名:张三 输入第 2 位玩家的姓名:李四 游戏开始

庄家:<隐藏>梅花 7

张三:红桃 7 方块 J 总分值 17 李四:红桃 J 红桃 3 总分值 13

张三,你想再要一张牌吗( y , n ) ? n 李四,你想再要一张牌吗( y , n ) ? y

李四:红桃 J 红桃 3 梅花 10 总分值 23 李四引爆!庄家:方块 10 梅花 7 总分值 17 张三,唉,你打平局了! 李四,对不起,你输了! 你想再玩一次吗( y , n ) ?

二、 21点游戏流程

三、 主要数据结构

扑克版结构体: typedef enum { N,KING

}RankType;

typedef enum { 桃)

CLUBS,DIAMONDS,HEARTS,SPADES

//扑克牌花色:CLUBS(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑//扑克牌面值:ACE(A),TWO(2)~TEN(10),JACK(J),QUEEN(Q),KING(K) ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEE

}SuitType;

struct Card {//扑克牌结构体 };

RankType rank; //扑克牌面值 SuitType suit; //扑克牌花色

四、 21点游戏类设计

五、 源代码

#include<iostream> //#include<stdlib> using namespace std; typedef enum {

//扑克牌面值:ACE(A),TWO(2)~TEN(10),JACK(J),QUEEN(Q),KING(K)

ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING }RankType; typedef enum {

//扑克牌花色:CLUBS(梅花),DIAMONDS(方块),HEARTS(红桃)和SPADES(黑桃) CLUBS,DIAMONDS,HEARTS,SPADES }SuitType; struct Card {

//扑克牌结构体

RankType rank; //扑克牌面值 SuitType suit; //扑克牌花色 };

ostream &operator<<(ostream &outStream,const Card &card) //操作结果:重载<<运算符 {

//输出花色

if(card.suit==CLUBS) outStream<<"梅花"; //CLUBS表示梅花

else if(card.suit==DIAMONDS) outStream<<"方块";//DIAMONDS表示方块 else if(card.suit==HEARTS) outStream<< "红桃"; //HEARTS表示红桃 else if(card.suit==SPADES) outStream<<"黑桃"; //SPADES表示黑桃 //输出面值

if (card.rank==ACE) outStream<<"A"; //ACE表示A

else if(card.rank==JACK) outStream<<"J"; //JACK表示J else if(card.rank==QUEEN) outStream<<"Q"; //JACK表示Q else if(card.rank==KING) outStream<<"K"; //JACK表示K else cout<<(int)card.rank; return outStream; }

#include<ctime>

#define LEN_OF_MAX_NAME 21 //最大姓名长度 using namespace std;

class GameOf21Point //21点游戏类GameOf21Point声明 {

private:

Card deck[52]; //一副扑克牌

int dealPos; //发牌位置

Card hands[8][21];//hand[0]存庄家的牌,hand[1~7]存各玩家的牌 int numOfCard[8]; //庄家(numOfCard[0])及玩家的牌数 char name[8][LEN_OF_MAX_NAME]; //庄家及玩家姓名 int numOfPlayer;

void Shuffle(); //洗牌

int GetTotalScore(Card hand[21],int n); //返回一手牌的总分值 void ShowStatus(int num,bool hideFirstCardAndTotalScore=false); //显示庄家(对应num=0)或玩家(对应num>0)的当前状态

Card DealOneCard(){return deck[dealPos++];} //发一张扑克牌 public:

//方法声明

GameOf21Point(); //无参构造函数 virtual ~GameOf21Point(){}; void Game(); };

//初始化扑克牌,发牌位置,庄家与各玩家手中的扑克牌数 GameOf21Point::GameOf21Point() {

int curPos=0; //当前扑克牌位置

char* str;

for(int suitPos=0;suitPos<4;suitPos++) //花色 {

for(int rankPos=1;rankPos<=13;rankPos++) //面值 {

deck[curPos].suit=(SuitType)suitPos; //花色 deck[curPos].rank=(RankType)rankPos; //面值 curPos++; } }

cout<<"多少人加入游戏?(1~7):"; str =new char[1]; cin>>str;

numOfPlayer=atoi(str);

while (numOfPlayer<1||numOfPlayer>7) //限制人数在1~7之间 {

cout<<"玩家人数限定在1~7个,请重新输入人数:"; cin>>str;

numOfPlayer=atoi(str); }

dealPos=0; //发牌位置 int i=0; //临时变量

//庄家numOfCard[0]及玩家numOfCard[1~7]手中的扑克牌张数 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() {

srand((unsigned)time(NULL)); //初始化随机种子 for(int curPos=51;curPos>0;curPos--) {

int pos=rand()%(curPos+1); //产生0~curPos之间的随机数 Card temp; //定义一个临时变量用于交换牌 temp=deck[pos];

deck[pos]=deck[curPos]; deck[curPos]=temp; } }

int GameOf21Point::GetTotalScore(Card hand[21],int n) {

int pos;

int totalScore=0;

for(pos=0;pos<n;pos++) //循环求最大分值(A的分值为11) {

if(hand[pos].rank==ACE)totalScore+=11; //A的分值为11

else if(hand[pos].rank>TEN)totalScore+=10; //J,Q,K的分值为10

else to …… 此处隐藏:3623字,全部文档内容请下载后查看。喜欢就下载吧 ……

C++程序课程设计报告_21点游戏.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/47006.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)