當前位置:首頁 » 編程語言 » 洗牌程序c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

洗牌程序c語言

發布時間: 2023-05-13 15:56:31

c語言編程用撲克牌洗牌和發牌

程序就不寫了,寫下大致流程

//定義一個數組,或者列表,鏈表什麼的隨你
//共52個元素 記作card[52]
//card代表撲克牌的類,有花色(color 枚舉,0,1,2,3),點數(枚舉 A~K)等屬性

card tmp;
for(int i=0;i<52;i++)
{
//計算一個0到52之間的隨機數x
tmp=card[i];
card[i]=card[x];
card[x]=tmp;//其實就是交換兩張牌
}
//循環下來肯定每張牌都被交換過,有它自己的新位置,也有可能湊巧還在原來的位置

//最後按下標順序分四堆

❷ C語言 洗牌演算法

/*洗牌程序:用任何語言,隨機分配52張撲克牌到52個位置上,每個位置只容許放一張牌
用1-13表示紅心A--K
14-26表示黑桃A,2,3-,Q,K
27-39表示方塊A,2,3-,Q,K
40-52表示黑桃A,2,3-,Q,K
也就是生成1-52不重復的隨機數,放到數組中*/

#include<iomanip.h>
#include<stdlib.h>
#include<time.h>

const int N=52;
static int a[N];

int create(int n)
{
return (1+rand()%52);
}

int main()
{
int i,j;
srand(time(0));
for(i=0;i<N;++i)
{
a[i]=create(N);
for(j=0;j<i;++j)
{
if(a[j]==a[i])
{
a[i]=(a[i]+1)%52;
}
}
cout<<setw(5)<<a[i];
}
cout<<endl;
return 0;
}

❸ c語言 洗牌程序

沒錯

❹ c語言洗牌程序。將一副新的除去大王小王,52張撲克牌隨機洗牌並輸出#include<stdio.h


for(i=1;i<=N;i++)
{
if(i%13==0)poker[i]=13;
elsepoker[i]=i%13;
}
輸入牌錯誤

❺ C語言編程——發牌洗牌模擬,求幫助

實現了2副牌的發牌,和每個人的牌和底牌
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

struct CARD //牌
{
char suit[10]; /*花色*/
char face[10]; /*牌面*/
};
enum { posA, posB, posC, posD};//定義好每個人的位置
struct Postion
{
struct CARD getcard[25];//每人獲得的牌
};
struct Postion postion[4];//分配四個位置

struct CARD leftCard[8]; //底牌
struct CARD card[54]; //54張牌
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","jack","Queen","King"};
/* 函數功能:將52張牌的順序打亂,
函數參數:結構體數組wCard,表示52張牌
函數返回值:無
*/
void Shuffle(struct CARD *wCard)
{
int i,j;
struct CARD temp;

for (i=0; i<54; i++)
{
j=rand()%54;
temp=wCard[i];
wCard[i]=wCard[j];
wCard[j]=temp;
}
}
/*函數功能:發牌結果
函數參數:結構體數組wCard,表示有54張牌
函數返回值:無
*/
void Deal(struct CARD *wCard)
{
int i,aidx=0,bidx=0,cidx=0,didx=0;

Shuffle(card);//將牌打亂
/*************發第一副牌,只發50張,分別分給A,B,C,D四個位置 4張留底**************/
// 第一次發完50張後,A,B多一張,所以下面第二次讓C,D排在前面,兩次發完剛好各40張 */
for (i=0; i<50; i++)//發牌數
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==1)
postion[posB].getcard[bidx++]=wCard[i];
else if(i%4==2)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==3)
postion[posD].getcard[didx++]=wCard[i];
}

/**********剩下的四張作為底牌*********/
leftCard[0]=wCard[i++];
leftCard[1]=wCard[i++];
leftCard[2]=wCard[i++];
leftCard[3]=wCard[i++];

Shuffle(card);//再次將牌打亂
/*************發第二副牌,也只發50張,分別分給A,B,C,D四個位置,4張留底,一共8張底**************/
for (i=0; i<50; i++)//發牌數
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==1)
postion[posD].getcard[didx++]=wCard[i];
else if(i%4==2)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==3)
postion[posB].getcard[bidx++]=wCard[i];
}

