more yakus implemented

This commit is contained in:
Didictateur 2025-04-04 11:21:04 +02:00
parent 2a1267fefb
commit 3375fb8f7b
4 changed files with 160 additions and 16 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -5,13 +5,18 @@ import { Hand } from "../hand"
let count = 0;
let total = 0;
let h1 = new Hand("m1m2m3 m4m5m6 m7m8m9 p1p2p3 p5p5");
let h1 = new Hand("m1m2m3 m4m5m6 m7m8m9 m1m2m3 m5m5");
let h2 = new Hand("m1m1m1 m4m4m4 m7m7m7 p1p1p1 p5p5");
let h3 = new Hand("m1m1m1 p9p9p9 s1s1s1 w2w2w2 d1d1");
let h4 = new Hand("m2m3m4 p3p3p3 p4p5p6 s4s4 s6s7s8");
let h5 = new Hand("m1m2m3 m1m2m3 p7p8p9 p7p8p9 w3w3");
let h6 = new Hand("m1m2m3 m1m2m3 p6p7p8 p7p8p9 w3w3");
let h7 = new Hand("m1m2m3 p1p2p3 s1s2s3 m7m8m9 p9p9");
let h8 = new Hand("m1m2m3 m1m2m3 p6p6 w0w0w0 w3w3w3");
let h9 = new Hand("m1m2m3 m1m2m3 d1d1d1 d2d2d2 d3d3");
let h10 = new Hand("m1m2m3 p6p6 d1d1d1 d2d2d2 d3d3d3");
let h11 = new Hand("m1m2m3 w1w1w1 w2w2w2 w3w3w3 w4w4");
let h12 = new Hand("m1m1 w1w1w1 w2w2w2 w3w3w3 w4w4w4");
// lipeikou
count += assert(yakus.lipekou(h5, [], 0) === 1, "m123 m123 p789 p789 w33 is Lipeikou");
@ -33,10 +38,45 @@ count += assert(yakus.sanshokuDoujun(h7, [], 0) === 2, "m123 p123 s123 m789 p99
count += assert(yakus.sanshokuDoujun(h2, [], 0) === 0, "m111 m444 m777 p111 p55 is not Shanshokou Doujun");
total += 2;
// chanta
count += assert(yakus.chanta(h3, [], 0) === 2, "m111 p999 s111 w222 d11 is Chanta");
count += assert(yakus.chanta(h1, [], 0) === 0, "m123 m456 m789 m123 p55 is not Chanta");
// ittsuu
count += assert(yakus.ittsuu(h1, [], 0) === 2, "m123 m456 m789 m123 m55 is Ittsuu");
count += assert(yakus.ittsuu(h2, [], 0) === 0, "m111 m444 m777 p111 p55 is not Ittsu");
total += 2;
// tanyao
count += assert(yakus.tanyao(h4, [], 0) === 1, "m234 p333 p456 s44 s678 is Tanyao");
count += assert(yakus.tanyao(h1, [], 0) === 0, "m123 m456 m789 m123 p55 is not Tanyao");
total += 2;
// yakuhai
count += assert(yakus.yakuhai(h3, [], 2) === 1, "m111 p999 s111 w222 d11 West is Yakuhai");
count += assert(yakus.yakuhai(h8, [], 3) === 2, "m123 m123 p66 w000 w333 North is double Yakuhai");
count += assert(yakus.yakuhai(h3, [], 0) === 0, "m111 p999 s111 w222 d11 Est is not Yakuhai");
total += 3;
// shousangen
count += assert(yakus.shousangen(h9, [], 0) === 2, "m123 m123 d111 d222 d33 is Shousangen");
count += assert(yakus.shousangen(h10, [], 0) === 0, "m123 p66 d111 d222 d333 is not Shousangen");
count += assert(yakus.shousangen(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Shousangen");
total += 3;
// daisangen
count += assert(yakus.daisangen(h10, [], 0) === 13, "m123 p66 d111 d222 d333 is Daisangen");
count += assert(yakus.daisangen(h9, [], 0) === 0, "m123 m123 d111 d222 d33 is not Daisangen");
count += assert(yakus.daisangen(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen");
total += 3;
// shousuushi
count += assert(yakus.shousuushii(h11, [], 0) === 13, "m123 w111 w222 w333 w44 is Daisangen");
count += assert(yakus.shousuushii(h12, [], 0) === 0, "m11 w111 w222 w333 w444 is not Daisangen");
count += assert(yakus.shousuushii(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen");
total += 3;
// daisuushi
count += assert(yakus.daisuushi(h12, [], 0) === 13, "m11 w111 w222 w333 w444 is Daisangen");
count += assert(yakus.daisuushi(h11, [], 0) === 0, "m123 w111 w222 w333 w44 is not Daisangen");
count += assert(yakus.daisuushi(h3, [], 0) === 0, "m111 p999 s111 w222 d11 is not Daisangen");
total += 3;
// total
console.log("Succès: " + count.toString() + "/" + total.toString());

View file

@ -195,8 +195,8 @@ ittsuu: function(
wind: number
): number {
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(g => chii(g));
gr.sort((g1, g2) => g1.compare(g2));
gr.filter(g => chii(g));
if (gr.length < 3) { // trop peu de suite
return 0;
} else if (gr.length === 3) { // pile le bon nombre
@ -213,7 +213,27 @@ ittsuu: function(
return groups.length > 0 ? 1 : 2;
}
} else { // il y a un intrus
return 0 //TODO
for (let i = 0; i < 4; i++) {
let index = []
for (let j = 0; j < 4; j++) {
if (j !== i) {
index.push(j);
}
}
let t0 = gr[index[0]].getTiles();
let t1 = gr[index[1]].getTiles();
let t2 = gr[index[2]].getTiles();
if (
t0[0].getValue() === 1 &&
t1[0].getValue() === 4 &&
t2[0].getValue() === 7 &&
t0[0].getFamily() === t1[0].getFamily() &&
t0[0].getFamily() === t2[0].getFamily()
) {
return groups.length > 0 ? 1 : 2;
}
}
return 0;
}
return 0;
},
@ -245,15 +265,33 @@ yakuhai: function(
* brelan de valeur
* 1/1
*/
// TODO multiplicité !
hand: Hand,
groups: Array<Group>,
wind: number
): number {
return 0;
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(g => pon(g) && g.getTiles().length === 3);
let han = 0;
gr.forEach(
g => {
let t = g.getTiles();
let f = t[0].getFamily();
let v = t[0].getValue();
if (f === 5) { // brelan de dragon
han++;
}
if (f === 4 && v === 0) { // vent d'est
han++;
}
if (f === 4 && v === wind) { // vent du joueur
han++;
}
}
);
return han;
},
shousangen: function( //TODO
shousangen: function(
/**
* trois petits dragons
* 2/2
@ -262,10 +300,29 @@ shousangen: function( //TODO
groups: Array<Group>,
wind: number
): number {
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(g => pon(g));
let nbPon = 0;
let nbPair = 0;
gr.forEach(
g => {
let t = g.getTiles();
if (t[0].getFamily() === 5) {
if (t.length === 3) {
nbPon++;
} else {
nbPair++;
}
}
}
)
if (nbPon == 2 && nbPair == 1) {
return 2;
}
return 0;
},
daisangen: function( //TODO
daisangen: function(
/**
* trois grands dragons
* 13/13
@ -274,10 +331,19 @@ daisangen: function( //TODO
groups: Array<Group>,
wind: number
): number {
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(
g => pon(g) &&
g.getTiles().length === 3 &&
g.getTiles()[0].getFamily() === 5
);
if (gr.length === 3) {
return 13;
}
return 0;
},
shousuushii: function( //TODO
shousuushii: function(
/**
* quatre petits vents
* 13/13
@ -286,10 +352,29 @@ shousuushii: function( //TODO
groups: Array<Group>,
wind: number
): number {
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(g => pon(g));
let nbPon = 0;
let nbPair = 0;
gr.forEach(
g => {
let t = g.getTiles();
if (t[0].getFamily() === 4) {
if (t.length === 3) {
nbPon++;
} else {
nbPair++;
}
}
}
)
if (nbPon == 3 && nbPair == 1) {
return 13;
}
return 0;
},
daisuushi: function( //TODO
daisuushi: function(
/**
* quatre grands vents
* 13/13
@ -298,6 +383,25 @@ daisuushi: function( //TODO
groups: Array<Group>,
wind: number
): number {
let gr = groups.concat(hand.toGroup() as NonNullable<Array<Group>>);
gr = gr.filter(g => pon(g));
let nbPon = 0;
let nbPair = 0;
gr.forEach(
g => {
let t = g.getTiles();
if (t[0].getFamily() === 4) {
if (t.length === 3) {
nbPon++;
} else {
nbPair++;
}
}
}
)
if (nbPon == 4 && nbPair == 0) {
return 13;
}
return 0;
},