玩撲克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 <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <string.h>
const char ranks[]= {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
const char suits[]= {'C','D','H','S'};
int num[7]= {0,1,2,3,4,5,6};
int in_hand[4][13]= {0}; /*防止發到重覆的牌*/
int repeat[13]= {0}; /*存數字重復的數量*/
int cnt=0,cnt2=1;
int max=0; /*存最佳牌型的值*/
typedef struct Sort_ /*分開存每張牌的花色及數字*/
{
char suit;
int rank;
} Sort;
Sort rec_cards[52]; /*出現過的牌*/
Sort p_cards[2]; /*玩家手牌*/
Sort r_cards[2]; /*電腦手牌*/
Sort s_cards[5]; /*公牌*/
Sort c_cards[7]; /*手牌+公牌*/
Sort m_cards[5]; /*c_cards 7取5 出來的陣列*/
Sort n_cards[5]; /*存最佳牌型*/
Sort t_cards[5]; /*暫存牌型*/
int compare(const Sort *a,const Sort *b) /*qsort比較函式*/
{
...
}
void combine_sort(Sort a[],Sort b[],int len_a,int len_b) /*合並手牌與公牌*/
{
int i;
for(i=0; i<len_a; i++)
c_cards[i]=a[i];
for(i=0; i<len_b; i++)
c_cards[i+len_a]=b[i];
qsort(c_cards,len_a+len_b,sizeof(Sort),compare);
}
bool straight(Sort data[]) /*判斷順子*/
{
int i,j,flag=0;
for(i=0; i<4; i++)
{
if(data[i].rank+1==data[i+1].rank)
{
flag++;
if(flag==3 && data[flag+1].rank==0 || flag==4)
return true;
}
else
return false;
}
}
int find_type(Sort data[]) /*判斷牌型*/
{
int i,j,flag=0;
int repeat[13]= {0};
for(i=0; i<5; i++) /*紀錄每個數字出現了幾次*/
repeat[data[i].rank]++;
for(i=0; i<5; i++) /*同花順*/
{
if (data[0].suit==data[i].suit)
{
if (i==4)
if (straight(data)==true)
return 9;
}
else break;
}
for(i=0; i<13; i++) /*四條*/
{
if(repeat[i]==4)
return 8;
}
for(i=0; i<13; i++) /*葫蘆*/
{
if (repeat[i]==3)
for(j=0; j<13; j++)
{
if(repeat[j]==2)
return 7;
}
}
for(i=0; i<5; i++) /*同花*/
{
if (data[0].suit==data[i].suit)
{
if (i==4)
return 6;
}
else
break;
}
if(straight(data)==true) /*順子*/
return 5;
for(i=0; i<13; i++) /*三條*/
{
if (repeat[i]==3)
for(j=0; j<5; j++)
{
if(repeat[j]==1)
return 4;
}
}
flag=0;
for(i=0; i<13; i++) /*兩對*/
if (repeat[i]==2)
{
flag++;
if(flag==2)
return 3;
}
flag=0;
for(i=0; i<13; i++) /*一對*/
if (repeat[i]==2)
{
flag++;
if(flag==1)
return 2;
}
return 1; /*高牌*/
}
int combination(int data[],int after, int got) /* 找出手牌+公牌取5張的所有組合 */
{
int i;
if (5==got)
{
for (i=0; i<5; i++)
m_cards[i]=c_cards[data[i]];
int tmp=find_type(m_cards); /*每種組合丟入find_type找出是哪種牌型*/
if (tmp==max)
{
if (m_cards[4].rank>t_cards[4].rank)
{
if(m_cards[4].suit>t_cards[4].suit)
for (i=0; i<5; i++)
n_cards[i]=m_cards[i];
for (i=0; i<5; i++)
n_cards[i]=m_cards[i];
}
else
for (i=0; i<5; i++)
n_cards[i]=t_cards[i];
}
if (tmp>max)
{
max=tmp;
for (i = 0; i < 5; i++)
n_cards[i]=m_cards[i];
}
return;
}
for (i=after; i<7; i++)
{
int tmp=data[got];
data[got]=data[i];
data[i]=tmp;
combination(data,i + 1,got+1);
tmp=data[got];
data[got]=data[i];
data[i]=tmp;
}
}
int reset() /*重置max*/
{
max=0;
combination(num,0,0);
return max;
}
void num_to_type(int n) /*印出牌型名稱*/
{
...
}
void save_cards(Sort a[],int len) /*把發的牌分別存起來*/
{
int i;
if (len==2 && cnt2%3==1)
for(i=0; i<2; i++)
p_cards[i]=a[i];
if (len==2 && cnt2%3==2)
for(i=0; i<2; i++)
r_cards[i]=a[i];
if (len==5)
for(i=0; i<5; i++)
s_cards[i]=a[i];
cnt2++;
}
void deal_cards(int n) /*發牌*/
{
int i,rank,suit;
Sort data[n];
for(i=0; i<n;)
{
suit=rand() % 4;
rank=rand() % 13;
if(in_hand[suit][rank]==0)
{
in_hand[suit][rank]=1;
printf("%c%c ",ranks[rank],suits[suit]);
data[i].suit=suits[suit];
data[i].rank=rank;
rec_cards[cnt].suit=suits[suit];
rec_cards[cnt].rank=rank;
i++;
cnt++;
}
}
save_cards(data,n);
qsort(rec_cards,cnt,sizeof(Sort),compare);
printf("\n\n");
}
void welcome() /*歡迎介面*/
{
...
}
int main()
{
srand((unsigned)time(NULL));
int i,round=0,p_tmp,r_tmp,p_win=0,r_win=0;
printf("是否開始游戲?(Y/N):");
welcome();
while(round++<5)
{
printf("\n");
printf("你的牌:\n");
deal_cards(2);
printf("電腦的牌:\n");
deal_cards(2);
printf("公牌:\n");
deal_cards(5);
printf("按任意鍵顯示勝負\n\n");
getch();
combine_sort(p_cards,s_cards,2,5);
printf("你的牌與公牌:");
for(i=0; i<7; i++)
printf("%c%c ",ranks[c_cards[i].rank],c_cards[i].suit);
printf("\n");
p_tmp=reset();
printf("最佳組合:");
for(i=0; i<5; i++)
printf("%c%c ",ranks[n_cards[i].rank],n_cards[i].suit);
num_to_type(p_tmp);
combine_sort(r_cards,s_cards,2,5);
printf("\n\n電腦的牌與公牌:");
for(i=0; i<7; i++)
printf("%c%c ",ranks[c_cards[i].rank],c_cards[i].suit);
printf("\n");
r_tmp=reset();
printf("最佳組合:");
for(i=0; i<5; i++)
printf("%c%c ",ranks[n_cards[i].rank],n_cards[i].suit);
num_to_type(r_tmp);
if (p_tmp>r_tmp)
{
printf("\n你贏了!\n");
p_win++;
}
else if(p_tmp<r_tmp)
{
printf("\n你輸了!\n");
r_win++;
}
else
printf("\n平手!\n");
printf("\n目前比數(你:電腦) %d:%d\n",p_win,r_win);
printf("\n已出現的紙牌:");
for(i=0; i<cnt; i++)
printf("%c%c ",ranks[rec_cards[i].rank],rec_cards[i].suit);
printf("張數:%d\n",cnt);
printf("\n按任意鍵進行下一局\n");
getch();
}
printf("\n游戲結束!\n\n最終比數(你:電腦) %d:%d",p_win,r_win);
}
㈢ C語言 編寫撲克出牌規則函數,判斷出牌是否符合規則
#include<stdio.h>
#include<string.h>
intisPokerVaild(char*str){
if(strlen(str)==1){
if((str[0]>='2'&&str[0]<='9')||str[0]=='0'||str[0]=='A'||str[0]=='J'||str[0]=='Q'||str[0]=='K')return1;
elsereturn0;
}
elseif(strlen(str)==2){
if(str[0]==str[1])return2;
elsereturn0;
}
elseif(strlen(str)==3){
if(str[0]==str[1]&&str[1]==str[2])return3;
elsereturn0;
}
elseif(strlen(str)==4){
if(str[0]==str[1]&&str[1]==str[2]&&str[2]==str[3])return4;
elsereturn0;
}
elseif(strlen(str)==5){
ints[5],n=0;
boolflag=true;
while(n<5){
switch(str[n]){
case'2':s[n]=1;break;
case'3':s[n]=3;break;
case'4':s[n]=4;break;
case'5':s[n]=5;break;
case'6':s[n]=6;break;
case'7':s[n]=7;break;
case'8':s[n]=8;break;
case'9':s[n]=9;break;
case'0':s[n]=10;break;
case'J':s[n]=11;break;
case'Q':s[n]=12;break;
case'K':s[n]=13;break;
case'A':s[n]=14;break;
}
n++;
}
for(n=0;n<4;){
if(s[n+1]!=s[n]+1){
flag=false;
break;
}
else{
flag=true;
n++;
}
}
if(flag)return5;
elsereturn0;
}
}
intmain(){
intiRet=isPokerVaild("3");//iRet=1
printf("%d ",iRet);
iRet=isPokerVaild("n");//iRet=0
printf("%d ",iRet);
iRet=isPokerVaild("66");//iRet=2
printf("%d ",iRet);
iRet=isPokerVaild("36");//iRet=0
printf("%d ",iRet);
iRet=isPokerVaild("555");//iRet=3
printf("%d ",iRet);
iRet=isPokerVaild("366");//iRet=0
printf("%d ",iRet);
iRet=isPokerVaild("8888");//iRet=4
printf("%d ",iRet);
iRet=isPokerVaild("4666");//iRet=0
printf("%d ",iRet);
iRet=isPokerVaild("0JQKA");//iRet=5
printf("%d ",iRet);
iRet=isPokerVaild("56789");//iRet=5
printf("%d ",iRet);
iRet=isPokerVaild("45789");//iRet=0
printf("%d ",iRet);
}
㈣ 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) ,後面的兩個參數分別是整數,字元,和格式化字元串相對應。是轉義符,對於要輸出特殊字元時,需要在前面加上,比如輸出時,就寫成\;再如 " ,應寫成";輸出換行寫成 ,輸出回車寫成 等。在這個題目中,和後面的%構不成特殊字元轉義,所以不輸出,刪掉它也是一樣的。