## Attachment 'marijn_guyon_tdd_dojo.py'

Download

```   1 from nose.tools import assert_equals
2
3
4 def legal_moves(board, player):
5     """
6     Given a board encoded as a list of strings and a player char
7     returns pairs identifying positions of legal moves for given player
8     and given situation on the board.
9     """
10     result = []
11     b = board2dict(board)
12     pieces = find_color(b, player)
13     for piece in pieces:
14         for neighbour in  find_different_neighbours(b, piece):
15             vd = valid_direction(b, piece, neighbour)
16             if not vd: continue
17             result.append(vd)
18     return sorted(set(result))
19
20 TEST_BOARD = ["....",
21               ".bw.",
22               ".wb.",
23               "...."]
24
25 CASE1 = [     "....",
26               ".w..",
27               "bww.",
28               "wb.."]
29
30 CASE2 = [     ".wb",
31               "w..",
32               "b.."]
33
34 CASE3 = [     ".wb.",
35               ".bw."]
36
37 CASE4 = [     ".bbb",
38               ".bwb",
39               ".bbb"]
40
41 def valid_direction(board, piece, neighbour):
42     r1, c1 = piece
43     r2, c2 = neighbour
44
45     diff1, diff2 = r2-r1, c2-c1
46     r, c = r2, c2
47     color = board[piece]
48
49     while True:
50         r += diff1
51         c += diff2
52         target = r,c
53
54         try:
55             if board[target] == '.':
56                 return target
57             if board[target] == color:
58                 return
59         except KeyError:
60             return
61
62
63
64 def find_color(board, find_color):
65     results = []
66     for piece, color in board.items():
67         if color == find_color:
68             results.append(piece)
69     results.sort()
70     return results
71
72 def board2dict(board):
73     d = {}
74     for r, row in enumerate(board):
75         for c, col in enumerate(row):
76             d[(r,c)] = col
77     return d
78
79 def find_different_neighbours(board,  piece):
80     results = []
81
82     d = board
83     color = negate_color(d[piece])
84
85     r, c = piece
86
87     for y in (r-1, r, r+1):
88         for x in (c-1, c, c+1):
89             if (r,c) == (y, x): continue
90
91             try:
92                 if d[y, x] == color:
93                     results.append((y, x))
94             except KeyError:
95                 continue
96
97     return results
98
99 def negate_color(color):
100     if color == 'w':
101         return 'b'
102     return 'w'
103
104 def test_simple():
105     assert_equals(legal_moves(TEST_BOARD, "w"), [(0, 1), (1, 0), (2, 3), (3, 2)])
106
107 def test_find_color():
108     assert_equals(find_color(board2dict(TEST_BOARD), 'w'), [(1,2), (2,1)])
109     assert_equals(find_color(board2dict(TEST_BOARD), 'b'), [(1,1), (2,2)])
110
111 def test_find_different_neighbours():
112     assert_equals(find_different_neighbours(board2dict(TEST_BOARD), (1, 1)), [(1,2), (2,1)])
113
114 def test_negate_color():
115     assert_equals(negate_color('w'), 'b')
116     assert_equals(negate_color('b'), 'w')
117
118 def test_board2dict():
119     test_board = [".b",
120                   "w."]
121     expected_dict = {
122         (0,0): '.',
123         (0,1): 'b',
124         (1,0): 'w',
125         (1,1): '.'
126     }
127     assert_equals(board2dict(test_board), expected_dict)
128
129 def test_valid_direction():
130     test_board1 = ["..bbw"]
131     assert_equals(valid_direction(board2dict(test_board1), (0,4), (0,3)), (0,1))
132
133     test_board1 = ["..bbbbw"]
134     assert_equals(valid_direction(board2dict(test_board1), (0,6), (0,5)), (0,1))
135
136     test_board1 = ["..bw"]
137     assert_equals(valid_direction(board2dict(test_board1), (0,3), (0,2)), (0,1))
138
139     assert_equals(valid_direction(board2dict(TEST_BOARD), (2,2), (2,1)), (2,0))
140
141     assert_equals(valid_direction(board2dict(TEST_BOARD), (1,1), (1,2)), (1,3))
142
143     assert_equals(valid_direction(board2dict(TEST_BOARD), (1,1), (2,1)), (3,1))
144
145     assert_equals(valid_direction(board2dict(TEST_BOARD), (2,2), (1,2)), (0,2))
146
147 def test_case1():
148     assert_equals(legal_moves(CASE1, "b"), [(0,1),(0,2),(1,3),(2,3)])
149
150 def test_case2():
151     assert_equals(legal_moves(CASE2, "b"), [(0,0)])
152
153 def test_case3():
154     assert_equals(legal_moves(CASE3, "b"), [(0,0), (1,3)])
155
156 def test_case4():
157     assert_equals(legal_moves(CASE4, "b"), [])
```

## Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
• [get | view] (2010-04-22 10:37:12, 2.2 KB) [[attachment:konrad_todd_tdd_dojo.py]]
• [get | view] (2010-04-22 10:35:07, 4.1 KB) [[attachment:marijn_guyon_tdd_dojo.py]]
• [get | view] (2010-04-21 15:53:39, 150.7 KB) [[attachment:presentation.pdf]]
• [get | view] (2010-04-22 12:13:37, 1.3 KB) [[attachment:todd_gijs_reversi.py]]
• [get | view] (2010-04-22 12:14:08, 1.8 KB) [[attachment:todd_gijs_test.py]]
All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.

Unable to edit the page? See the FrontPage for instructions.