/**********剩下的四張作為底牌,這樣就一共為8張底牌*********/
leftCard[4]=wCard[i++];
leftCard[5]=wCard[i++];
leftCard[6]=wCard[i++];
leftCard[7]=wCard[i++];

}

/* 函數功能:將52張牌按黑桃、紅桃、草花、方塊花色順序,面值按A~K順序排列
函數參數:結構體數組wCard,表示不同花色和面值的52張牌
指針數組wFace,指向面值字元串
指針數組wSuit,指向花色字元串
函數返回值:無
*/
void FillCard(struct CARD wCard[],char *wSuit[], char *wFace[])
{
int i;

for (i=0; i<52; i++)
{
strcpy(wCard[i].suit, wSuit[i/13]);
strcpy(wCard[i].face, wFace[i%13]);
}
// wCard[53].face="Big"; //大小王
strcpy(wCard[52].suit, "Small");
strcpy(wCard[52].face, "ghost");
strcpy(wCard[53].suit, "Big");
strcpy(wCard[53].face, "ghost");
}

void print(char ch)//輸出牌
{
int i;
switch(ch)
{
case 'A': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face);
}
break;
case 'B': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face);
}
break;
case 'C': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face);
}
break;
case 'D': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face);
}
break;
}

}

void outputLeftCard()//輸出底牌
{
int i;
for(i=0; i<8; i++)
printf("%10s %5s\n", leftCard[i].suit, leftCard[i].face);
}

int main()
{
char pos;
srand(time(NULL));
FillCard(card,suit,face);
//Shuffle(card);
Deal(card);

printf("Please choose your position(A、B、C、D):");
scanf("%c", &pos);
print(pos);//輸出你所在位置的牌
/**********下面輸出的是,除了你之外其他人的牌**********/
if(pos !='A')
{
printf("A:\n");
print('A');
}
if(pos !='B')
{
printf("B:\n");
print('B');
}
if(pos !='C')
{
printf("C:\n");
print('C');
}
if(pos !='D')
{
printf("D:\n");
print('D');
}

printf("底牌為:\n");
outputLeftCard();//輸出底牌

return 0;
}

❻ C語言 編寫洗牌的問題

洗牌就隨機排序的問題,所以就需要使用庫函數rand(),或者自己編寫一個偽隨機數來實現。

C++里STL里有一個函數random_shuffle()就能實現這樣的功能。

#include<stdlib.h>
#include<time.h>
#include<stdio.h>

//洗牌函數
voidrandom_shuffle(int*array,intlen)
{
int*p=array,temp,pos;
for(inti=1;i<len;++i)
{
pos=rand()%i;
temp=*p;
*p++=array[pos];
array[pos]=temp;
}
}

//顯示函數
voidprint(int*array)
{
inti;
constcharsign1[][4]={"紅","黑","方","草"};
constcharsign2[][4]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

for(i=0;i<52;++i)
{
printf("%s%2s",sign1[array[i]/13],sign2[array[i]%13]);
if(i%13==12)printf(" ");
}
printf(" ");
}




intmain()
{
srand(time(NULL));//初始化隨機數
intcard[52],i;
for(i=0;i<52;++i)card[i]=i;//初始化牌
print(card);


random_shuffle(card,52);//洗牌

print(card);

return0;
}


❼ C語言 洗牌

下面是正確的代碼,沒有用鏈表,通過4個數組來做的,必要的注釋我都加了。不理解可以問我。

cout相當於printf,cin相當於scanf。

#include "iostream"

using namespace std;

int main()
{
int num;
cout << "請輸入特定數n:";
cin >> num;

int *arry = new int[2*num];
int *temp = new int[2*num];
int *t1 = new int[num];
int *t2 = new int[num];
//初始化數組
for(int j=0;j<2*num;j++)
{
arry[j] = temp[j] = j;
}

//以下是循環部分
bool gogo = true;
int count = 0;

while(gogo)
{
//更新奇、偶數組
for(int i=0; i<2*num; i++)
{
if(i<num)
t1[i] = temp[i];
else
t2[(i-num)] = temp[i];
}

//重組temp數組
for(i=0; i<2*num; i++)
{
if(i%2==0)
temp[i] = t2[i/2] ;
else
temp[i] = t1[(i-1)/2];
}

//判斷重組後的數組temp是否和原來的數組一樣
for(i=0; i<2*num; i++)
{
if(arry[i] != temp[i])
{
break;
}
}
//如果完全相同,則此時 i==2n;
if(i==2*num)
gogo = false;

count++;
}

cout << count << "次後數組恢復到原來的次序。";

return 0;
}

