扑克牌生成与洗牌程序.docx
《扑克牌生成与洗牌程序.docx》由会员分享,可在线阅读,更多相关《扑克牌生成与洗牌程序.docx(20页珍藏版)》请在冰豆网上搜索。
![扑克牌生成与洗牌程序.docx](https://file1.bdocx.com/fileroot1/2022-12/7/3d1767f4-70db-4a01-88ec-06ce587ab009/3d1767f4-70db-4a01-88ec-06ce587ab0091.gif)
扑克牌生成与洗牌程序
扑克牌生成与洗牌程序
使用JAVA编写以下程序:
1、请定义一个名为Card的扑克牌类,该类有两个private访问权限的字符串变量face和suit;分别描述一张牌的牌面值(如:
A、K、Q、J、10、9、……3、2等)和花色(如:
“黑桃”、“红桃”、“梅花”、“方块”);定义Card类中的public访问权限的构造方法,为类中的变量赋值;定义protected访问权限的方法getFace(),得到扑克牌的牌面值;定义protected访问权限的方法getSuit(),得到扑克牌的花色;定义方法toString(),返回表示扑克牌的花色和牌面值字符串(如“红桃A”、“梅花10”等)。
2、若应用程序的main方法中,定义字符串数组f和s;分别表示扑克牌的牌面值和花色;定义52个元素的Card类型数组deck,用来存放4个花色的52张牌。
如下所示。
Stringf[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
Strings[]={"黑桃","红桃","梅花","方块"};
Carddeck=newCard[52];
(1)使用Card类的构造方法给deck数组的52张牌赋值,要求数组中先存放黑桃花色的A、2、3、……、K;然后是红桃花色的A、2、3、……、K;梅花花色的A、2、3、……、K;方块花色的A、2、3、……、K。
请写出实现上述功能的程序段。
(2)请编写模拟洗牌的完整程序,即把数组deck中的扑克牌随机打乱存放顺序。
原题如下:
引用内容
privateStringface;//A,K,Q,J,10,...2
privateStringsuit;//Spade,Heart,Club,Diamond
publicCard(Stringsuit,Stringface){this.face=face;this.suit=suit;}
protectedStringgetFace(){returnface;}
protectedStringgetSuit(){returnsuit;}
publicStringtoString(){returnsuit+""+face;}
解题,完成程序解:
程序代码
packagepoker;
publicclassCard{privateStringface;//A,K,Q,J,10,...2
privateStringsuit;//Spade,Heart,Club,Diamond
publicCard(Stringsuit,Stringface){this.face=face;this.suit=suit;}
protectedStringgetFace(){returnface;}
protectedStringgetSuit(){returnsuit;}
publicStringtoString(){returnsuit+""+face;}
publicstaticvoidshuffle(Card[]deck,intstartIndex,intsize,intsplitIndex){//shuffle洗牌System.out.println("startIndex:
"+startIndex);
if(splitIndex*2>size){//ifrandis30Card.swap(deck,startIndex,splitIndex,size-splitIndex);//[52]、0、30、22
shuffle(deck,size-splitIndex,splitIndex,size-splitIndex);//[52]、22、30、22}
elseif(splitIndex*2Card.swap(deck,startIndex,size-splitIndex,splitIndex);//[52]、0、42、10
shuffle(deck,startIndex,size-splitIndex,splitIndex);//[52]、0、42、10}
else{Card.swap(deck,startIndex,splitIndex,splitIndex);
}
}
publicstaticvoidswap(Card[]deck,intsrcIndex,intdstIndex,intsize){//交换
//SRC是在本位置显示:
source的缩写,源的意思HREF是点击后连接的目标:
HyperlinkReference,超链接引用
Stringface="";
Stringsuit="";
for(inti=0;i{face=deck[srcIndex+i].face;
suit=deck[srcIndex+i].suit;
deck[srcIndex+i].face=deck[dstIndex+i].face;
deck[srcIndex+i].suit=deck[dstIndex+i].suit;
deck[dstIndex+i].face=face;
deck[dstIndex+i].suit=suit;
}
}
/***@paramargs*/
publicstaticvoidmain(String[]args){//第一问解答
Card[]deck=newCard[52];
Stringf[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
Strings[]={"Spade","Heart","Club","Diamond"};
for(inti=0;i{
for(intj=0;jdeck[i*13+j]=newCard(s[i],f[j]);//依次存入数组之中,每13张一回合}
}//第二问解答
intrnd=0;
intnumOfShuffle=10;
for(inti=0;i//Math.random()返回大于或等于0.0但小于1.0的伪随机double值。
Card.shuffle(deck,0,deck.length,rnd);}//Test
/*
for(inti=0;i{
System.out.println(deck[i]);
}*/
}
}
PS:
函数shuffle是模拟洗牌的过程,这里的算法比较粗燥,随机产生一个52以内数字n,把牌分为两份,1..n-1,和n-52,然后把两份牌交换一下顺序,这里做了十次切牌。
shuffle是一个递归函数,startIndex表示切牌的开始序号,splitIndex表示切牌的序号,即上面的ngetXXX是用来得到牌的花色和数字,第二问用不到
本文来自CSDN博客,转载请标明出处:
publicclassDeckOfCardsextendsApplet{
privateCarddeck[];
privateintcurrentCard;
privateButtondealButton,shuffleButton;
privateTextFielddisplayCard;
publicvoidinit(){
Stringfaces[]={"Ace","Deuce","Three","Four","Five","Six","Seven",
"Eight","Nine","Ten","Jack","Queen","King"};
Stringsuits[]={"Hearts","Diamonds","Clubs","Spades"};
deck=newCard[52];
currentCard=-1;
for(inti=0;ideck[i]=newCard(faces[i%13],suits[i/13]);
dealButton=newButton("Dealcard");
shuffleButton=newButton("shufflecards");
displayCard=newTextField(20);
displayCard.setEditable(false);
add(dealButton);
add(shuffleButton);
add(displayCard);
}
publicbooleanaction(Eventevent,Objectobject){
if(event.target==dealButton){
Carddealt=dealCard();
if(dealt!
=null){
displayCard.setText(dealt.toString());
showStatus("Card#:
"+currentCard);
}
else{
displayCard.setText("NOMORECARDSTODEAL!
");
showStatus("Shufflecardstocontinue!
");
}
}
elseif(event.target==shuffleButton){
displayCard.setText("SHUFFLECARDS....");
showStatus("");
shuffle();
displayCard.setText("DECKISSHUFFLED!
");
}
returntrue;
}
publicvoidshuffle(){
currentCard=-1;
for(inti=0;iintj=(int)(Math.random()*52);
Cardtemp=deck[i];
deck[i]=deck[j];
deck[j]=temp;
}
dealButton.enable();
}
publicCarddealCard(){
if(++currentCardreturndeck[currentCard];
else{
dealButton.disable();
returnnull;
}
}
}
classCard{
privateStringface;
privateStringsuit;
publicCard(Stringf,Strings){
face=f;
suit=s;
}
publicStringtoString(){
returnface+"of"+suit;
}
}
两种洗牌—发牌程序收藏
用指针实现,这种比较低效
#include
#include
voidshuffle(int[][13]);
voiddeal(int[][13],char*[],char*[]);
intmain(void)
{
char*suit[4]={"hearts","diamonds","clubs","spades"};
char*face[13]={"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thrteen"};
srand(time(NULL));
intdeck[4][13]={0};
shuffle(deck);
deal(deck,face,suit);
return0;
}
voidshuffle(intdeck[][13])
{
intcard,row,column;
for(card=1;card<=52;card++){
row=rand()%4;
column=rand()%13;
while(deck[row][column]!
=0){
row=rand()%4;
column=rand()%13;
}
deck[row][column]=card;
}
}
voiddeal(intdeck[][13],char*face[],char*suit[])
{
intcard,row,column;
for(card=1;card<=52;card++)
for(row=0;row<=3;row++)
for(column=0;column<=12;column++)
if(deck[row][column]==card)
printf("%sof%s\n",face[column],suit[row]);
}
第二种是直接用结构体实现,比较高效
#include
#include
structcard{
char*suit;
char*face;
};
typedefstructcardCard;
voidfillDeck(Card*,char*[],char*[]);
voidshuffle(Card*);
voiddeal(Card*);
intmain(void)
{
Cardcard[52];
char*suit[4]={"hearts","diamonds","clubs","spades"};
char*face[13]={"one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thrteen"};
srand(time(NULL));
fillDeck(card,face,suit);
shuffle(card);
deal(card);
return0;
}
/*
voidshuffle(intdeck[][13])
{
intcard,row,column;
for(card=1;card<=52;card++){
row=rand()%4;
column=rand()%13;
while(deck[row][column]!
=0){
row=rand()%4;
column=rand()%13;
}
deck[row][column]=card;
}
}
voiddeal(intdeck[][13],char*face[],char*suit[])
{
intcard,row,column;
for(card=1;card<=52;card++)
for(row=0;row<=3;row++)
for(column=0;column<=12;column++)
if(deck[row][column]==card)
printf("%sof%s\n",face[column],suit[row]);
}*/
voidfillDeck(Card*deck,char*face[],char*suit[])
{
inti;
for(i=0;i<52;i++){
deck[i].face=face[i%13];
deck[i].suit=suit[i/13];
}
}
voidshuffle(Card*deck)
{
inti,j;
Cardtemp;
for(i=0;i<52;i++){
j=rand()%52;
temp=deck[i];
deck[i]=deck[j];
deck[j]=temp;
}
}
voiddeal(Card*deck)
{
inti;
for(i=0;i<52;i++){
printf("%sof%s\n",deck[i].face,deck[i].suit);
}
}
用C++写的扑克牌洗牌、发牌和检测牌质量的程序代码
(2010-12-1223:
00:
09)
转载
标签:
c、扑克牌
it
用C++写的扑克牌洗牌、发牌和检测牌质量的程序代码
编译器我用的是VS2008。
执行结果如图:
源文件:
有三个文件,一个是主函数文件扑克牌游戏.cpp
一个是类函数成员的实现文件dapai.cpp,还有一个是系统生成的stdafx.app。
头文件:
有两个,一个是dapai.h,另一个是系统生成的stdafx.h。
可以实现的简单功能:
可以从一副扑克牌(不带王牌)发出n手牌(n<4),每手牌发m张牌(n*m<52)。
每次执行都是随机发牌,发的牌没有重复出现,可以检测每一手牌的质量,比如有多少对牌出现、是否有同花出现、是否有连对出现、是否有顺子出现。
我只是凭着我的思路写下的。
里面没有复杂的算法,只是一些简单的语句,也有比较详细的注释。
虽然写得不专业,但是我还会继续努力学习下去的。
。
。
下面是源码:
//dapai.h文件
#pragmaonce
classdapai
{
public:
intm;//要发几手牌
intn;//要发牌的张数
intcount0;//是否有连续的五张牌出现标记
intcount2;//成对牌出现的对数
intcount3;//三张同号牌出现的个数
intcount4;//四张同号牌一起出现的标记
intcount222;
voidxipai();//洗牌
voidfapai(int,int);//发牌
inta[4][13];//发牌时统计同号牌出现的次数
intb[4][4];//发牌时统计每中花色出现的次数
dapai(void);
~dapai(void);
private:
intpuke[4][13];
constchar*color[4];//花色
char*face[13];//牌面
};
//stdafx.h:
标准系统包含文件的包含文件,这个是系统生成的stdafx.h
//或是经常使用但不常更改的
//特定于项目的包含文件
//
#pragmaonce
#defineWIN32_LEAN_AND_MEAN //从Windows头中排除极少使用的资料
#include
#include
//TODO:
在此处引用程序需要的其他头文件
//扑克牌游戏.cpp:
定义控制台应用程序的入口点。
//主函数文件
#include"stdafx.h"
#include"iostream"
#include"dapai.h"
usingnamespacestd;
voidcompare(int(*p1)[13],int (*p2)[4])//检测哪手牌比较好
{
intmax=**p2;
introw1=0;
for(inti=0;i<4;i++)
{
for(intj=0;j<4;j++)
{
if(*(*(p2+i)+j)>max)
{
max=*(*(p2+i)+j);
row1=i;
}
}
}
if(max>=5)
{
cout<<"第"<"< }
}
int_tmain(intargc,_TCHAR*argv[])
{
dapaiA;
do
{
cout<<"你要发几手牌?
"< cin>>A.m;
cout<<"你要发多少张牌?
"< cin>>A.n;
if(A.m*A.n>52)
{
cout<<"输入非法,一副扑克牌只有52张,请重新输入!
\n\n";
}
if(A.m>4)
{
cout<<"输入非法,只允许发4手牌以内!
"< }
}while(A.m*A.n>52||A.m>4);
A.xipai();
A.fapai(A.m,A.n);
compare(A.a,A.b);
}
//dapai.cpp文件
#include"StdAfx.h"
#include"dapai.h"
#incl