Player goes first. Click a gray square to set the value. Giga goes second. She'll try to block you if she can, and if not, she'll play in a row where she can win. If Giga can't win on her turn, she gives up.
There is a separate list for each way to win: 3 rows, 3 cols, and 2 diagonals. When each sprite is clicked, it updates each list it belongs to with the value that was selected. So to check for a win, all you have to do is check whether any of the lists contains all of the same value. Giga's logic is incomplete. She knows how to check all the lists for ways she could win, but she only knows how to check the row lists for whether she should block the player from winning. (I'd have implemented blocking logic for all the lists, but it gets really tedious since you can't pass lists as variables.)