Fix: shenyang-rule
This commit is contained in:
+19
-6
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user