加载中…
个人资料
沙客州
沙客州
  • 博客等级:
  • 博客积分:0
  • 博客访问:9,459
  • 关注人气:4
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

炸金花比大小

(2018-02-08 00:01:29)
标签:

算法

python

炸金花

扎金花

诈金花

分类: ALGORITHM
题目描述
共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张;每人抓三张牌。两人比较手中三张牌大小,大的人获胜。
对于牌型的规则如下:
1.三张牌一样即为豹子
2.三张牌相连为顺子(A23不算顺子)
3.有且仅有两张牌一样为对子豹子>顺子>对子>普通牌型在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104)在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q)如二人牌面相同,则为平局。
输入描述:
输入两个字符串代表两个玩家的牌(如”10KQ” “354”),先输入的作为玩家1,后输入的作为玩家2
输出描述:
1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入
输入例子:
KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A
输出例子:
1
1
-1
-1
1
1
-1

解答:
这不是标准的扎金花游戏设定,仅依据题设作答。

设计:
1.定义合法的牌类型,用于校验输入,需要注意特殊的牌“10”
2.设计牌的比较方案,豹子>顺子>对子>普通

实现的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#合法的牌输入字符
poker=['2','3','4','5','6','7','8','9','10','J','Q','K','A']
poker_dict={
'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,
                   
'J':11,'Q':12,'K':13,'A':14}
#输入转换及验证
def opInput(inputStr):
    player_poker,notPoker=[],
False
    
for in range(len(inputStr)):
        
#处理10的特殊情况
        if inputStr[i]=='1' and i+1 len(inputStr):
            
if inputStr[i+1]=='0':
                player_poker+=[
'10']
            
else:
                notPoker=
True
                
break
        
elif inputStr[i]=='0' and i-1 >= 0:
            
if inputStr[i-1]!='1':
                notPoker=
True
                
break
        
elif inputStr[i] in poker:
            player_poker+=[inputStr[i]]
        
else:
            notPoker=
True
            
break
    
if notPoker or len(player_poker) 3:
        
return False
    
return player_poker
#扑克排序
def pokerSort(player_poker):
    poker_sort=[]
    
for pp in player_poker:
        poker_sort+=[poker_dict[pp]]
    poker_sort.
sort()
    
return poker_sort[::-1]
#牌型判断
def pokerType(player_poker):
    poker_type=[]
    
#豹子/对子
    if player_poker[0]==player_poker[1]==player_poker[2]:
        
#豹子
        poker_type=[9,player_poker[0]*3,player_poker[0]]
    
elif player_poker[0]==player_poker[1]:
        
#对子 1和2
        poker_type=[7,player_poker[0]*2,player_poker[2]]
    
elif player_poker[0]==player_poker[2]:
        
#对子 1和3
        poker_type=[7,player_poker[0]*2,player_poker[1]]
    
elif player_poker[1]==player_poker[2]:
        
#对子 2和3
        poker_type=[7,player_poker[1]*2,player_poker[0]]
    
elif player_poker[0]==player_poker[1]+1==player_poker[2]+2:
        
#顺子
        poker_type=[8,player_poker[2]*3-1,player_poker[0]]
    
else:
        
#普通牌型
        poker_type=[6]+player_poker
    
return poker_type
#炸金花比大小
def winThree(p1,p2):
    
#输入转换及验证
    p1_input=opInput(p1)
    p2_input=opInput(p2)
    
if not p1_input and not p2_input:
        
return 2
    
#完全一样
    if p1_input==p2_input:
        
return 0   
    p1_poker_type=pokerType(pokerSort(p1_input))
    p2_poker_type=pokerType(pokerSort(p2_input))
    
for in range(4):
        
if p1_poker_type[i] p2_poker_type[i]:
            
return 1
        
elif p1_poker_type[i] p2_poker_type[i]:
            
return -1
if __name__=='__main__':
    p1=
'K3Q'
    p2=
'10102'
    
print winThree(p1,p2)
 
 对于判断是否同花,再建个数组保存花色,这个花色的数组去重后长度为1,即是同花,定义牌的类型大小便可进行比较,同理进行同花顺的判断也是如此。设计比较牌大小的方式还是很实用的,如果有特殊牌型还能用两组牌类型的差值进行判断大小。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有