扑克牌游戏 设计报告.docx

上传人:b****7 文档编号:8968868 上传时间:2023-02-02 格式:DOCX 页数:22 大小:21.72KB
下载 相关 举报
扑克牌游戏 设计报告.docx_第1页
第1页 / 共22页
扑克牌游戏 设计报告.docx_第2页
第2页 / 共22页
扑克牌游戏 设计报告.docx_第3页
第3页 / 共22页
扑克牌游戏 设计报告.docx_第4页
第4页 / 共22页
扑克牌游戏 设计报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

扑克牌游戏 设计报告.docx

《扑克牌游戏 设计报告.docx》由会员分享,可在线阅读,更多相关《扑克牌游戏 设计报告.docx(22页珍藏版)》请在冰豆网上搜索。

扑克牌游戏 设计报告.docx

扑克牌游戏设计报告

VC++课程设计报告

(扑克牌游戏难度等级:

A)

程序设计者:

指导教师:

 

1.课程设计的解答说明

创建一副扑克,并完成洗牌、发牌、显示、花色排序、面值排序、删除一张牌、删除一轮牌等操作。

本程序新建了PerDeck和PlayDeck两个类,类PerDeck表示某个人拿的牌,类PlayDeck表示四个人玩牌的过程,对原程序的修改较小。

程序中用到了包含在头文件stdlib.h中的函数srand(),用来初始化随机数种子,以使每次执行程序时函数rand()产生不同的随机数,从而使程序每次产生不同的运行结果,用到了包含在头文件time.h中的函数time(),用到了包含在头文件conio.h中的函数getch()用来接收用户从键盘键入的任意键,以起到暂停程序供用户查看运行结果的作用,还用到了包含在头文件stdlib.h中的函数system(),其参数为字符串,字符串cls代表清屏操作。

2.课程设计的任务分解

为了完成要求

(1)增加大小王,须将类Deck中的成员数据m_cardarray[]由52增加到54,用来创建一副包含大小王在内54张牌的扑克,并在创建扑克时为大小王重新赋值,如果num=52,则这张牌为小王并将这张牌的花色赋为1,面值赋为S,实际面值赋为14。

如果num=53,则这张牌为大王并将这张牌的花色赋为2,面值赋为B,实际面值赋为15。

为了完成要求

(2)删去一张牌后显示余牌,需先定义intDeleteAll(int,int,int,int)、intDeleteOne(int,int)、intDelete(int)和voidPerDeck:

:

Show()、voidPlayDeck:

:

Show()函数,并在程序执行期间调用intDeleteAll(int,int,int,int)、intDeleteOne(int,int)、intDelete(int)函数后调用voidPerDeck:

:

Show()、voidPlayDeck:

:

Show()函数。

为了完成要求(3)显示一副扑克,需在原来的基础上把函数ShowDeck()改成显示54张牌,洗牌函数也应改成对54张牌进行洗牌,用函数voidPlayCard(Deck&)来给玩家发牌,并调用函数voidPerDeck:

:

Show()、voidPlayDeck:

:

Show()显示玩家牌面。

3.课程设计的新增函数

voidPerDeck:

:

MakeperDeck(Deck&,int)

函数用来给每个玩家发牌,给第一个玩家和第二个玩家发14张牌,第三和第四个玩家发13张牌,其整型参数是发给玩家牌的张数,另一个引用参数是洗好的那副牌的对象,用来给玩家发牌。

voidPerDeck:

:

Show()

函数用来显示当前玩家手中的牌。

intPerDeck:

:

Delete(int)

函数用来删除一张牌

voidPerDeck:

:

SortFace()

函数用来把玩家手中的牌进行面值排序

voidPerDeck:

:

SortSuit()

函数用来把玩家手中的牌进行花色排序

PerDeck:

:

PerDeck(){}

类PerDeck的构造函数

voidPlayDeck:

:

PlayCard(Deck&)

函数用来调用函数MakeperDeck(Deck&,int)给玩家发牌,参数为洗好的那副牌的对象的引用。

voidPlayDeck:

:

Show()

用来显示四个玩家手中的牌。

intPlayDeck:

:

DeleteAll(int,int,int,int)

用来删除一轮牌,参数分别为四个玩家的第几张牌。

