1
+
2
+ namespace mjlib
3
+ {
4
+ class ProbabilityItem
5
+ {
6
+ public bool eye ;
7
+ public int gui_num ;
8
+ public ProbabilityItem ( )
9
+ {
10
+ eye = false ;
11
+ gui_num = 0 ;
12
+ }
13
+ } ;
14
+
15
+ class ProbabilityItemTable
16
+ {
17
+ public ProbabilityItem [ , ] m = new ProbabilityItem [ 4 , 9 ] {
18
+ { new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) } ,
19
+ { new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) } ,
20
+ { new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) } ,
21
+ { new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) , new ProbabilityItem ( ) } ,
22
+ } ;
23
+ public int array_num ;
24
+ public int [ ] m_num ;
25
+ public ProbabilityItemTable ( )
26
+ {
27
+ array_num = 0 ;
28
+ m_num = new int [ ] { 0 , 0 , 0 , 0 } ;
29
+ }
30
+ }
31
+
32
+ struct Wave
33
+ {
34
+
35
+ }
36
+ class HuLib {
37
+ static HuLib m_hulib = new HuLib ( ) ;
38
+ public bool get_hu_info ( int [ ] hand_cards , Wave [ ] waves , int curCard , int gui_index1 , int gui_index2 )
39
+ {
40
+ int [ ] hand_cards_tmp = new int [ 34 ] ;
41
+ for ( int i = 0 ; i < 34 ; ++ i )
42
+ {
43
+ hand_cards_tmp [ i ] = hand_cards [ i ] ;
44
+ }
45
+
46
+ if ( curCard < 34 )
47
+ {
48
+ hand_cards_tmp [ curCard ] ++ ;
49
+ }
50
+ int gui_num = 0 ;
51
+ if ( gui_index1 < 34 )
52
+ {
53
+ gui_num = hand_cards_tmp [ gui_index1 ] ;
54
+ hand_cards_tmp [ gui_index1 ] = 0 ;
55
+ }
56
+ if ( gui_index2 < 34 )
57
+ {
58
+ gui_num += hand_cards_tmp [ gui_index2 ] ;
59
+ hand_cards_tmp [ gui_index2 ] = 0 ;
60
+ }
61
+
62
+ ProbabilityItemTable ptbl = new ProbabilityItemTable ( ) ;
63
+ if ( ! split ( hand_cards_tmp , gui_num , ptbl ) )
64
+ {
65
+ return false ;
66
+ }
67
+
68
+ return check_probability ( ptbl , gui_num ) ;
69
+ }
70
+
71
+ public static HuLib getInstance ( )
72
+ {
73
+ return m_hulib ;
74
+ }
75
+ bool split ( int [ ] cards , int gui_num , ProbabilityItemTable ptbl )
76
+ {
77
+ if ( ! _split ( cards , gui_num , 0 , 0 , 8 , true , ptbl ) ) return false ;
78
+ if ( ! _split ( cards , gui_num , 1 , 9 , 17 , true , ptbl ) ) return false ;
79
+ if ( ! _split ( cards , gui_num , 2 , 18 , 26 , true , ptbl ) ) return false ;
80
+ if ( ! _split ( cards , gui_num , 3 , 27 , 33 , false , ptbl ) ) return false ;
81
+
82
+ return true ;
83
+ }
84
+
85
+ bool _split ( int [ ] cards , int gui_num , int color , int min , int max , bool chi , ProbabilityItemTable ptbl )
86
+ {
87
+ int key = 0 ;
88
+ int num = 0 ;
89
+
90
+ for ( int i = min ; i <= max ; ++ i )
91
+ {
92
+ key = key * 10 + cards [ i ] ;
93
+ num = num + cards [ i ] ;
94
+ }
95
+
96
+
97
+ if ( num > 0 )
98
+ {
99
+ if ( ! list_probability ( color , gui_num , num , key , chi , ptbl ) )
100
+ {
101
+ return false ;
102
+ }
103
+ }
104
+
105
+ return true ;
106
+ }
107
+
108
+ bool list_probability ( int color , int gui_num , int num , int key , bool chi , ProbabilityItemTable ptbl )
109
+ {
110
+ bool find = false ;
111
+ int anum = ptbl . array_num ;
112
+ for ( int i = 0 ; i <= gui_num ; ++ i )
113
+ {
114
+ int yu = ( num + i ) % 3 ;
115
+ if ( yu == 1 ) continue ;
116
+ bool eye = ( yu == 2 ) ;
117
+ if ( find || TableMgr . getInstance ( ) . check ( key , i , eye , chi ) )
118
+ {
119
+ ProbabilityItem item = ptbl . m [ anum , ptbl . m_num [ anum ] ] ;
120
+ ptbl . m_num [ anum ] ++ ;
121
+
122
+ item . eye = eye ;
123
+ item . gui_num = i ;
124
+ find = true ;
125
+ }
126
+ }
127
+
128
+ if ( ptbl . m_num [ anum ] <= 0 )
129
+ {
130
+ return false ;
131
+ }
132
+
133
+ ptbl . array_num ++ ;
134
+ return true ;
135
+ }
136
+
137
+ bool check_probability ( ProbabilityItemTable ptbl , int gui_num )
138
+ {
139
+ // 全是鬼牌
140
+ if ( ptbl . array_num == 0 )
141
+ {
142
+ return gui_num >= 2 ;
143
+ }
144
+
145
+ // 只有一种花色的牌的鬼牌
146
+ if ( ptbl . array_num == 1 ) return true ;
147
+
148
+ // 尝试组合花色,能组合则胡
149
+ for ( int i = 0 ; i < ptbl . m_num [ 0 ] ; ++ i )
150
+ {
151
+ ProbabilityItem item = ptbl . m [ 0 , i ] ;
152
+ bool eye = item . eye ;
153
+ int gui = gui_num - item . gui_num ;
154
+ if ( check_probability_sub ( ptbl , ref eye , ref gui , 1 , ptbl . array_num ) )
155
+ {
156
+ return true ;
157
+ }
158
+ }
159
+ return false ;
160
+ }
161
+
162
+ bool check_probability_sub ( ProbabilityItemTable ptbl , ref bool eye , ref int gui_num , int level , int max_level )
163
+ {
164
+ for ( int i = 0 ; i < ptbl . m_num [ level ] ; ++ i )
165
+ {
166
+ ProbabilityItem item = ptbl . m [ level , i ] ;
167
+
168
+ if ( eye && item . eye ) continue ;
169
+
170
+ if ( gui_num < item . gui_num ) continue ;
171
+
172
+ if ( level < max_level - 1 )
173
+ {
174
+ int old_gui_num = gui_num ;
175
+ bool old_eye = eye ;
176
+ gui_num -= item . gui_num ;
177
+ eye = eye || item . eye ;
178
+
179
+ if ( check_probability_sub ( ptbl , ref eye , ref gui_num , level + 1 , ptbl . array_num ) )
180
+ {
181
+ return true ;
182
+ }
183
+
184
+ eye = old_eye ;
185
+ gui_num = old_gui_num ;
186
+ continue ;
187
+ }
188
+
189
+ if ( ! eye && ! item . eye && item . gui_num + 2 > gui_num ) continue ;
190
+ return true ;
191
+ }
192
+
193
+ return false ;
194
+ }
195
+
196
+ bool check_7dui ( int [ ] cards )
197
+ {
198
+ int c = 0 ;
199
+ for ( int i = 0 ; i < 34 ; ++ i )
200
+ {
201
+ if ( cards [ i ] % 2 != 0 ) return false ;
202
+ c += cards [ i ] ;
203
+ }
204
+
205
+ if ( c != 34 ) return false ;
206
+
207
+ return true ;
208
+ }
209
+ }
210
+ }
0 commit comments