掉落添加参数

This commit is contained in:
kercylan98 2023-06-05 16:05:45 +08:00
parent d332724ece
commit d97c1653a0
1 changed files with 13 additions and 11 deletions

View File

@ -1,12 +1,13 @@
package g2d package g2d
// SlideDropXY 侧滑掉落特定位置成员 // SlideDropXY 侧滑掉落特定位置成员
func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bool) (dropX, dropY int) { func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(start T, x, y int, data T) bool) (dropX, dropY int) {
width, height := len(matrix), len(matrix[0]) width, height := len(matrix), len(matrix[0])
start := matrix[x][y]
var offsetX, offsetY = -1, 1 var offsetX, offsetY = -1, 1
for { for {
targetX, targetY := x+offsetX, y+offsetY targetX, targetY := x+offsetX, y+offsetY
if targetX < 0 || targetY == height || isStop(targetX, targetY, matrix[targetX][targetY]) { if targetX < 0 || targetY == height || isStop(start, targetX, targetY, matrix[targetX][targetY]) {
dropX, dropY = targetX+1, targetY-1 dropX, dropY = targetX+1, targetY-1
break break
} }
@ -16,7 +17,7 @@ func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bo
offsetX, offsetY = 1, 1 offsetX, offsetY = 1, 1
for dropX != x && dropY != y { for dropX != x && dropY != y {
targetX, targetY := x+offsetX, y+offsetY targetX, targetY := x+offsetX, y+offsetY
if targetX == width || targetY == height || isStop(targetX, targetY, matrix[targetX][targetY]) { if targetX == width || targetY == height || isStop(start, targetX, targetY, matrix[targetX][targetY]) {
dropX, dropY = targetX-1, targetY-1 dropX, dropY = targetX-1, targetY-1
break break
} }
@ -28,7 +29,7 @@ func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bo
// SlideDropX 侧滑掉落一整列 // SlideDropX 侧滑掉落一整列
// - 返回每一个成员的y轴新坐标 // - 返回每一个成员的y轴新坐标
func SlideDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool) (result []int, change bool) { func SlideDropX[T any](matrix [][]T, x int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) {
result = make([]int, len(matrix[x])) result = make([]int, len(matrix[x]))
for y := len(matrix[x]) - 1; y >= 0; y-- { for y := len(matrix[x]) - 1; y >= 0; y-- {
_, dropY := SlideDropXY(matrix, x, y, isStop) _, dropY := SlideDropXY(matrix, x, y, isStop)
@ -42,7 +43,7 @@ func SlideDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool)
// SlideDropY 侧滑掉落一整行 // SlideDropY 侧滑掉落一整行
// - 返回每一个成员的x轴新坐标 // - 返回每一个成员的x轴新坐标
func SlideDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool) (result []int, change bool) { func SlideDropY[T any](matrix [][]T, y int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) {
result = make([]int, len(matrix)) result = make([]int, len(matrix))
for x := 0; x < len(matrix); x++ { for x := 0; x < len(matrix); x++ {
dropX, _ := SlideDropXY(matrix, x, y, isStop) dropX, _ := SlideDropXY(matrix, x, y, isStop)
@ -55,7 +56,7 @@ func SlideDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool)
} }
// SlideDrop 侧滑掉落整个矩阵 // SlideDrop 侧滑掉落整个矩阵
func SlideDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result [][][2]int, change bool) { func SlideDrop[T any](matrix [][]T, isStop func(start T, x, y int, data T) bool) (result [][][2]int, change bool) {
result = make([][][2]int, len(matrix)) result = make([][][2]int, len(matrix))
for x := 0; x < len(matrix); x++ { for x := 0; x < len(matrix); x++ {
ys := make([][2]int, len(matrix[x])) ys := make([][2]int, len(matrix[x]))
@ -70,12 +71,13 @@ func SlideDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result
} }
// VerticalDropXY 垂直掉落特定位置成员 // VerticalDropXY 垂直掉落特定位置成员
func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bool) (dropX, dropY int) { func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(start T, x, y int, data T) bool) (dropX, dropY int) {
height := len(matrix[0]) height := len(matrix[0])
start := matrix[x][y]
var offsetY = 1 var offsetY = 1
for { for {
testY := y + offsetY testY := y + offsetY
if testY == height || isStop(x, testY, matrix[x][testY]) { if testY == height || isStop(start, x, testY, matrix[x][testY]) {
return x, testY - 1 return x, testY - 1
} }
offsetY++ offsetY++
@ -84,7 +86,7 @@ func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T)
// VerticalDropX 垂直掉落一整列 // VerticalDropX 垂直掉落一整列
// - 返回每一个成员的y轴新坐标 // - 返回每一个成员的y轴新坐标
func VerticalDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool) (result []int, change bool) { func VerticalDropX[T any](matrix [][]T, x int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) {
result = make([]int, len(matrix[x])) result = make([]int, len(matrix[x]))
for y := len(matrix[x]) - 1; y >= 0; y-- { for y := len(matrix[x]) - 1; y >= 0; y-- {
_, dropY := VerticalDropXY(matrix, x, y, isStop) _, dropY := VerticalDropXY(matrix, x, y, isStop)
@ -98,7 +100,7 @@ func VerticalDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) boo
// VerticalDropY 垂直掉落一整行 // VerticalDropY 垂直掉落一整行
// - 返回每一个成员的x轴新坐标 // - 返回每一个成员的x轴新坐标
func VerticalDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool) (result []int, change bool) { func VerticalDropY[T any](matrix [][]T, y int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) {
result = make([]int, len(matrix)) result = make([]int, len(matrix))
for x := 0; x < len(matrix); x++ { for x := 0; x < len(matrix); x++ {
dropX, _ := VerticalDropXY(matrix, x, y, isStop) dropX, _ := VerticalDropXY(matrix, x, y, isStop)
@ -111,7 +113,7 @@ func VerticalDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) boo
} }
// VerticalDrop 垂直掉落整个矩阵 // VerticalDrop 垂直掉落整个矩阵
func VerticalDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result [][][2]int, change bool) { func VerticalDrop[T any](matrix [][]T, isStop func(start T, x, y int, data T) bool) (result [][][2]int, change bool) {
result = make([][][2]int, len(matrix)) result = make([][][2]int, len(matrix))
for x := 0; x < len(matrix); x++ { for x := 0; x < len(matrix); x++ {
ys := make([][2]int, len(matrix[x])) ys := make([][2]int, len(matrix[x]))