-
Notifications
You must be signed in to change notification settings - Fork 0
/
ui.py
64 lines (49 loc) · 2.08 KB
/
ui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
## adsorb - user interface for human player
import math
import curses
def get_action(stdscr, player, board, py, px):
while True:
key = stdscr.getch()
if key == curses.KEY_MOUSE:
_, x, y, _, _ = curses.getmouse()
_x, _y = x - px, y - py
_x = math.floor(_x / 2)
try:
# since -1 is a valid index the player can click
# on a square above or to the left of the board
# and still have it count as a move
if _x < 0 or _y < 0:
raise IndexError
# updating the board is a two-step process. First
# player's select a square and second they decide
# what action to take.
v = board.board[_y][_x]
if v == '0':
# player clicked on an empty square
# add a '+' sign to indicate that 'place'
# is a valid next move
return 'MARK_PLACE', _y, _x, 0
elif v == '+':
return 'PLACE', _y, _x, 0
elif v == str(player + 1):
# player clicked on an own square
# add a '-' sign and arrows to indicate that
# 'remove' and 'copy' are valid next moves
return 'MARK_COPY_AND_REMOVE', _y, _x, 0
elif v == '-':
return 'REMOVE', _y, _x, 0
elif v == '↑':
return 'COPY', _y + 1, _x, 'UP'
elif v == '↓':
return 'COPY', _y - 1, _x, 'DOWN'
elif v == '←':
return 'COPY', _y, _x + 1, 'LEFT'
elif v == '→':
return 'COPY', _y, _x - 1, 'RIGHT'
except IndexError:
# player clicked outside of the board area
pass
elif key == 32: # <SPACE> key is 'PASS'
return 'PASS', 0, 0, 0
elif key == 27: # <ESCAPE> key is 'QUIT'
return 'QUIT', 0, 0, 0