❽ 編寫一個C語言程序,模擬洗牌和發牌的過程

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structPOKER
{
intnum;//A:1,J:11,Q:12,K:13
intcolor;棗鄭//黑1,紅2,梅檔岩漏3,方4
}s[52];

intmain()
{
inti,num,color;
memset(s,0,sizeof(structPOKER)*52);
srand((unsigned)time(0));

intcount=0;
while(count<52)
{
num=rand()%13+1;
color=rand()%4+1;
intflag_skip=0,flag_end=0;
for(i=0;i<52;i++)
{
if(s[i].num==num&&s[i].color==color)
{
flag_skip=1;
break;
}
}
if(flag_skip==1)
{
continue;
}
while(1)
{
i=rand()%52;
if(s[i].num==0)
{
s[i].num=num;
s[i].color=color;
count++;
break;
}
else
{
continue;
}
}
}
for(i=0;i<52;i++)
{
if(i%13==0)
{
printf(" 玩家%d:",i/13+1);
}
switch(s[i].num)
{
case行爛1: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;
}

❾ c語言 洗牌程序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct poker
{
int num;
char color[7];
}node;
void creat(node card[4][13])
{
srand(1);
int i,j,flag=0;
node *p;
for(i = 0; i < 4; i++)
for(j = 0; j < 13; j++)
{
do
{
card[i][j].num = rand()%52+1;
// 這里跟你改了一下,比較判斷的時候用取地址的方式比較
// 簡單。
for(p = card[0]; p < &card[i][j]; p++)
{
if((i==0) && (j==0))
break;
if(p->num == card[i][j].num)
{
flag = 1;
break;
}
}
// 這里很容易忘記取到正確的結果時重置flag
if ( &card[i][j] == p)
{
flag = 0;
}
}while (flag);
}
}

void main()
{
void creat(node card[4][13]);
node card[4][13];
int i,j;

creat(card);
for(i=0;i<4;i++)
for(j=0;j<13;j++)
{
printf("%d ",card[i][j].num);
if(j==12)
printf("\n");
}
}

首先你要明白flag這個變數是用來干什麼的,它是用來標記是否要再隨機取一個值,為1則表示要,為0表示不要再取值了。如果不加那段if語句將flag重置為0則會進入死循環,這就是為什麼你停在那裡不動的原因。
for(p = card[0]; p < &card[i][j]; p++)
這句話中是確定了p 不小於 &card[i][j],不小於不一定就是大於,還有等於的情況,其實p現在的值就是&card[i][j]了。
下次遇到這樣的邏輯問題,你可以進行調試,用VC++6的調試方法就是按下 F10 然後你就是可以在main函數里看到一個箭頭的東西,每按一次F10就會向下走一步,然後你可以看有一個叫做Varialbes的窗口,裡面的值是會變化的,這是我們觀察程序中變數變化的窗口。遇到函數,我們按下F11就可以進入函數中執行了,查看 調試窗口 和 調試 那裡有更為詳細的功能。

❿ C語言完全洗牌程式

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intn,a[20],b[20],c[20],n2;
voidinit()
{inti,j,k,t;
for(i=0;i<n2;i++)
a[i]=i+1;
srand(time(0));
for(i=0,j=n2;i<j;j--)
{k=rand()%j;
t=a[j-1];a[j-1]=a[k];a[k]=t;
}
for(i=0;i<n2;i++)
c[i]=a[i];
}
voidprt()
{for(inti=0;i<n2;i++)
{printf("%3d",a[i]);
if(i==n-1)printf("||");
}
printf(" ");
}
voidwork()
{inti,t;
for(i=1;i<n2-1;i++)
{t=i<n?i+i:(i+i)%n2+1;
b[t]=a[i];
//printf("b[%d]=a[%d] ",(i+i)%n2+1,i);
}
for(i=1;i<n2-1;i++)
a[i]=b[i];
}
booldone()
{for(inti=1;i<n2;i++)
if(a[i]!=c[i])returnfalse;
returntrue;
}
intmain()
{scanf("%d",&n);
n2=n+n;
init();
prt();
do
{work();
prt();
}while(!done());
return0;
}