Fix: shenyang-rule

This commit is contained in:
2020-06-03 23:46:05 +08:00
parent eaef00533c
commit e91a217eb4
2 changed files with 183 additions and 6 deletions
+19 -6
View File
@@ -75,10 +75,6 @@ func (r *ShenyangRule) CanAddedKong(shown []model.ShownTile, newTile model.Tile)
}
func (r *ShenyangRule) CanWin(handTiles []model.Tile, showTiles []model.ShownTile, newTile model.Tile) bool {
//必须开门
if len(showTiles) == 0 {
return false
}
tarTiles := make([]model.Tile, len(handTiles))
copy(tarTiles, handTiles)
@@ -99,6 +95,10 @@ func (r *ShenyangRule) CanWin(handTiles []model.Tile, showTiles []model.ShownTil
if !r.CheckDoor(handTiles, showTiles) {
return false
}
//闭门
if !r.isOpenDoor(showTiles){
return false
}
var requestedTripletCount = 1
shownTripCount := model.GetPongCount(showTiles) + model.GetExposedKongCount(showTiles) +
model.GetAddedKongCount(showTiles) + model.GetConcealedKongCount(showTiles)
@@ -122,8 +122,7 @@ func (r *ShenyangRule) CanWin(handTiles []model.Tile, showTiles []model.ShownTil
}
for _, v := range showTiles {
if v.ShownType == config.AddedKong ||
v.ShownType == config.ExposedKong ||
v.ShownType == config.ConcealedKong {
v.ShownType == config.ExposedKong {
return true
}
}
@@ -203,3 +202,17 @@ func (r *ShenyangRule) canRightChow(tiles []model.Tile, newTile model.Tile) bool
}
return model.GetTileCount(tiles, *left) != 0 && model.GetTileCount(tiles, *lleft) != 0
}
func (r *ShenyangRule) isOpenDoor(shown []model.ShownTile) bool {
if shown == nil || len(shown) == 0 {
return false
}
for _, s := range shown {
if s.ShownType == config.ConcealedKong {
continue
} else {
return true
}
}
return false
}
+164
View File
@@ -0,0 +1,164 @@
package rule
import (
"github.com/c-my/MahjongServer/config"
"github.com/c-my/MahjongServer/model"
"testing"
)
func TestShenyangRule_CanChow(t *testing.T) {
j := NewShenyangRule()
var tests = []struct {
hand []model.Tile
newTile model.Tile
want bool
}{
{[]model.Tile{{0, 1}, {0, 3}, {1, 4}}, model.Tile{0, 2}, true},
{[]model.Tile{{0, 2}, {0, 3}, {1, 4}}, model.Tile{0, 2}, false},
{[]model.Tile{{0, 2}, {0, 3}, {1, 4}}, model.Tile{0, 1}, true},
{[]model.Tile{{0, 1}, {1, 3}, {2, 4}}, model.Tile{0, 2}, false},
{[]model.Tile{{1, 7}, {1, 8}, {2, 4}}, model.Tile{1, 9}, true},
{[]model.Tile{{1, 7}, {1, 8}, {2, 4}}, model.Tile{4, 1}, false},
}
for _, test := range tests {
canChow, _ := j.CanChow(test.hand, test.newTile)
if canChow != test.want {
t.Errorf("wrong chow")
}
}
}
func TestShenyangRule_CanPong(t *testing.T) {
j := NewShenyangRule()
var tests = []struct {
hand []model.Tile
newTile model.Tile
want bool
}{
{[]model.Tile{{4, 1}, {4, 1}, {4, 1}}, model.Tile{4, 1}, true},
{[]model.Tile{{1, 4}, {4, 1}, {4, 1}}, model.Tile{4, 1}, true},
{[]model.Tile{{0, 1}, {1, 1}, {3, 1}, {4, 1}}, model.Tile{4, 1}, false},
{[]model.Tile{{0, 1}, {0, 3}, {1, 4}}, model.Tile{0, 2}, false},
}
for _, test := range tests {
if j.CanPong(test.hand, test.newTile) != test.want {
t.Errorf("wrong pong")
}
}
}
func TestShenyangRule_CanConcealedKong(t *testing.T) {
j := NewShenyangRule()
var tests = []struct {
hand []model.Tile
newTile model.Tile
want bool
}{
{[]model.Tile{{4, 1}, {4, 1}, {4, 1}}, model.Tile{4, 1}, true},
{[]model.Tile{{4, 1}, {4, 1}, {4, 1}}, model.Tile{1, 1}, false},
{[]model.Tile{{0, 1}, {1, 1}, {3, 1}, {4, 1}}, model.Tile{4, 1}, false},
{[]model.Tile{{0, 1}, {0, 3}, {1, 4}}, model.Tile{0, 2}, false},
}
for _, test := range tests {
if j.CanConcealedKong(test.hand, test.newTile) != test.want {
t.Errorf("wrong pong")
}
}
}
func TestShenyangRule_CanWin(t *testing.T) {
j := NewShenyangRule()
var tests = []struct {
hand []model.Tile
shown []model.ShownTile
newTile model.Tile
want bool
}{
{[]model.Tile{{0, 7}, {0, 8}, {0, 9},
{2, 1}, {2, 2}, {2, 3}, {2, 7}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{1, 3}, {1, 3}, {1, 3}, {1, 3}}}},
model.Tile{2, 6},
false},
{[]model.Tile{{0, 7}, {0, 7}, {0, 9}, {0, 9},
{1, 3},
{2, 1}, {2, 1}, {2, 3}, {2, 3}, {2, 8}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{},
model.Tile{1, 3},
false}, //闭门
{[]model.Tile{{0, 2}, {0, 3}, {0, 4}, {0, 6}, {0, 7}, {0, 8},
{2, 5}, {2, 7}, {2, 8}, {2, 8}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{1, 3}, {1, 3}, {1, 3}, {1, 3}}}},
model.Tile{2, 6},
false}, //缺幺九
{[]model.Tile{{0, 2}, {0, 3}, {0, 4}, {0, 6}, {0, 7}, {0, 8},
{2, 5}, {2, 7}, {2, 8}, {2, 8}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{1, 9}, {1, 9}, {1, 9}, {1, 9}}}},
model.Tile{2, 6},
false},
{[]model.Tile{{0, 7}, {0, 8}, {0, 9},
{1, 1}, {1, 2},
{2, 1}, {2, 2}, {2, 3}, {2, 6}, {2, 7}, {2, 8}, {2, 9}},
[]model.ShownTile{},
model.Tile{1, 3},
false},
{[]model.Tile{{0, 9}, {0, 9}, {0, 9},
{2, 1}, {2, 2}, {2, 3}, {2, 7}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{1, 3}, {1, 3}, {1, 3}, {1, 3}}}},
model.Tile{2, 6},
false},
{[]model.Tile{{0, 7}, {0, 8}, {0, 9},
{2, 1}, {2, 2}, {2, 3}, {2, 7}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{0, 3}, {0, 3}, {0, 3}, {0, 3}}}},
model.Tile{2, 6},
false}, //缺门
{[]model.Tile{{3, 1}, {3, 1},
{0, 4}, {0, 4}, {0, 4},
{0, 6}, {0, 8},
{1, 5}, {1, 6}, {1, 7},
{2, 9}, {2, 9}, {2, 9}},
[]model.ShownTile{},
model.Tile{0, 7},
false}, //闭门
}
for _, test := range tests {
if j.CanWin(test.hand, test.shown, test.newTile) != test.want {
t.Errorf("wrong win")
}
}
}
func BenchmarkShenyangRule_CanWin_Normal(b *testing.B) {
j := NewShenyangRule()
var test = struct {
hand []model.Tile
shown []model.ShownTile
newTile model.Tile
want bool
}{[]model.Tile{{0, 7}, {0, 8}, {0, 9},
{2, 1}, {2, 2}, {2, 3}, {2, 7}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{{config.ExposedKong, []model.Tile{{1, 3}, {1, 3}, {1, 3}, {1, 3}}}},
model.Tile{2, 6}, true}
b.ResetTimer()
for i := 0; i < b.N; i++ {
j.CanWin(test.hand, test.shown, test.newTile)
}
}
func BenchmarkShenyangRule_CanWin_LackDoor(b *testing.B) {
j := NewShenyangRule()
var test = struct {
hand []model.Tile
shown []model.ShownTile
newTile model.Tile
want bool
}{[]model.Tile{{0, 7}, {0, 8}, {0, 9},
{2, 1}, {2, 2}, {2, 3}, {2, 7}, {2, 8}, {2, 9}, {2, 9}},
[]model.ShownTile{{config.ConcealedKong, []model.Tile{{0, 3}, {0, 3}, {0, 3}, {0, 3}}}},
model.Tile{2, 6},
false,
} //缺门
b.ResetTimer()
for i := 0; i < b.N; i++ {
j.CanWin(test.hand, test.shown, test.newTile)
}
}