package main import ( "image" "image/color" "image/draw" "math/rand" "time" "github.com/faiface/gui" "github.com/faiface/gui/win" "github.com/faiface/mainthread" ) func EqualColors(c1, c2 color.Color) bool { r1, g1, b1, a1 := c1.RGBA() r2, g2, b2, a2 := c2.RGBA() return r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2 } var Colors = []color.Color{ gui.HexToColor("#E53935"), gui.HexToColor("#F06292"), gui.HexToColor("#9C27B0"), gui.HexToColor("#673AB7"), gui.HexToColor("#3F51B5"), gui.HexToColor("#2196F3"), gui.HexToColor("#29B6F6"), gui.HexToColor("#00BCD4"), gui.HexToColor("#009688"), gui.HexToColor("#4CAF50"), gui.HexToColor("#8BC34A"), gui.HexToColor("#CDDC39"), gui.HexToColor("#FFEB3B"), gui.HexToColor("#FFC107"), gui.HexToColor("#FF9800"), gui.HexToColor("#8D6E63"), gui.HexToColor("#9E9E9E"), gui.HexToColor("#607D8B"), } type PairMsg struct { Color color.Color Resp chan<- bool } func Tile(env gui.Env, pair chan PairMsg, r image.Rectangle, clr color.Color) { redraw := func(covered float64) func(draw.Image) image.Rectangle { return func(drw draw.Image) image.Rectangle { coveredY := int(float64(r.Dy()) * covered) bottomR := r bottomR.Min.Y = bottomR.Max.Y - coveredY topR := r topR.Max.Y = bottomR.Min.Y draw.Draw(drw, bottomR, &image.Uniform{gui.HexToColor("#37474F")}, image.ZP, draw.Src) draw.Draw(drw, topR, &image.Uniform{clr}, image.ZP, draw.Src) return r } } env.Draw() <- redraw(1.0) for event := range env.Events() { switch event := event.(type) { case win.MoDown: if event.Point.In(r) { for c := 32; c >= 0; c-- { env.Draw() <- redraw(float64(c) / 32) time.Sleep(time.Second / 32 / 4) } var correct bool resp := make(chan bool) select { case pair <- PairMsg{clr, resp}: correct = <-resp case msg := <-pair: time.Sleep(time.Second / 2) correct = EqualColors(clr, msg.Color) msg.Resp <- correct } if correct { close(env.Draw()) return } for c := 0; c <= 32; c++ { env.Draw() <- redraw(float64(c) / 32) time.Sleep(time.Second / 32 / 4) } } } } } func run() { rand.Seed(time.Now().UnixNano()) w, err := win.New(win.Title("Pexeso"), win.Size(600, 600)) if err != nil { panic(err) } mux, env := gui.NewMux(w) var colors []color.Color for _, clr := range Colors { colors = append(colors, clr, clr) } rand.Shuffle(len(colors), func(i, j int) { colors[i], colors[j] = colors[j], colors[i] }) env.Draw() <- func(drw draw.Image) image.Rectangle { r := image.Rect(0, 0, 600, 600) draw.Draw(drw, r, &image.Uniform{gui.HexToColor("#CFD8DC")}, image.ZP, draw.Src) return r } pair := make(chan PairMsg) i := 0 for x := 0; x < 600; x += 100 { for y := 0; y < 600; y += 100 { go Tile(mux.MakeEnv(), pair, image.Rect( x+10, y+10, x+90, y+90, ), colors[i]) i++ } } for event := range env.Events() { switch event.(type) { case win.WiClose: close(env.Draw()) } } } func main() { mainthread.Run(run) }