package utils import ( "encoding/binary" "errors" "f1-game/internal/types" "math/rand" "os" "strings" "unicode/utf8" cherryFile "github.com/cherry-game/cherry/extend/file" cstring "github.com/cherry-game/cherry/extend/string" ) func GetI32MapRandKey(maps map[int32]int32) (int32, int32, bool) { var sortKeys []int32 for k := range maps { sortKeys = append(sortKeys, k) } randIndex := int32(rand.Intn(len(maps) - 1)) randKey := sortKeys[randIndex] val, found := maps[randKey] if found { return randKey, val, true } return 0, 0, false } func ListDir(dirPath string, suffix string) (files []string, err error) { files = make([]string, 0, 10) judgePath, found := cherryFile.JudgePath(dirPath) if !found { return nil, errors.New("path error") } dir, err := os.ReadDir(judgePath) if err != nil { return nil, err } suffix = strings.ToLower(suffix) for _, fi := range dir { if fi.IsDir() { continue } if strings.HasSuffix(strings.ToLower(fi.Name()), suffix) { files = append(files, fi.Name()) } } return files, nil } // CutLength 截取指定长度的字符串 func CutLength(str string, length int) string { // var i, n int // for i = range str { // if length == n { // break // } // n++ // } // return str[:i] if utf8.RuneCountInString(str) <= length { return str } return string([]rune(str)[:length]) } func SubStr(str string, start int, length int) (result string) { s := []rune(str) total := len(s) if total == 0 { return } // 允许从尾部开始计算 if start < 0 { start = total + start if start < 0 { return } } if start > total { return } // 到末尾 if length < 0 { length = total } end := start + length if end > total { result = string(s[start:]) } else { result = string(s[start:end]) } return } // 检查字符长度是否有效 func CheckStrLen(str string, lenLimit int32) bool { strLen := int32(utf8.RuneCountInString(str)) //判断字符长度是否有效 if strLen < 1 { return false } //判断字符长度是否超出限制 if strLen > lenLimit { return false } return true } func GetPointID(x, y int32) int64 { return int64(x)<<32 | int64(y) } // 计算两个矩形区域的交叉区域 func GetCrossArea(area1Min, area1Max, area2Min, area2Max types.Point) (leftTop, rightBottom types.Point, ok bool) { // 计算投影 leftTop.X = max(area1Min.X, area2Min.X) leftTop.Y = max(area1Min.Y, area2Min.Y) rightBottom.X = min(area1Max.X, area2Max.X) rightBottom.Y = min(area1Max.Y, area2Max.Y) // 判断是否有交集 ok = leftTop.X < rightBottom.X && leftTop.Y < rightBottom.Y return } func Int64ToBytesFixed(n int64, byteOrder binary.ByteOrder) []byte { buf := make([]byte, 8) // int64占8字节 byteOrder.PutUint64(buf, uint64(n)) return buf } // ToStringSlice 将任意类型转换为字符串切片 func ToStringSlice(val ...any) []string { var result []string for _, item := range val { v := cstring.ToString(item) result = append(result, v) } return result }