intPlayDeck:

:

DeleteOne(int,int)

用来删除一张牌,参数分别为第几个玩家的第几张牌。

voidPlayDeck:

:

SortDeckFace()

完成对四个玩家手中的牌按面值排序。

voidPlayDeck:

:

SortDeckSuit()

完成对四个玩家手中的牌按花色排序。

PlayDeck:

:

PlayDeck(){}

类PlayDeck的构造函数

4.课程设计的源代码实现及详细注解

#include

#include

#include

#include

#include

#include

classPlaying_Card/*扑克牌类,表示一张扑克牌的面值、花色和与之相联系的操作*/

{

private:

intm_Value;//扑克的实际面值,用整型值表示,从1开始,1~13

charm_Face[3];/*扑克的数字大小,用字符串的形式表示,为

A,2,3,…,10,J,Q,K*/

charm_Suit;//扑克的花色(黑、红、梅、方)

public:

Playing_Card();//构造函数,初始化扑克对象,实际上是将对象清零

voidshowcard();//显示扑克牌对象的面值,花色

voidCard_Make(int);//为一张扑克牌对象赋予特定的面值和花色

friendclassPerDeck;//定义类PerDeck为类Playing_Card的友元类

};

classDeck//一副扑克(54张)类

{

private:

Playing_Cardm_cardarray[54];//一副扑克由54张扑克牌构成

intm_lastdelt;//标记这副扑克牌删除的张数

public:

Deck();/*构造函数,初始化一副扑克牌对象,实际上是将其内的

54张扑克牌清零*/

voidMakeDeck();/*生成一副扑克,即对其内的54张扑克赋予正确

的面值及花色*/

voidShowDeck();//依次逐张显示这副牌

voidDeckShuff(int);//洗牌,其参数是洗牌的次数

voidRemove_Card();/*将删除的那张扑克牌的内容清零,使这张牌在

屏幕上显示不出来*/

friendclassPerDeck;//定义类PerDeck为类Deck的友元类

};

classPerDeck

{

Playing_Cardm_Card[20];//最多有20张牌

intnNum;//实际张数

public:

PerDeck(){}

voidMakeperDeck(Deck&,int);/*对象初始化,参数为指定的那副牌

及实际赋值个数*/

voidShow();//显示

voidSortFace();//按面值排序

voidSortSuit();//按花色排序

intDelete(intn);//删除序号为n的那一张

};

voidPerDeck:

:

MakeperDeck(Deck&deck_3,intn)

