game_sync/gamerule/hunting/logic_test.go

338 lines
8.8 KiB
Go

package hunting
import (
"encoding/json"
"fmt"
"math/rand"
"sort"
"strconv"
"testing"
"time"
)
var rd *rand.Rand
func init() {
rd = rand.New(rand.NewSource(time.Now().UnixNano()))
}
func CreateTestData() {
for i := 0; i < 1; i++ {
level := rd.Intn(3) + 1
data, b := NewGems(rd, level)
s1, _ := json.Marshal(data)
fmt.Printf("%d,%d\n", level, b)
result := make([][]int32, len(data))
for i := 0; i < len(result); i++ {
result[i] = make([]int32, len(data[i]))
copy(result[i], data[i])
}
index := Check(level, data)
for _, v := range index {
for j := 0; j < len(v); j++ {
x, y := GetXY(level, v[j])
result[y][x] = -22
}
}
s2, _ := json.Marshal(result)
for j := len(data) - 1; j >= 0; j-- {
fmt.Printf("%v\t%v\n", toStringLine(data[j]), toStringLine(result[j]))
}
fmt.Println("测试数据:")
fmt.Printf("{\"%s\",\"%s\",\"%s\"},\n", s1, s2, fmt.Sprint(level))
}
}
func TestCheck(t *testing.T) {
//CreateTestData()
testData := [][]string{
{"[[2,1,1,1],[1,2,4,3],[1,3,3,1],[3,1,2,4],[1,2,5,1]]", "[[2,1,1,1],[1,2,4,3],[1,3,3,1],[3,1,2,4],[1,2,5,1]]", "1"},
{"[[3,2,16,1],[1,1,1,1],[1,3,1,2],[1,2,1,2],[2,1,3,2]]", "[[3,2,-22,1],[1,1,1,1],[1,3,1,2],[1,2,1,2],[2,1,3,2]]", "1"},
{"[[6,6,9,8,8],[7,6,8,7,6],[9,7,6,7,9],[7,7,9,8,7],[8,6,6,6,8],[8,6,7,6,7]]", "[[6,6,9,8,8],[7,6,8,7,6],[9,7,6,7,9],[7,7,9,8,7],[8,6,6,6,8],[8,6,7,6,7]]", "2"},
{"[[1,2,3,2],[3,2,1,1],[1,2,1,3],[1,2,1,1],[1,2,3,3]]", "[[1,-22,3,2],[3,-22,-22,-22],[1,-22,-22,3],[1,-22,-22,-22],[1,2,3,3]]", "1"},
{"[[4,1,1,2],[1,1,3,3],[1,3,1,1],[1,3,4,1],[1,3,4,1]]", "[[4,-22,-22,2],[-22,-22,3,3],[-22,3,1,1],[-22,3,4,1],[1,3,4,1]]", "1"},
{"[[4,1,1,3],[2,1,3,2],[3,3,1,3],[1,5,1,2],[4,3,2,1]]", "[[4,1,1,3],[2,1,3,2],[3,3,1,3],[1,5,1,2],[4,3,2,1]]", "1"},
{"[[11,12,11,12,11,12],[13,13,11,11,12,11],[15,11,12,13,13,12],[12,12,12,12,13,15],[15,14,13,12,11,15],[12,13,12,11,11,11],[12,11,12,13,12,14]]", "[[11,12,11,12,11,12],[13,13,11,11,12,11],[15,11,-22,13,13,12],[-22,-22,-22,-22,13,15],[15,14,13,-22,11,15],[12,13,12,11,11,11],[12,11,12,13,12,14]]", "3"},
{"[[11,12,13,11,11,11],[11,11,11,11,11,14],[13,15,11,11,11,11],[12,12,13,11,12,13],[11,11,13,11,12,13],[12,13,13,14,11,12],[11,11,12,15,12,11]]", "[[-22,12,13,-22,-22,-22],[-22,-22,-22,-22,-22,14],[13,15,-22,-22,-22,-22],[12,12,13,-22,12,13],[11,11,13,-22,12,13],[12,13,13,14,11,12],[11,11,12,15,12,11]]", "3"},
{"[[11,11,11,12,15,13],[11,12,15,11,12,12],[13,12,15,13,11,11],[13,11,12,15,13,12],[13,13,12,12,11,11],[12,11,12,12,12,11],[11,13,12,12,12,11]]", "[[11,11,11,12,15,13],[11,12,15,11,12,12],[13,12,15,13,11,11],[13,11,-22,15,13,12],[13,13,-22,-22,11,11],[12,11,-22,-22,-22,11],[11,13,12,12,12,11]]", "3"},
{"[[13,12,12,12,12,13],[11,13,12,13,13,13],[11,14,11,12,12,12],[13,11,14,12,11,12],[11,14,11,15,14,12],[11,14,11,11,12,11],[11,13,13,11,13,13]]", "[[13,12,12,12,12,13],[11,13,12,13,13,13],[11,14,11,-22,-22,-22],[13,11,14,-22,11,-22],[11,14,11,15,14,-22],[11,14,11,11,12,11],[11,13,13,11,13,13]]", "3"},
{"[[7,8,7,9,10],[7,6,6,6,7],[8,6,8,6,7],[7,6,7,7,7],[7,6,7,6,6],[7,7,6,6,7]]", "[[7,8,7,9,10],[7,-22,-22,-22,-22],[8,-22,8,-22,-22],[7,-22,-22,-22,-22],[7,-22,-22,6,6],[7,7,6,6,7]]", "2"},
{"[[16,6,7,7,6],[8,6,6,7,6],[8,7,9,6,8],[7,8,8,6,6],[7,6,9,6,7],[8,8,6,6,10]]", "[[-22,6,7,7,6],[8,6,6,7,6],[8,7,9,6,8],[7,8,8,6,6],[7,6,9,6,7],[8,8,6,6,10]]", "2"},
}
for _, v := range testData {
var gems, result [][]int32
json.Unmarshal([]byte(v[0]), &gems)
level, _ := strconv.Atoi(v[2])
result = make([][]int32, len(gems))
for i := 0; i < len(result); i++ {
result[i] = make([]int32, len(gems[i]))
copy(result[i], gems[i])
}
index := Check(level, gems)
for _, v := range index {
for j := 0; j < len(v); j++ {
x, y := GetXY(level, v[j])
result[y][x] = -22
}
}
s, _ := json.Marshal(result)
s2 := string(s)
if v[1] != string(s) {
var su [][]int32
json.Unmarshal([]byte(v[1]), &su)
fmt.Printf("%-12s\t%-12s\t%-12s\n", "Gems:", "want:", "result:")
for i := len(gems) - 1; i >= 0; i-- {
fmt.Printf("%v\t%v\t%v\n", toStringLine(gems[i]), toStringLine(su[i]), toStringLine(result[i]))
}
fmt.Println("正确数据:")
fmt.Printf("{\"%s\",\"%s\",\"%s\"},\n", v[0], s2, fmt.Sprint(level))
t.Error("1")
}
}
}
func testDrop(data [][]int32) []int {
var ret []int
if len(data) == 0 {
return ret
}
colNum := len(data[0])
rowNum := len(data)
result := make([][]int32, len(data))
for i := 0; i < len(result); i++ {
result[i] = make([]int32, len(data[i]))
copy(result[i], data[i])
}
var y int
for i := 0; i < colNum; i++ {
y = 0
for j := 0; j < rowNum; j++ {
if data[j][i] != NoGem {
result[y][i] = data[j][i]
y++
}
}
}
for i := 0; i < colNum; i++ {
for j := 0; j < rowNum; j++ {
if data[j][i] == NoGem {
ret = append(ret, int(xyToIndex(colNum, i, j)))
}
}
}
sort.Slice(ret, func(i, j int) bool {
return ret[i] < ret[j]
})
return ret
}
func TestDrop(t *testing.T) {
for i := 0; i < 1000; i++ {
// 随机创建宝石
level := rd.Intn(3) + 1
data, _ := NewGems(rd, level)
//fmt.Printf("%d,%d\n", level, b)
//fmt.Println(toString(data))
// 随机删除宝石
n := LevelGemsNum(level)
delNum := rd.Intn(n)
for i := 0; i < delNum; i++ {
x, y := GetXY(level, rd.Intn(n))
data[y][x] = NoGem
}
//fmt.Println(toString(data))
// 对比测试结果
index := Drop(data)
//fmt.Println(toString(data))
res := testDrop(data)
//fmt.Println(index)
//fmt.Println(res)
if len(index) != len(res) {
t.Error("1")
}
for j := 0; j < len(index); j++ {
if index[j] != res[j] {
t.Error("2")
}
}
}
}
func TestNoLink(t *testing.T) {
level := 3
n := 10000
sum := 0
for j := 0; j < n; j++ {
i := 0
for {
i++
data, b := NewGems(rd, level)
if b > 0 {
continue
}
del := Check(level, data)
var rate int64
for j := 0; j < len(del); j++ {
x, y := GetXY(level, del[j][0])
rate += GemsRate(level, len(del[j]), data[y][x])
}
if rate == 0 {
sum += i
break
}
}
}
fmt.Println("平均搜索次数:", sum/n) // 平均搜索次数: 4
}
func TestLess(t *testing.T) {
level := 3
n := 10000
sum := 0
for j := 0; j < n; j++ {
i := 0
for {
i++
data, b := NewGems(rd, level)
if b > 0 {
continue
}
del := Check(level, data)
var rate int64
for j := 0; j < len(del); j++ {
x, y := GetXY(level, del[j][0])
rate += GemsRate(level, len(del[j]), data[y][x])
}
if rate < 10 {
sum += i
break
}
}
}
fmt.Println("平均搜索次数:", sum/n) // 平均搜索次数: 3
}
func TestAddGemsLess(t *testing.T) {
var data [][]int32
var b int32 = 1
// 随机创建宝石
level := rd.Intn(3) + 1
for b > 0 {
data, b = NewGems(rd, level)
}
// 随机删除宝石
n := LevelGemsNum(level)
delNum := rd.Intn(n)
for i := 0; i < delNum; i++ {
x, y := GetXY(level, rd.Intn(n))
data[y][x] = NoGem
}
fmt.Println(ToString(data))
// 对比测试结果
index := Drop(data)
fmt.Println(ToString(data))
gems := AddGemsLess(rd, level, data, index)
for i := 0; i < len(index); i++ {
x, y := GetXY(level, index[i])
data[y][x] = gems[i]
}
fmt.Println(ToString(data))
}
func TestNewGemsLessBomb(t *testing.T) {
level := rd.Intn(3) + 1
data := NewGemsLessBomb(rd, level)
fmt.Println(ToString(data))
}
func TestNewGemsNoLink(t *testing.T) {
var i int
var arr [][]int
var data [][]int32
for len(arr) == 0 && i < 10000 {
data = NewGemsNoLink(rd, 3)
arr = Check(3, data)
i++
}
if len(arr) > 0 {
fmt.Println(ToString(data))
t.Error()
}
}
func TestNewGemsLess(t *testing.T) {
data := NewGemsNoLink(rd, 1)
fmt.Println(ToString(data))
}
func TestGemsC(t *testing.T) {
data := GemsC(rd, 2)
fmt.Println(ToString(data))
}
func TestAddGemsLess2(t *testing.T) {
n := 1
for i := 0; i < n; {
level := 3
data := GemsC(rd, level)
AddGemsLess2(level, data, nil)
arr := Check(level, data)
if len(arr) == 1 {
i++
fmt.Println(ToString(data))
for _, v := range arr[0] {
x, y := GetXY(level, v)
data[y][x] = 0
}
fmt.Println(ToString(data))
index := Drop(data)
fmt.Println(ToString(data))
gems := AddGemsLess2(level, data, index)
for i := 0; i < len(index); i++ {
x, y := GetXY(level, index[i])
data[y][x] = gems[i]
}
if len(Check(level, data)) > 0 {
t.Error()
}
}
}
}
func TestRateGems(t *testing.T) {
//for k, v := range RateGems(1, 80) {
// fmt.Println(k, v)
//}
data := NewGemsRate(rd, 1, 6000)
fmt.Println(ToString(data))
}
func TestNewGemsRate(t *testing.T) {
for i := 1; i <= 3; i++ {
for _, v := range rate {
data := NewGemsRate(rd, i, v)
del := Check(i, data)
if len(del) == 0 {
continue
}
var rate int64
for j := 0; j < len(del); j++ {
x, y := GetXY(i, del[j][0])
rate += GemsRate(i, len(del[j]), data[y][x])
}
//fmt.Println(i, v, rate)
//fmt.Println(ToString(data))
if rate != int64(v) {
t.Error("error")
}
}
}
}