139 lines
2.6 KiB
Go
139 lines
2.6 KiB
Go
package controller
|
|
|
|
import (
|
|
"log"
|
|
"math/rand"
|
|
"reflect"
|
|
"sort"
|
|
|
|
"github.com/kataras/iris/v12"
|
|
"github.com/kataras/iris/v12/sessions"
|
|
)
|
|
|
|
type GameController struct {
|
|
Ctx iris.Context
|
|
Session *sessions.Session
|
|
}
|
|
|
|
func play() {
|
|
|
|
slice := createCardGroup()
|
|
washCard(slice)
|
|
// log.Println(slice)
|
|
|
|
players := map[int][]card{
|
|
0: {},
|
|
1: {},
|
|
2: {},
|
|
}
|
|
count := 17
|
|
players[0] = slice[:count]
|
|
slice = slice[count:]
|
|
players[1] = slice[:count]
|
|
slice = slice[count:]
|
|
players[2] = slice[:count]
|
|
slice = slice[count:]
|
|
|
|
// t := 0
|
|
// for {
|
|
// length := len(slice)
|
|
// if length == 0 {
|
|
// break
|
|
// }
|
|
// var i int = 0
|
|
// if length != 1 {
|
|
// i = rand.Intn(length - 1)
|
|
// }
|
|
// index := t % 3
|
|
// players[index] = append(players[index], slice[i])
|
|
// slice = append(slice[:i], slice[i+1:]...)
|
|
// t++
|
|
|
|
// }
|
|
player1 := players[0]
|
|
player2 := players[1]
|
|
player3 := players[2]
|
|
sort.Sort(cards(player1))
|
|
sort.Sort(cards(player2))
|
|
sort.Sort(cards(player3))
|
|
log.Println(player1)
|
|
log.Println(player2)
|
|
log.Println(player3)
|
|
log.Println(slice)
|
|
|
|
log.Println(len(player1), len(player2), len(player3), len(slice))
|
|
|
|
}
|
|
|
|
type card struct {
|
|
Icon string
|
|
Numb string
|
|
// IconIdx int
|
|
// NumbIdx int
|
|
Score int
|
|
}
|
|
|
|
type cards []card
|
|
|
|
func (c cards) Len() int {
|
|
return len(c)
|
|
}
|
|
|
|
func (c cards) Swap(i, j int) {
|
|
c[i], c[j] = c[j], c[i]
|
|
}
|
|
|
|
func (c cards) Less(i, j int) bool {
|
|
return c[i].Score < c[j].Score
|
|
}
|
|
|
|
func createCardGroup() []card {
|
|
ico := []string{"方块", "梅花", "红心", "黑桃"}
|
|
num := []string{"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}
|
|
slice := []card{}
|
|
for numIdx, numb := range num {
|
|
// slice = append(slice, ico[0]+v, ico[1]+v, ico[2]+v, ico[3]+v)
|
|
for icoIdx, icon := range ico {
|
|
length := len(slice)
|
|
preScoreMax := 0
|
|
if length > 0 {
|
|
preScoreMax = slice[length-1].Score
|
|
}
|
|
|
|
score := (numIdx+1)*(icoIdx+1) + preScoreMax
|
|
c := card{
|
|
Icon: icon,
|
|
Numb: numb,
|
|
// IconIdx: icoIdx,
|
|
// NumbIdx: numIdx,
|
|
Score: score,
|
|
}
|
|
slice = append(slice, c)
|
|
}
|
|
|
|
}
|
|
slice = append(slice, card{Icon: "小王", Numb: "1", Score: slice[len(slice)-1].Score + (14 * 1)})
|
|
slice = append(slice, card{Icon: "大王", Numb: "2", Score: slice[len(slice)-1].Score + (14 * 2)})
|
|
return slice
|
|
}
|
|
|
|
func washCard(slice interface{}) {
|
|
//切片乱序
|
|
rv := reflect.ValueOf(slice)
|
|
if rv.Type().Kind() != reflect.Slice {
|
|
return
|
|
}
|
|
|
|
length := rv.Len()
|
|
if length < 2 {
|
|
return
|
|
}
|
|
|
|
swap := reflect.Swapper(slice)
|
|
// rand.Seed(time.Now().Unix())
|
|
for i := length - 1; i >= 0; i-- {
|
|
j := rand.Intn(length)
|
|
swap(i, j)
|
|
}
|
|
}
|