Skip to content

Instantly share code, notes, and snippets.

@itchyny
Last active March 13, 2018 13:46
Show Gist options
  • Save itchyny/8b1f3414805963df477c48f343688a73 to your computer and use it in GitHub Desktop.
Save itchyny/8b1f3414805963df477c48f343688a73 to your computer and use it in GitHub Desktop.
詰将棋 gif生成
diff --git a/util/image/generate.go b/util/image/generate.go
index 81c69f7..9635b87 100644
--- a/util/image/generate.go
+++ b/util/image/generate.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"image"
 	"image/color"
+	"image/color/palette"
 	"image/png"
 	"math/rand"
 	"time"
@@ -76,7 +77,7 @@ func init() {
 }
 
 // Generate function
-func Generate(state *shogi.State, options *StyleOptions) (image.Image, error) {
+func Generate(state *shogi.State, options *StyleOptions) (*image.Paletted, error) {
 	options = checkOptions(options)
 	boardImg, err := boardImage(options.Board)
 	if err != nil {
@@ -90,7 +91,8 @@ func Generate(state *shogi.State, options *StyleOptions) (image.Image, error) {
 	xStep := 387.0 / 9.0
 	yStep := 432.0 / 9.0
 	xOffset := 138
-	dst := image.NewRGBA(image.Rectangle{Min: image.ZP, Max: boardImg.Bounds().Size().Add(image.Pt(276, 0))})
+	// dst := image.NewRGBA(image.Rectangle{Min: image.ZP, Max: boardImg.Bounds().Size().Add(image.Pt(276, 0))})
+	dst := image.NewPaletted(image.Rectangle{Min: image.ZP, Max: boardImg.Bounds().Size().Add(image.Pt(276, 0))}, palette.WebSafe)
 	for i := 0; i < dst.Bounds().Dx(); i++ {
 		for j := 0; j < dst.Bounds().Dy(); j++ {
 			dst.Set(i, j, color.White)
package main

import (
	"fmt"
	"image"
	"image/gif"
	"log"
	"os"
	"strings"

	"github.com/sugyan/shogi/format/csa"
	"github.com/sugyan/shogi/logic/problem/generator"
	"github.com/sugyan/shogi/logic/problem/solver"
	"github.com/sugyan/shogi/record"
	shogiImage "github.com/sugyan/shogi/util/image"
)

func main() {
	state, _ := generator.Generate(generator.Type5)
	answer := solver.Solve(state)

	record := &record.Record{
		State: state,
		Moves: answer,
	}
	println(record.ConvertToString(csa.NewConverter(nil)))

	answerStr, err := state.MoveStrings(answer)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Answer: %s\n", strings.Join(answerStr, " -> "))

	var images []*image.Paletted
	var delays []int
	for i := 0; i <= len(answer); i++ {
		if i > 0 {
			state.Apply(answer[i-1])
		}
		img, err := shogiImage.Generate(state, &shogiImage.StyleOptions{
			Piece: shogiImage.PieceKinki,
		})
		if err != nil {
			log.Fatal(err)
		}
		images = append(images, img)
		if i < len(answer) {
			delays = append(delays, 150)
		} else {
			delays = append(delays, 500)
		}
	}

	out, err := os.Create("out.gif")
	if err != nil {
		log.Fatal(err)
	}
	err = gif.EncodeAll(out, &gif.GIF{
		Image: images,
		Delay: delays,
	})
	if err != nil {
		log.Fatal(err)
	}
	out.Close()
}

Licensed in NYSL

Related links

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment