コード例 #1
0
ファイル: think.go プロジェクト: haramako/work
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
}
コード例 #2
0
ファイル: think.go プロジェクト: haramako/work
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
		}
	}
}
コード例 #3
0
ファイル: think.go プロジェクト: haramako/work
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
}
コード例 #4
0
ファイル: think.go プロジェクト: haramako/work
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
}
コード例 #5
0
ファイル: think.go プロジェクト: haramako/work
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
}