A. C語言編程——發牌洗牌模擬,求幫助
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define SUIT 52
#define HALF 26
#define COLOR ((char)13)
// 撲克牌的編碼是一組13進制的數據,從0編到51
// 函數tell用於解釋編碼的內容
int tell(char card, char * description)
{
char i=0, j=0;
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","Jack","Queen","King"};
//題干比較奇怪,要求扣8張底牌,但是含大小王。正確的規則應該是不含大小王的情況下扣8張牌,每人11張牌就對了
//否則應該扣10張牌或者6張牌,否則每人發牌得到的牌數不相同(不是4的倍數)
//如需要,可自行定義JB=52,JA=53,SUIT=54,HALF=27即可。
//if (card > JB || card < 0 || !description) return 0;
//if (card == JB) { sprintf(description, "Big Joker"); return 1; }
//if (card == JA) { sprintf(description, "Little Joker"); return 1; }
i = card / COLOR; j = card % COLOR;
sprintf(description, "%s %s", suit[i], face[j]);
return 1;
}
//初始化牌,形成一個順序牌
int init(char *poker)
{
char i = 0;
if (!poker) return 0;
for (i=0; i<SUIT; i++) poker[i]=i;
srand((unsigned)time(0));
return 1;
}
//洗牌,將當前牌分成上下兩組,然後交叉,有右手先和左手先兩種可能,這一個是左手先交換法
int wash_left_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半組
boker[j] = poker[i];
k = i + HALF; //下半組
boker[j+1]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}
//洗牌,將當前牌分成上下兩組,然後交叉,有右手先和左手先兩種可能,這一個是右手先交換法
//注意左右手先後順序的區別在於變數j的奇偶變化
int wash_right_hand(char *poker)
{
char i=0, j=0, k=0;
char boker[SUIT];
if(!poker) return 0;
for(i=0; i<HALF; i++) {
j = i * 2; //上半組
boker[j+1] = poker[i];
k = i + HALF; //下半組
boker[j]=poker[k];
}//next i
memcpy(poker, boker, SUIT);
return 1;
}
//在當前牌的基礎上洗一次牌,主要用隨機函數的奇偶性確定用左手洗還是右手洗
int wash_once(char *poker)
{
return rand()%2?wash_left_hand(poker):wash_right_hand(poker);
}
//在當前牌的基礎上隨機洗若干次牌,至少8次,最多18次
int wash_full(char *poker)
{
int i = 0, j = 0, k = 0;
i = rand() % 10 + 8;
printf("\nTry to wash %d times.\n", i);
for (j=0; j < i ; j++) k+=wash_once(poker);
return k;
}
int main(void)
{
char choice = 0, i = 0, j = 0; char poker[SUIT], card[16];
init(poker);
do {
printf("\n\tWelcome to My Poker Game!\n");
printf("\t0-Wash.\n");
printf("\t1-Show A.\n");
printf("\t2-Show B.\n");
printf("\t3-Show C.\n");
printf("\t4-Show D.\n");
printf("\tany other number-quit.\n");
printf("Your Choice?");
scanf("%d", &choice);
if(choice <0 || choice >4) break;
if(choice ==0) {
wash_full(poker);
continue;
}//end if
i = (choice - 1) * 11; //注意用11張牌,扣8張底牌
printf("His card is...\n");
for(j = i; j<i+11; j++) {
tell(poker[j], card);
printf("%s\t", card);
}//next
printf("\n");
}while(1);
return 0;
}
B. 怎麼用c語言模擬寫發52張撲克牌,求源碼
代碼很長 就不打了
思路就是做一個數組
比如
int a[4][13];
代表四個人
然後 1~52 這52個數 代表牌
定義int a[52];
初始化為0 表示牌是否發出去
然後用rand()%52+1獲取隨機數 如果沒發出去的 那麼 分配給對應人。
C. C語言,撲克牌發牌程序。要求運用結構體。多謝幫忙^o^
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structPOKE
{
intnum;//小王-1,大王-2,A:1,J:11,Q:12,K:13
intcolor;//黑1,紅2,梅3,方4,小王5,大王6
}s[54];
intmain()
{
inti,num,color;
memset(s,0,sizeof(structPOKE)*54);
srand((unsigned)time(0));
i=rand()%54;
s[i].num=-1;//小王
s[i].color=5;
while(1)
{
i=rand()%54;
if(s[i].num==0)
{
s[i].num=-2;//大王
s[i].color=6;
break;
}
}
intcount=2;
while(1)
{
num=rand()%13+1;
color=rand()%4+1;
i=rand()%54;
if(s[i].num==0)
{
s[i].num=num;
s[i].color=color;
count++;
if(count>=54)
{
break;
}
}
}
printf("
順序為:
");
for(i=0;i<54;i++)
{
switch(s[i].num)
{
case-1:putchar(1);break;
case-2:putchar(2);break;
case1:putchar('A');break;
case11:putchar('J');break;
case12:putchar('Q');break;
case13:putchar('K');break;
default:printf("%d",s[i].num);
}
switch(s[i].color)
{
case1: putchar(6);break;
case2:putchar(3);break;
case3:putchar(5);break;
case4:putchar(4);break;
default:printf("");
}
printf("");
}
return0;
}
D. C語言鬥地主發牌程序,急求,謝謝
我愛吃的水果有很多,而我最愛吃的是葡萄。;;細雨如絲,茂密的葡萄藤貪婪地吮吸著春天的甘露。它們伸展著嫩綠的枝條,一片片掌形的葉子在雨霧中歡笑著。;;;;清明節過後,葡萄藤長出了一粒粒小籽,這就是葡萄花的花苞。過了幾天,葡萄花開了,花小小的,白中帶有一點黃,像一團團雪花。風把香氣吹得四處飄散,引來了一群群辛勤的蜜蜂和翩翩起舞的蝴蝶。我走到葡萄藤下,聞到一陣清香,使人感到心曠神怡。;;;;春末夏初時,葡萄花紛紛凋謝,開花的地方又長出一粒粒小籽,這就是葡萄了。葡萄先是嫩綠色的,上面就像蒙上了一層「白霜」,粉撲撲的。然後漸漸變成紫色,一個個綠中透紫的珍珠,掛在葡萄藤上,閃著誘人的亮光。最後葡萄已經成熟了,一串串亮晶晶、紫紅色的葡萄,掛滿了葡萄藤,讓人真想嘗一嘗。;;;摘下一顆葡萄,剝去它的表皮,便看見一顆誘人的晶球。把它放進嘴裡,舌尖觸到葡萄那晶瑩透明的果肉,使人感到細膩。沒有熟透的葡萄甜中帶酸,熟透了就甜滋滋的,叫人越吃越想吃。;;;葡萄不但營養豐富,含有多種維生素,是水果中的佳品,而且還有一定的醫葯價值。;;;我真喜愛葡萄啊。
E. 如何用c語言編寫紙牌發牌程序
發牌原程序見我的空間(http://hi..com/crazycola/blog/item/52402bd4b3f68705a08bb746.html),可選是否包含大小王,可選發牌列數。
以下為改過的版本,不包含大小王(即總數52張),只能發4堆。
另外附加了用戶菜單,原程序中不含菜單部分。
代碼如下:
---------------------------------------
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int menu()
{
int choice;
printf("1 發牌/0 退出:");
scanf("%d",&choice);
return choice;
}
void main( void )
{
int i1, j, total;
int *iArr;
int tag = 0;
char* pok_C[] = { "黑桃", "紅桃", "梅花", "方塊" };
char* pok_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
if(!menu()) exit(0);
total = 52;
srand( (unsigned)time( NULL ) );
iArr = (int*)malloc(total*sizeof(int));
for( i1=0; i1<total; i1++ )
{
iArr[i1]=rand()%total;
if( i1==0 ) continue;
do {
tag = 0;
for( j=0; j<i1; j++ )
if( iArr[j] == iArr[i1] )
{
iArr[i1]=rand()%total;
tag = 1;
}
} while( tag==1 );
}
for( i1=0; i1<total; i1++ )
{
printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13]);
if(i1%4==3) printf("\n");
}
free(iArr);
}
F. 如何求C語言撲克牌洗牌發牌,發的牌要從大到小排序,每個部分都要用
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 52 //牌張總數
#define M 13 //每花色張數
char hs[4]={5,4,3,6}; //花色數組:梅花、紅心、方塊、黑桃字元對應的ASCII碼
char hx[]={"JQKA"}; // 對應11,12,13,14共四張大於10的牌符號
//生成順序撲克牌數組: 1~52,梅花1~13,紅心14~26,方塊27~39,黑桃40~52
void newDeck(int *a) { int i; for ( i=0;i<N;i++ ) a[i]=i+1; }
//洗牌,將花色和順序打亂
void Shuffle(int *a) { int s,i,j,t;
srand((unsigned int)time(NULL)); //利用當前時間生成隨機數種子
s=rand()%11+5; printf("隨機洗牌%d遍\n",s); //第1個隨機數當成洗牌次數, 洗牌次數大於等於5,小於等於15
for ( i=0;i<s;i++ ) {
for ( j=0;j<N;j++ ) {
s=rand()%52; //隨機數范圍0~51,對應a數組下標
t=a[j]; a[j]=a[s]; a[s]=t; //第j張牌和第s張牌交換
}
}
}
//發牌並顯示
void Deal(int a[N],int b[4][M]) { int i,j;
for ( i=0;i<4;i++ ) for ( j=0;j<M;j++ ) b[i][j]=a[i*M+j];
}
//理牌
void Collating(int a[4][M]) { int i,j,k,h;
for ( h=0;h<4;h++ )
for ( i=0;i<M-1;i++ )
for ( j=i+1;j<M;j++ )
if ( a[h][i]<a[h][j] ) {
k=a[h][i]; a[h][i]=a[h][j]; a[h][j]=k;
}
}
//顯示
void Display(int a[4][M]) { int i,j,s;
for ( i=0;i<4;i++ ) {
for ( j=0;j<M;j++ ) {
s=a[i][j]-1; printf("%c",hs[s/M]);
s%=M; if ( s<9 ) printf("%d ",s+2); else printf("%c ",hx[s-9]);
}
printf("\n");
}
}
void main() { int Deck[N],hands[4][M];
newDeck(Deck); //新撲克牌
Shuffle(Deck); //洗牌
Deal(Deck,hands); //發牌
Collating(hands); //理牌
Display(hands); //顯示
printf("\n\n"); system("pause");
}
G. 初學c語言,求一個自動發牌的程序。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
intcard[52];
voidDisplay(inti)//將0~51之間的數映射成牌號和花色
{
switch(i%4)
{
case0:printf("紅桃");break;
case1:printf("黑桃");break;
case2:printf("梅花");break;
case3:printf("方塊");break;
}
if(i/4+1<11)
printf("%d ",i/4+1);
elseif(i/4+1==11)
printf("%c ",'J');
elseif(i/4+1==12)
printf("%c ",'Q');
elseif(i/4+1==13)
printf("%c ",'K');
}
voidInitCard()
{
inti,j,temp;
srand((int)time(0));
for(i=0;i<52;i++)//隨機生成52個數
{
temp=rand()%52;
for(j=0;j<i;j++)
{
if(card[j]==temp)break;
}
if(j==i)card[i]=temp;
elsei--;
}
for(i=0;i<52;i++)//初始化輸出
{
if(i%5==0&&i!=0)printf(" ");
Display(card[i]);
}
}
voiddeal()
{
inti,j,temp;
srand((int)time(0));
for(i=0;i<52;i++)
{
temp=rand()%52;
for(j=0;j<i;j++)
{
if(card[j]==temp)break;
}
if(j==i)card[i]=temp;
elsei--;
}
for(i=0;i<52;i++)//發牌輸出
{
if(i%5==0&&i!=0)printf(" ");
if(i%13==0&&i!=0)printf(" ");
if(i%13==0)
printf("第%d個玩家的牌: ",i/13+1);
Display(card[i]);
}
}
intmain(void)
{
intkey=0;
printf("================主菜單============== ");//菜單
printf("=============1、初始化撲克========= ");
printf("=============2、洗牌、發牌========= ");
printf("=============3、退出============== ");
while(key!=3)//選擇菜單
{
printf("請輸入菜單功能編號:");
scanf("%d",&key);
switch(key)
{
case1:InitCard();break;//初始化
case2:deal();//發牌
default:break;
}
printf(" ");
}
return0;
}
代碼如上,測試結果:
基本思想就是,只要隨機生成的數,發給誰都一樣;所以初始化和發牌時候先隨機生成52個不同的數0~51,初始化時,直接輸出就可以了。發牌時按13一組一次分給一個人就可以了。
H. c語言編程用撲克牌洗牌和發牌
這是洗牌程序,你可以自己修改輸出格式。
S,H,D,C 黑桃紅桃方塊草花
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct card {
int cdhs; //1,2,3,4
int point; //1,2,..13;
} CARD;
CARD cards[52];
void main()
{
int i,j,k,n;
int x[52],y;
int flag[52];
char p[13][5]={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
// char p[13][5]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
// char h[4][5] = {"S","H","D","C"};
char h[4][5] = {"D","C","H","S"};
// char h[4][6] = {'\06','\03','\05','\04'};
for (j=0;j<4;j++){
for (i=0;i<13;i++){
cards[j*13+i].cdhs= j %4 ;
cards[j*13+i].point= i %13;
}};
for (i=0;i<52;i++) flag[i]= -1;
srand((unsigned)time(NULL));
n=0;
while(1) {
y = (int) ( (float)rand() / ((float)(RAND_MAX)) * 53.0);
if (y < 52 && y >= 0) { if ( flag[y] == -1)
{ x[n]=y; flag[y]=1;n++; if (n>=52)break; };
}; // end if
};
for (k=0;k<4;k++)
for (i=0;i<12;i++)
for(j=i;j<13;j++){
if (x[i+k*13]< x[j+k*13]){y=x[i+k*13];x[i+k*13]=x[j+k*13];x[j+k*13]=y;};
}
printf("Person-1: ");
for (i=0;i<13;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-2: ");
for (i=13;i<26;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-3: ");
for (i=26;i<39;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\nPerson-4: ");
for (i=39;i<52;i++){ printf("%s%s ",h[cards[x[i]].cdhs],p[cards[x[i]].point]);
}
printf("\n");
system("pause");
}