Exemple #1
0
// 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)
		}
	}
}