扑克牌型
|
下面列出从大到小的扑克牌面. 这是所有的扑克通用规则。
1
| Royal Flush 同花大顺又称皇家同花顺 它是所有德州扑克中的王牌,即使您经常玩扑克,也很少见到这样的牌。好比打高尔夫球一杆进洞一样。它是由T(10)到Ace的清一色同花组成。 | |
| | |
2
| Straight Flush 同花顺 除了由最大同花所组成的同花大顺以外的同花组成的顺子。 | |
| | |
3
| Four-of-a-Kind 四条 四张同样的牌+任意一张牌 。 | |
| | |
4
|
Full House 俘虏或船牌或葫芦 | |
| | |
5
| Flush 五张同花 用五张同一花色但不相连的牌型组成,如都是五张同花,则谁的同花牌大谁赢。 | |
| | |
6
| Straight 五张顺子 由五张相连但不同花色的牌组成,在连牌中,Ace是既可作最大也可以作最小的牌。 | |
| | |
7
| Three-of-a-Kind 三条 即三张同样的牌。它有两种叫法,取决于一对牌是在您手中还是在桌上。一对在手中,桌上有一张,称之为“set”;v如手中有一张,桌上有一对,则称之为“Three of A Kind”。 | |
| | |
8
| Two Pair 两对 由五张牌中的两对牌组成。如果都有两对,则先比大对,再比小对 。 | |
| | |
9
| One Pair 一对 当不止一人有同样的一对牌时,则要比一对后面的牌,称之为“Kickers”。记住,德州扑克是挑选最好的五张牌去比。 | |
| | |
10
| High Card 大牌 无以上任何牌型时,决定牌的大小 。 |
描述:这道题亏大了,差点哭死,怎么着也找不到问题所在,原来是少了一个冒号,
哭死啦……题意就是德州扑克牌,没什么特别的地方,还有就是只能先舍弃手中的牌,
才能抓牌,并且抓能抓取与舍弃的牌数相同的牌数,还有就是只能抓一次牌,
不管几张,只能一次。不过也学会了德州扑克牌的玩法,挺有意思的……
这道题写的代码太长了,并且耗时也多,所以就今天中午又重写了一次,
缩减了许多,具体看代码二
第一次代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
struct Card
{
char num;
char flower;
int num_flag;
};
Card p[5],q[5];
char str[]= {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
int flag,count,value[14];
void straight_flush(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int j=0; j<13; j++)
if(r[0].num==str[j])
{
value[j]=1;
if(!j) value[13]=1;
break;
}
for(int i=1; i<5; i++)
{
if(r[i-1].flower!=r[i].flower) break;
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]=1;
if(!j) value[13]=1;
break;
}
}
int y(0);
if(value[0])
{
for(int i=0; i<5; i++)
if(value[i]) y++;
if(y==5)
{
printf("straight-flush\n");
flag=1;
return;
}
}
y=0;
for(int i=1; i<14; i++)
{
if(value[i]) y++;
if(y==5)
{
printf("straight-flush\n");
flag=1;
return;
}
if(y>=1&&!value[i]) break;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
straight_flush(m,x+1);
}
}
void four_of_a_kind(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]++;
break;
}
for(int i=0; i<14; i++)
if(value[i]>=4)
{
printf("four-of-a-kind\n");
flag=1;
return;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
four_of_a_kind(m,x+1);
}
}
void full_house(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]++;
break;
}
int y(0),v(0);
for(int i=0; i<14; i++)
if(value[i]==3) y++;
else if(value[i]==2) v++;
else if(y&&v)
{
printf("full-house\n");
flag=1;
return;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
full_house(m,x+1);
}
}
void flush(Card *r,int x)
{
if(flag) return;
for(int i=1; i<5; i++)
if(r[i].flower!=r[i-1].flower) flag=1;
if(!flag)
{
flag=1;
printf("flush\n");
return;
}
else flag=0;
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
flush(m,x+1);
}
}
void straight(Card *r,int x)
{
if(flag) return;
int y;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]=1;
if(!j) value[13]=1;
break;
}
if(value[0])
{
y=0;
for(int i=0; i<5; i++)
if(value[i]) y++;
if(y==5)
{
printf("straight\n");
flag=1;
return;
}
}
y=0;
for(int i=1; i<14; i++)
{
if(value[i]) y++;
if(y==5)
{
printf("straight\n");
flag=1;
return;
}
if(y>=1&&!value[i]) break;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
straight(m,x+1);
}
}
void three_of_a_kind(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]++;
break;
}
for(int i=0; i<14; i++)
if(value[i]==3)
{
printf("three-of-a-kind\n");
flag=1;
return;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
three_of_a_kind(m,x+1);
}
}
void two_pairs(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]++;
break;
}
int y=0;
for(int i=0; i<14; i++)
if(value[i]==2)
{
y++;
if(y!=2) continue;
printf("two-pairs\n");
flag=1;
return;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
two_pairs(m,x+1);
}
}
void one_pair(Card *r,int x)
{
if(flag) return;
memset(value,0,sizeof(value));
for(int i=0; i<5; i++)
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
value[j]++;
break;
}
for(int i=0; i<14; i++)
if(value[i]==2)
{
printf("one-pair\n");
flag=1;
return;
}
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
one_pair(m,x+1);
}
}
int main()
{
//freopen("a.txt","r",stdin);
char c,s[100];
count=0;
while(scanf("%c",&c)!=EOF)
{
if(c=='\n'||count>9)
{
if(c!='\n') gets(s);
count=count-5;
printf("Hand: ");
for(int i=0; i<5; i++) printf("%c%c ",p[i].num,p[i].flower);
printf("Deck: ");
for(int i=0; i<count; i++) printf("%c%c ",q[i].num,q[i].flower);
if(c!='\n') printf("%s ",s);
printf("Best hand: ");
flag=0;
straight_flush(p,0);
if(!flag) four_of_a_kind(p,0);
if(!flag) full_house(p,0);
if(!flag) flush(p,0);
if(!flag) straight(p,0);
if(!flag) three_of_a_kind(p,0);
if(!flag) two_pairs(p,0);
if(!flag) one_pair(p,0);
if(!flag) printf("highest-card\n");
count=0;
}
else if(c!=' ')
{
Card k;
k.num=c;
scanf("%c",&c);
k.flower=c;
k.num_flag=0;
if(count<=4) p[count]=k;
else q[count-5]=k;
count++;
}
}
return 0;
}
第二次代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
using namespace std;
struct Card
{
char num;
char flower;
int num_flag;
};
Card p[5],q[5];
char str[]= {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
string s_name[9]= {"straight-flush","four-of-a-kind","full-house","flush",
"straight","three-of-a-kind","two-pairs","one-pair","highest-card"
};
int flag[15],count,value[15], solve_flag[10];
void solve(Card *r,int x)
{
if(solve_flag[0]) return;
int flag_flush(0);
memset(value,0,sizeof(value));
memset(flag,0,sizeof(flag));
for(int j=0; j<13; j++)
if(r[0].num==str[j])
{
flag[j]=1;
if(!j) flag[13]=1;
value[j]++;
break;
}
for(int i=1; i<5; i++)
{
if(r[i-1].flower!=r[i].flower) flag_flush=1;
for(int j=0; j<13; j++)
if(r[i].num==str[j])
{
flag[j]=1;
if(!j) flag[13]=1;
value[j]++;
break;
}
}
if(!flag_flush) solve_flag[3]=1;
int y(0),v(0);
if(flag[0])
{
for(int i=0; i<5; i++)
if(flag[i]) y++;
if(y==5&&!flag_flush)
{
solve_flag[0]=1;
return;
}
if(y==5&&flag_flush) solve_flag[4]=1;
}
y=0;
for(int i=1; i<14; i++)
{
if(flag[i]) y++;
if(y==5&&!flag_flush)
{
solve_flag[0]=1;
return;
}
if(y==5&&flag_flush)
{
solve_flag[4]=1;
break;
}
if(y>=1&&!flag[i]) break;
}
y=v=0;
for(int i=0; i<14; i++)
if(value[i]>=4) solve_flag[1]=1;
else if(value[i]==3) v++;
else if(value[i]==2) y++;
if(v&&y==1) solve_flag[2]=1;
if(v&&!y) solve_flag[5]=1;
if(!v&&y==2) solve_flag[6]=1;
if(!v&&y==1) solve_flag[7]=1;
if(x<count)
for(int i=0; i<5; i++)
if(!r[i].num_flag)
{
Card m[5];
for(int j=0; j<5; j++) m[j]=r[j];
m[i]=q[x];
m[i].num_flag=1;
solve(m,x+1);
}
}
int main()
{
//freopen("a.txt","r",stdin);
char c,s[100];
count=0;
while(scanf("%c",&c)!=EOF)
{
if(c=='\n'||count>9)
{
if(c!='\n') gets(s);
count=count-5;
printf("Hand: ");
for(int i=0; i<5; i++) printf("%c%c ",p[i].num,p[i].flower);
printf("Deck: ");
for(int i=0; i<count; i++) printf("%c%c ",q[i].num,q[i].flower);
if(c!='\n') printf("%s ",s);
printf("Best hand: ");
memset(solve_flag,0,sizeof(solve_flag));
solve_flag[8]=1;
solve(p,0);
for(int i=0; i<9; i++)
if(solve_flag[i])
{
cout<<s_name[i]<<endl;
break;
}
count=0;
}
else if(c!=' ')
{
Card k;
k.num=c;
scanf("%c",&c);
k.flower=c;
k.num_flag=0;
if(count<=4) p[count]=k;
else q[count-5]=k;
count++;
}
}
return 0;
}