c语言扑克牌

Python022

c语言扑克牌,第1张

定义个字符数组,存放 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) ,后面的两个参数分别是整数,字符,和格式化字符串相对应。\ 是转义符,对于要输出特殊字符时,需要在前面加上\, 比如输出\时,就写成\\ 再如 " ,应写成\" ; 输出换行 写成 \n, 输出回车写成 \r 等。 在这个题目中,\和后面的%构不成特殊字符转义,所以\ 不输出,删掉它也是一样的。

#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=0i<len_ai++)

c_cards[i]=a[i]

for(i=0i<len_bi++)

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=0i<4i++)

{

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=0i<5i++) /*纪录每个数字出现了几次*/

repeat[data[i].rank]++

for(i=0i<5i++) /*同花顺*/

{

if (data[0].suit==data[i].suit)

{

if (i==4)

if (straight(data)==true)

return 9

}

else break

}

for(i=0i<13i++) /*四条*/

{

if(repeat[i]==4)

return 8

}

for(i=0i<13i++) /*葫芦*/

{

if (repeat[i]==3)

for(j=0j<13j++)

{

if(repeat[j]==2)

return 7

}

}

for(i=0i<5i++) /*同花*/

{

if (data[0].suit==data[i].suit)

{

if (i==4)

return 6

}

else

break

}

if(straight(data)==true) /*顺子*/

return 5

for(i=0i<13i++) /*三条*/

{

if (repeat[i]==3)

for(j=0j<5j++)

{

if(repeat[j]==1)

return 4

}

}

flag=0

for(i=0i<13i++) /*两对*/

if (repeat[i]==2)

{

flag++

if(flag==2)

return 3

}

flag=0

for(i=0i<13i++) /*一对*/

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=0i<5i++)

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=0i<5i++)

n_cards[i]=m_cards[i]

for (i=0i<5i++)

n_cards[i]=m_cards[i]

}

else

for (i=0i<5i++)

n_cards[i]=t_cards[i]

}

if (tmp>max)

{

max=tmp

for (i = 0i <5i++)

n_cards[i]=m_cards[i]

}

return

}

for (i=afteri<7i++)

{

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=0i<2i++)

p_cards[i]=a[i]

if (len==2 &&cnt2%3==2)

for(i=0i<2i++)

r_cards[i]=a[i]

if (len==5)

for(i=0i<5i++)

s_cards[i]=a[i]

cnt2++

}

void deal_cards(int n) /*发牌*/

{

int i,rank,suit

Sort data[n]

for(i=0i<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=0i<7i++)

printf("%c%c ",ranks[c_cards[i].rank],c_cards[i].suit)

printf("\n")

p_tmp=reset()

printf("最佳组合:")

for(i=0i<5i++)

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=0i<7i++)

printf("%c%c ",ranks[c_cards[i].rank],c_cards[i].suit)

printf("\n")

r_tmp=reset()

printf("最佳组合:")

for(i=0i<5i++)

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=0i<cnti++)

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)

}