扔牌C語言
❶ 撲克牌問題(c語言)
其實這是典型的利用鏈表求解的問題,但是此題用鏈表的話還需要應用一個長度為13的數組做輔助,所以我直接用數組來進行演示,將在手中的牌進行標記,將放到桌子上的牌進行賦值。
我在很小的時候我的姥爺就曾給我表演過這個魔術,當時我自己用撲克牌弄了將近兩個小時才終於知道了這13張牌的順序是什麼,有纖姿興趣的話你可以自己試一試,很有意思。
下面的代碼你可以進行調試來幫助理解整個過程
#include <stdio.h>
void main()
{
int poker[13];//十三張撲克牌
for(int i = 0;i<13;i++)//初始化
poker[i] = 0;//0代表牌還在手中,不為0代表放到了桌子上
int remain = 13;//手中剩餘的撲克數
int j = 12;//從最下邊開始抽牌
int order = 1;//當order為2時,將此時的牌放到桌子上
int number = 1;//從A開始
while(remain != 0)
{
if(j == -1)
{
j = 12;//返回最後一張牌
continue;
}
if(poker[j] != 0)//如果牌已不在手中,則到下一張牌
{
j--;
continue;
}
if(order == 2)
{
poker[j]= number++;//將撲克賦值
remain--;//手中剩餘的牌數減1
order = 1;
continue;
}
order++;
j--;
}
//輸出一開始小明手中撲克牌的順序
for(i = 0; i < 13;i++)
printf("%d ",poker[i]);
}
想要寫出一個程序重點在於理解這個過程,只有對這個過程熟悉了旁豎慶才有可能把運握它用代碼來演示出來。
❷ 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語言紙牌發牌程序源代碼(附註釋)
其實發牌問題里有個隨機的問題,就是模擬洗牌的問題,我來嘗試下這個程序吧(每個花色的代碼分別是:紅桃 \x3,方塊\x4,梅花\x5,黑桃\x6
#include <stdio.h>
#include <time.h>
char hua_se[4]={'\x3','\x4','\x5','\x6'}; //定義一個數組來存放花色
char *dight[14]={"Ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"};//定義一個指針型的數組來存放數字
int fa_pai[4][13]={0};//定義一個二維數組來發牌
void move(int fa_pai[4][13]);
void deal(int fa_pai[4][13],char huase[4],char *dight[4][13]);
int main(void){srand(time(NULL));
move(fa_pai);
deal(hua_se,dight,fa_pai);
printf("你是否想結束發牌?Y/N");
getch();return 0;}void move(int fa_pai[4][13]){int r,card,row,column;
for(card=1;card<=52;card++)
{
r=rand();
row=r%4;
r=rand();
column=r%13;
while(fa_pai[4][13]!=0)
{
r=rand();
row=r%4;
r=rand();
column=r%13;
}
fa_pai[row][column]=card;
}
}
void deal(int fapai[4][13],char hua_se[3],char *dight[13])
{
char c;int card,row,column;
for(card=1;card<=52;card++)
{
for(row=0;row<=3;row++)
{
for(column=0;column<=12;column++)
{
if(fapai[row][column]==card)
{
if(card%3=0)c='\n';
elsec='\t';
printf("%5sof%-8s%c",hua_se[row],dight[column],c);
}
}
}
}
}
❹ 用C語言編寫一個翻牌游戲
編寫程序:題目:紙牌游戲 編號為1~52的牌,正面向上,從第2張開始,以2根據題意的翻牌規則 即求約數的過程 一個數的約數如果去掉1 包含自身的個數
❺ c語言撲克牌
定義個字元數組,存放A-K牌面的字母 char ch[][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
牌的大小從A-K分別為 0-12
在輸出牌的牌面字元時,輸出ch數據中牌面值下標的字元串。如某牌數值是9,輸出時如下:
printf("%s", ch[9]);
「%d\%c」是格式輸出字元串,表示要輸出一個整數(%d)一個字元(%c) ,後面的兩個參數分別是整數,字元,和格式化字元串相對應。是轉義符,對於要輸出特殊字元時,需要在前面加上,比如輸出時,就寫成\;再如 " ,應寫成";輸出換行寫成 ,輸出回車寫成 等。在這個題目中,和後面的%構不成特殊字元轉義,所以不輸出,刪掉它也是一樣的。
❻ c語言程序設計撲克牌游戲
定義一個結構類型表示一張牌,結構包含3個成員,第一個成員char:取值2,3~K,A表示牌名字,第二個成員int:取值2~14表示牌真實大小。第三個成員:結構鏈表指針。
寫一個初始化函數,定義52大小的結構數組,成員值初值分別和牌對應,遍歷數組並將每個元素的鏈表指針依次指向下一個元素地址。這樣得到一個初始鏈表。(相當於一盒新牌)
所有涉及隨機數都用rand函數,洗牌分四份就是循環取隨機數m=1~n,n是隨循環自減,初值52,直到n變成0。每隨一次循環就從初始鏈表中遍歷取出對應第m個節點,並從初始鏈表中將這個節點斷開(既前一個節點指針直接指向後一個節點指針)。每取13張就組成一個新的鏈表。這樣獲得4個新鏈表分別表示4個玩家。
最後出牌就是分別遍歷自己的鏈表,利用循環取牌比較結構數值大小。(取出的牌要從鏈表斷開和上面一樣,你把取出節點寫成獨立函數就能反復使用)。
❼ C語言程序設計課程設計撲克牌游戲,怎麼做
#include<conio.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int jisuan(int);
int comptotal;
char s1[]="A234567890JQK";
//char s2[4][5]={"紅桃","黑桃","草花","方塊"};
char s2[4]={3,4,5,6};
int poke[52];
int ch;
int win=0;
int computer[5],user[5];
int usertotal;
int users;
int k;
int main()
{ void xipai(int poke[]);
void ai();
int i,j;
////////////////////////////////////////////////////////上面是變數和聲明
printf("\n這是簡單的廿一點游戲:\n");
for(i=0;i<52;i++)
{
if(i%13==0)putchar('\n');
poke[i]=i;
printf("%c%c%c ",s2[i/13],s1[i%13]=='0'?'1':' ',s1[i%13]);
}
putchar('\n');
/////////////////////////////////////////////////////////主代碼
k=0;
xipai(poke);
while(ch!=27)
{ comptotal=0;
usertotal=0;
if(k>=42)
{
printf("\n剩餘牌數不足十張,重新洗牌");
xipai(poke);
k=0;
}
printf("\n\n\n\n\n\n\n\n新局開始:\n");
printf("現在共有牌%2d張\n",52-k);
if(win==0)
{
computer[0]=k++;
user[0]=k++;
printf("\n電腦做莊,要牌:");
ai();
}
else
{
printf("\n玩家做莊,要牌:\n\t回車要牌\n\t空格過牌");
user[0]=k++;
computer[0]=k++;
}
printf("\n玩家開始要牌:\n");
usertotal=jisuan(poke[user[0]]);
printf("%c%c%c 共%2d點\t",s2[poke[user[0]]/13],s1[poke[user[0]]%13]=='0'?'1':' ',s1[poke[user[0]]%13],usertotal);
users=0;
ch=1;
while(ch!=32&&users<4)
{
ch=getch();
switch(ch)
{
case 27:
goto end;
break;
case 32:
break;
case 13:
user[++users]=k;
usertotal+=jisuan(poke[user[users]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d點\t",s2[poke[k]/13],s1[poke[k]%13]=='0'?'1':' ',s1[poke[k]%13],usertotal);
k++;
if(usertotal>=21)ch=32;
break;
default:
break;
}
}
if(win==1)
{
printf("\n電腦開始要牌:\n");
ai();
}
printf("\n\n\n玩家的點數是%2d",usertotal);
printf("\n電腦的點數是%2d",comptotal);
printf("\n\n本局結算:");
if(comptotal>21&&usertotal<=21)
{
printf("\n\n電腦爆牌了");
win=1;
printf("\n恭喜,你贏了");
}
if(usertotal>21&&comptotal<=21)
{
printf("\n\n你爆牌了");
printf("\n下次小心點");
win=0;
}
if(usertotal>21&&comptotal>21)
{
printf("\n\n你們兩個,怎麼都這么不小心啊,都撐死了還要嗎");
}
if(usertotal<=21&&comptotal<=21)
{
if(usertotal>comptotal)
{
win=1;
printf("\n\n不錯,你贏了");
}
else if(usertotal<comptotal)
{
win=0;
printf("\n\n撐死膽大的,餓死膽小的,沒膽子,輸了吧");
}
else
printf("\n\n平了,算你走運");
}
getch();
}
end:
return 0;
}
void xipai(int poke[])
{
int y,tmp,i,j;
for(j=0;j<7;j++)
for(i=0;i<52;i++)
{
srand(time(0));
y=rand()%10;
tmp=poke[i];
poke[i]=poke[(y*i*i)%52];
poke[(y*i*i)%52]=tmp;
}
}
///////////////////////////////////////////////子函數
void ai()
{
int i;
comptotal=jisuan(poke[computer[0]]);
printf("\n%c%c%c 共%2d點\t",s2[poke[computer[0]]/13],s1[poke[computer[0]]%13]=='0'?'1':' ',s1[poke[computer[0]]%13],comptotal);
for(i=0;i<4;i++)
{
if(comptotal<17)
{
computer[i+1]=k++;
comptotal+=jisuan(poke[computer[i+1]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d點\t",s2[poke[computer[i+1]]/13],s1[poke[computer[i+1]]%13]=='0'?'1':' ',s1[poke[computer[i+1]]%13],comptotal);
}
}
}
int jisuan(int i)
{int dian;
switch(i%13)
{
case 0:
case 10:
case 11:
case 12:
dian=1;
break;
default:
dian=i%13+1;
}
return dian;
}
❽ 如何用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);
}
❾ 魔術師的紙牌編程演算法
我的理解是第1張是A,然後把第2張放到最後,然後第3張是2,然後把第4張放到最後,第5張放到最後,然後第6張是3,然後把7、8、9張依次放到最後,然後第8張是4……
是這樣吧?
按照你說的話,牌由上到下的順序是(T代表10):A825T3QJ9476K
c語言實現的話用倒推的思想應該會相對比較簡單一些,你自己拿13張牌自己倒推著試試看,然後按照自己倒推的思路編程就會容易許多。
具體的代碼就不給你編了,實現的時候可能多層循環比較麻煩,一步一步來就會輕鬆些,最好先畫個流程圖。
❿ 求高手幫忙寫一個c語言發牌程序
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define PLAYER 4//玩家人數
#define NUM 13//玩家拿牌數
#define SIZE 52//所有牌數
//聲明函數
void PokerRand(int *pokerRand);
void Palyer(int *pokerRand);
void Process(int *countA, int *countB, int *countC, int *countD);
void Output(int *poker, int *countA, int *countB, int *countC, int *countD);
struct PokerGame
{
int A[NUM];//記錄玩家手中的黑桃牌
int B[NUM];//記錄玩家手中的紅桃牌
int C[NUM];//記錄玩家手中的梅花牌首李空
int D[NUM];//記錄玩家手中的方片牌
int manNum[NUM];//記錄玩家手裡所有的牌
}man[PLAYER];
//隨機產生52張牌
void PokerRand(int *pokerRand)
{
int i, j;
srand((unsigned)time(NULL));
for (i=0; i<SIZE; i++)
{
MARK: pokerRand[i] = rand()%52;
for (j=0; j<i; j++)
{
if (pokerRand[i] == pokerRand[j])
{
goto MARK;
}
}
}
}
//給4個玩家發牌
void Palyer(int *pokerRand)
{
int i, j;
int count = 0;
for (j=0; j<NUM; j++)
{
for (i=0; i<PLAYER; i++)//輪流發牌
{
man[i].manNum[j] = pokerRand[count++];
}
}
}
//統計玩家手中的牌
void Process(int *countA, int *countB, int *countC, int *countD)
{
int i, j;
for (i=0; i<PLAYER; i++)
{
countA[i] = 0;
countB[i] = 0;
countC[i] = 0;
countD[i] = 0;
for (j=0; j<NUM; j++)//統計四個玩家手中的牌
{
if ((man[i].manNum[j] >= 0) && (man[i].manNum[j] < 13))//黑桃
{
man[i].A[ countA[i]++ ] = man[i].manNum[j];
}
else if (man[i].manNum[j] < 26)//紅桃
{
man[i].B[ countB[i]++ ] = man[i].manNum[j];
}
else if (man[i].manNum[j] < 39)//梅花
{
man[i].C[ countC[i]++ ] = man[i].manNum[j];
}
else//方片
{
man[i].D[ countD[i]++ ] = man[i].manNum[j];
}
}
}
}
//輸擾森出
void Output(int *poker, int *countA, int *countB, int *countC, int *countD)
{
int i, j;
printf("撲克牌者瞎自動發牌 %c(黑) %c(紅) %c(梅) %c(方):\n", 6, 3, 5, 4);
for (i=0; i<PLAYER; i++)
{
printf("\n第%d人 :\n", i+1);//開始輸出第i個玩家
printf("%c:\t", 6);//輸出第i個玩家的黑桃牌
for (j=0; j<countA[i]; j++)
{
if (poker[ man[i].A[j] ] == 10)//假如等於10,以%d格式輸出
{
printf("%4d", poker[ man[i].A[j] ]);
}
else//否則以%c格式輸出
{
printf("%4c", poker[ man[i].A[j] ]);
}
}
printf("\n");
printf("%c:\t", 3);//輸出第i個玩家的紅桃牌
for (j=0; j<countB[i]; j++)
{
if (poker[ man[i].B[j] ] == 10)
{
printf("%4d", poker[ man[i].B[j] ]);
}
else
{
printf("%4c", poker[ man[i].B[j] ]);
}
}
printf("\n");
printf("%c:\t", 5);//輸出第i個玩家的梅花牌
for (j=0; j<countC[i]; j++)
{
if (poker[ man[i].C[j] ] == 10)
{
printf("%4d", poker[ man[i].C[j] ]);
}
else
{
printf("%4c", poker[ man[i].C[j] ]);
}
}
printf("\n");
printf("%c:\t", 4);//輸出第i個玩家的方片牌
for (j=0; j<countD[i]; j++)
{
if (poker[ man[i].D[j] ] == 10)
{
printf("%4d", poker[ man[i].D[j] ]);
}
else
{
printf("%4c", poker[ man[i].D[j] ]);
}
}
printf("\n");
}
}
void main(void)
{
int countA[PLAYER] = { 0 };//記錄4個玩家持黑桃牌數
int countB[PLAYER] = { 0 };//記錄4個玩家持紅桃牌數
int countC[PLAYER] = { 0 };//記錄4個玩家持梅花牌數
int countD[PLAYER] = { 0 };//記錄4個玩家持方片牌數
int pokerRand[SIZE] = { 0 };//存放隨機產生52張牌
int poker[SIZE] = {65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,
65, 50, 51, 52, 53, 54, 55, 56, 57, 10, 74, 81, 75,};
PokerRand(pokerRand);//洗牌
Palyer(pokerRand);//發牌
Process(countA, countB, countC, countD);//整牌
Output(poker, countA, countB, countC, countD);//亮牌
printf("\n\n\n");
system("pause");
}