Skip to content

Commit 2bd94cf

Browse files
committed
c#版拆分法草稿
1 parent 0498f20 commit 2bd94cf

File tree

4 files changed

+573
-0
lines changed

4 files changed

+573
-0
lines changed

doc/打赏.png

86.9 KB
Loading

mjlib_c#/split/Program.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using mjlib;
6+
7+
namespace test_hu
8+
{
9+
class Program
10+
{
11+
static void print_cards(int[] cards)
12+
{
13+
for (int i = 0; i < 9; ++i)
14+
{
15+
System.Console.Write(cards[i]);
16+
System.Console.Write(",");
17+
}
18+
System.Console.WriteLine("");
19+
20+
for (int i = 9; i < 18; ++i)
21+
{
22+
System.Console.Write(cards[i]);
23+
System.Console.Write(",");
24+
}
25+
System.Console.WriteLine("");
26+
for (int i = 18; i < 27; ++i)
27+
{
28+
System.Console.Write(cards[i]);
29+
System.Console.Write(",");
30+
}
31+
System.Console.WriteLine("");
32+
for (int i = 27; i < 34; ++i)
33+
{
34+
System.Console.Write(cards[i]);
35+
System.Console.Write(",");
36+
}
37+
System.Console.WriteLine("");
38+
}
39+
static void test_one()
40+
{
41+
int[] cards = {
42+
0,0,0,0,2,0,0,0,0,
43+
1,2,2,1,0,0,2,2,2,
44+
0,0,0,0,0,0,0,0,0,
45+
0,0,0,0,0,0,0
46+
};
47+
48+
System.Console.Write("测试1种\n");
49+
print_cards(cards);
50+
if (!HuLib.getInstance().get_hu_info(cards, null, 34, 34, 34))
51+
{
52+
System.Console.Write("测试失败\n");
53+
}
54+
else
55+
{
56+
System.Console.Write("测试成功\n");
57+
}
58+
}
59+
static void Main()
60+
{
61+
System.Console.Write("test hulib begin...\n");
62+
63+
TableMgr.getInstance().load();
64+
65+
test_one();
66+
67+
System.Console.ReadKey();
68+
}
69+
}
70+
}

mjlib_c#/split/hulib.cs

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
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

Comments
 (0)