func calcKiki(b *Node) [][]int { kiki := [][]int{make([]int, 81), make([]int, 81)} var moveToBuf [32]shogi.Pos for y := 1; y <= shogi.BoardSize; y++ { for x := 1; x <= shogi.BoardSize; x++ { pos := shogi.MakePos(x, y) koma := b.Cell(pos) if koma == shogi.Blank { continue } for _, to := range ListKikiInto(b, pos, moveToBuf[0:0]) { kiki[koma.Player()][to.Int()] += 1 } } } /* for pl:=0; pl<2; pl++ { for y:=1; y<=shogi.BoardSize; y++ { for x:=shogi.BoardSize; x>=1; x-- { fmt.Print( kiki[pl][shogi.MakePos(x,y).Int()], "," ) } fmt.Println( "" ) } fmt.Println( "" ) } */ return kiki }
func kikiStraight(b *Node, list *[]shogi.Pos, pos shogi.Pos, player shogi.Player, dy int, dx int) { for { pos = shogi.MakePos(pos.X()+dx, pos.Y()+dy) if !pos.InSide() { break } koma := b.Cell(pos) *list = append(*list, pos) if koma != shogi.Blank { break } } }
func calcKomaPoint(b *Node) int { p := 0 for y := 1; y <= shogi.BoardSize; y++ { for x := 1; x <= shogi.BoardSize; x++ { koma := b.Cell(shogi.MakePos(x, y)) if koma == shogi.Blank { continue } p += POINT[koma.Kind()] * -koma.Player().Dir() } } for pl := shogi.Sente; pl <= shogi.Gote; pl++ { for koma, num := range b.Moti()[pl] { p += POINT[koma] * -pl.Dir() * int(num) } } return p }
func CalcKikiPoint(b *Node, kiki [][]int) int { p := 0 for y := 1; y <= shogi.BoardSize; y++ { for x := 1; x <= shogi.BoardSize; x++ { pos := shogi.MakePos(x, y) koma := b.Cell(pos) if koma == shogi.Blank { continue } idx := pos.Int() pl := koma.Player() if kiki[pl][idx] < kiki[pl.Switch()][idx] { p += KikiKomaPoint[koma.Kind()] * pl.Dir() * 10 } else if koma.Kind() != shogi.OU && kiki[pl][idx] > 0 { p += KikiKomaPoint[koma.Kind()] * -pl.Dir() } } } return p / 100 }
func ListKikiInto(b *Node, pos shogi.Pos, r []shogi.Pos) []shogi.Pos { koma := b.Cell(pos) if koma.Kind() == shogi.NN { return r } // 通常の移動 dir := koma.Player().Dir() for _, to := range shogi.KomaMoveList[koma.Kind()] { to_pos := shogi.MakePos(pos.X()+to[0], pos.Y()+dir*to[1]) if !to_pos.InSide() { continue } to_koma := b.Cell(to_pos) if to_koma != shogi.Blank && to_koma.Player() == koma.Player() { continue } r = append(r, to_pos) } // 複数マス直進する移動 switch koma.Kind() { case shogi.KY: kikiStraight(b, &r, pos, koma.Player(), koma.Player().Dir(), 0) case shogi.HI, shogi.RY: kikiStraight(b, &r, pos, koma.Player(), 1, 0) kikiStraight(b, &r, pos, koma.Player(), -1, 0) kikiStraight(b, &r, pos, koma.Player(), 0, 1) kikiStraight(b, &r, pos, koma.Player(), 0, -1) case shogi.KA, shogi.UM: kikiStraight(b, &r, pos, koma.Player(), 1, 1) kikiStraight(b, &r, pos, koma.Player(), -1, 1) kikiStraight(b, &r, pos, koma.Player(), 1, -1) kikiStraight(b, &r, pos, koma.Player(), -1, -1) } return r }