{

nNum=n;//初始化当前对象的实际张数

staticinti=0;//标记为每个人发牌的其始位置

for(intk=0;k

//用创建好的那副牌为当前对象发牌

i+=nNum;//为一个人发牌后起始位置向后跳nNum个

}

voidPerDeck:

:

Show()//显示玩家的牌面

{

intj=0;

if(nNum==0)cout<<"已无牌!

"<

else

{

for(inti=0;i

{

if(j%11==0)cout<

m_Card[i].showcard();

j++;

}

}

}

intPerDeck:

:

Delete(intn)

{

if(n>=nNum)return0;//判断是否删牌

else

{

for(inti=n;i

nNum--;//删除一张牌后将实际张数减1

return1;

}

}

voidPerDeck:

:

SortFace()//按面值排序

{

Playing_Cardrecord;//产生一个临时对象

for(intj=0;j

for(inti=j+1;i

if(m_Card[j].m_Value>m_Card[i].m_Value)

{record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;}

}

voidPerDeck:

:

SortSuit()//按花色排序

{

Playing_Cardrecord;//产生一个临时对象

for(intj=0;j

for(inti=j+1;i

if(m_Card[j].m_Suit>m_Card[i].m_Suit)

{record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;}

}

classPlayDeck

{

PerDeckm_deck[4];//一共是四个人玩牌

public:

PlayDeck(){}

voidPlayCard(Deck&);//用指定的那副牌对四个人分别赋值

voidShow();//显示

intDeleteOne(introw,intcolumn);/*删除一张,参数为第row个人的第

column张牌*/

intDeleteAll(int,int,int,int);/*删除一轮,参数分别代表四个人删

除哪一张*/

voidSortDeckFace();//对整副牌面值排序

voidSortDeckSuit();//对整副牌花色排序

};

voidPlayDeck:

:

PlayCard(Deck&deck_2)//给四个人发牌

{

for(inti=0;i<2;i++)m_deck[i].MakeperDeck(deck_2,14);

//前两个人发14张牌

for(intj=2;j<4;j++)m_deck[j].MakeperDeck(deck_2,13);

//后两个人发13张牌

}

voidPlayDeck:

:

Show()//显示四个玩家的牌

{

for(inti=0;i<4;i++)

{

cout<

cout<<"玩家"<

";

m_deck[i].Show();

}

cout<

}

intPlayDeck:

:

DeleteOne(introw,intcolumn)/*删除一张,参数为第row

个人的第column张牌*/

{returnm_deck[row-1].Delete(column-1);}

intPlayDeck:

:

DeleteAll(inta,intb,intc,intd)/*删除一轮,参数分

别代表四个人各删除哪一张*/

{

returnm_deck[0].Delete(a-1)+m_deck[1].Delete(b-1)

+m_deck[2].Delete(c-1)+m_deck[3].Delete(d-1);

}

voidPlayDeck:

:

SortDeckFace()//将四个人的牌按面值排序

{

m_deck[0].SortFace();

m_deck[1].SortFace();

m_deck[2].SortFace();

m_deck[3].SortFace();

}

voidPlayDeck:

:

SortDeckSuit()//将四个人的牌按花色排序

{

m_deck[0].SortSuit();

m_deck[1].SortSuit();

m_deck[2].SortSuit();

m_deck[3].SortSuit();

}

voidProgram_Init();//程序初始化,输出初始化信息

intmain();

voidCenter_Text(char[]);/*将参数(字符串)在屏幕上显示在一行的中

间位置*/

voidGet_Key();//接收用户键入的字符

voidDeckMakeDriver();/*程序的主要算法,内部调用多个函数,包括生成

扑克牌,洗牌,删除,排序等主要操作*/

intgetRandInt(intmin,intmax);//取得在两参数间的整型随机值

voidprog_close();//暂停程序运行,供用户查看中间运行结果

intmain()

{

srand((unsigned)time(NULL));//初始化随机数种子

Program_Init();//显示程序初始化提示信息

DeckMakeDriver();//调用程序的主要算法,包含程序的主要操作过程

prog_close();//暂停程序运行,供用户查看运行结果

return1;

}

Playing_Card:

:

Playing_Card()//扑克牌对象的构造函数

{

inti;

for(i=0;i<3;)//初始化扑克牌的面值,清零

{

m_Face[i]='';

i++;

}

m_Suit='';//初始化扑克牌的花色,清零

m_Value=0;

}

voidProgram_Init()//程序一开始运行的提示信息

{

Center_Text("扑克牌游戏\n");

Center_Text("程序设计:

");

cout<

Get_Key();

}

voidGet_Key()//从键盘接收用户键入的字符

{

cout<

Center_Text("单击任意键继续...");

getch();

cout<

}

voidPlaying_Card:

:

showcard()//在屏幕上显示一张扑克牌的面值及花色

{

cout<<"";

cout<

cout.width

(1);

cout<

cout<<"";

}

voidCenter_Text(charShellText[80])/*将函数参数(字符串)在屏幕上

居中显示*/

{

intlength;

intcenter;

length=strlen(ShellText);//取得欲显示字符串的大小

center=(80-length)/2;/*整个屏幕的列数为80,取得字符串在该

行的其始位置*/

for(;center!

=0;center--)//在字符串前输出空格

{

cputs("");

}

cputs(ShellText);

}

voidPlaying_Card:

:

Card_Make(intnum)/*根据参数num生成一张扑克

牌,num不同,生成的面值或花色不同*/

{

inti=0;

charj;

intface_num=num%13;//扑克牌的面值,从0到12

if(num==52)strcpy(m_Face,"S");//大王花色赋为S

elseif(num==53)strcpy(m_Face,"B");//小王花色赋为B

else

{

switch(face_num)//当面值大于10时,用J,Q,K代替,面值为0,用A代替

{

case0:

strcpy(m_Face,"A");break;

case9:

strcpy(m_Face,"10");break;

case10:

strcpy(m_Face,"J");break;

case11:

strcpy(m_Face,"Q");break;

case12:

strcpy(m_Face,"K");break;

default:

j=char(face_num+49);//其它的面值,用对应的ASCII码表示

if(i<3)

{

m_Face[i]='';i++;

m_Face[i]=j;i++;

m_Face[i]=NULL;

break;

}

}

}

//扑克牌的花色,分别用红桃,黑桃,梅花,方块的ASCII码替代

if(num<=12)m_Suit=6;//红桃

if(num>12&&num<=25)m_Suit=3;//黑桃

if(num>25&&num<=38)m_Suit=5;//梅花

if(num>38&&num<=51)m_Suit=4;//方块

if(num==52)m_Suit=1;//小王

if(num==53)m_Suit=2;//大王

if(num==52)m_Value=14;//小王面值赋为14

elseif(num==53)m_Value=15;//大王面值赋为15

elsem_Value=face_num+1;/*A的面值实际上用1表示,其余面值

依次加1*/

}

voidDeckMakeDriver()/*主要程序操作部分,调用多个函数,完成生成一副

牌,洗牌,显示,删除等操作*/

{

Deckdeck_1;/*生成一副扑克牌对象,内有54张牌,此时所有的扑

克牌均未赋值*/

PlayDeckman;//产生一局牌

deck_1.MakeDeck();//对54张扑克牌赋值

deck_1.ShowDeck();//逐一显示这54张牌

Get_Key();//暂停运行,供用户查看显示结果

system("cls");//清屏

deck_1.DeckShuff(250);//对生成的这副牌洗牌250次

deck_1.ShowDeck();//逐一显示这洗好的54张牌

Get_Key();//暂停运行,供用户查看显示结果

system("cls");//清屏

man.PlayCard(deck_1);//发牌

intMemory=0;

for(;;)

{

man.Show();//显示四个人的牌

Center_Text("******菜单******\n");

Center_Text("*1:

删除一张牌*\n");

Center_Text("*2:

删除一轮牌*\n");

Center_Text("*3:

花色排序*\n");

Center_Text("*4:

面值排序*\n");

Center_Text("*5:

退出程序*\n");

Center_Text("****************\n");

cout<<"请选择菜单里对应功能的一个整数:

\n";

intn;

charstr[30];

aa:

cin>>n;

cin.getline(str,30);

if(strlen(str)>=1)

{

cout<<"输入错误,请重新输入:

"<

gotoaa;

}

if(!

cin)

{

charstr[30];

cin.clear();

cin.getline(str,30);

cout<<"输入错误,请重新输入:

"<

gotoaa;

}

switch(n)//判断执行的操作

{

case1:

//执行删除一张牌的操作

inta,b;

charstr[30];

bb:

cout<<"请输入删除第几个人的第几张牌"<

cin>>a>>b;

cin.getline(str,30);

if(strlen(str)>=2)

{

cout<<"输入错误,请重新输入:

"<

gotobb;

}

while(!

cin)

{

charstr[30];

cin.clear();

cin.getline(str,30);

cout<<"输入错误,请重新输入:

"<

gotobb;

}

Memory+=man.DeleteOne(a,b);

break;

case2:

//执行删除一轮牌的操作

intc,d,e,f;

charstr1[30];

cc:

cout<<"请依次输入删除四个人的第几张牌"<

cin>>c>>d>>e>>f;

cin.getline(str1,30);

if(strlen(str1)>=2)

{

cout<<"输入错误,请重新输入:

"<

gotocc;

}

while(!

cin)

{

charstr[30];

cin.clear();

cin.getline(str,30);

cout<<"输入错误,请重新输入:

"<

gotocc;

}

Memory+=man.DeleteAll(c,d,e,f);

break;

case3:

man.SortDeckSuit();//执行按花色排序

break;

case

4:

man.SortDeckFace();//执行按面值排序

break;

case5:

exit(0);//执行退出程序

default:

cout<<"输入错误,请重新输入:

"<

gotoaa;

}

system("cls");//清屏

if(Memory==54)break;//判断循环结束条件

}

cout<

}

voidDeck:

:

Mak

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1