// Input handles user input. func Input(win wde.Window, g *grid.Grid, render chan bool) { // turnB keeps track of whose turn it is. When true, it's player B's turn. var turnB bool // When end is true the game has ended. var end bool // mde handles mouse down events. mde := func(e wde.MouseDownEvent) { if e.Which == wde.LeftButton { // Left click places a marker. if end { // Game has already ended. return } // Translate pixel location to grid coordinate. col, row, err := screenToCoord(g, e.Where.X, e.Where.Y) if err != nil { ///log.Println(err) return } // Place marker. player := markA if turnB { player = markB } err = g.Place(col, row, player) if err != nil { ///log.Println(err) return } turnB = !turnB render <- true // Check if the game has ended. end = true markWin := g.Check() if markWin != grid.MarkNone { fmt.Printf("===> %q wins :)\n", markWin) return } loop: for col := 0; col < g.Width(); col++ { for row := 0; row < g.Height(); row++ { if g[col][row] == grid.MarkNone { end = false break loop } } } if end { fmt.Println("===> no winner :(") } } else if e.Which == wde.MiddleButton { // Middle click clears the grid. g.Clear() turnB = false end = false render <- true } } for e := range win.EventChan() { switch v := e.(type) { case wde.CloseEvent: return case wde.MouseDownEvent: mde(v) } } }