diff options
-rw-r--r-- | oo.py | 89 |
1 files changed, 35 insertions, 54 deletions
@@ -185,63 +185,44 @@ class ooPuzzle: for y in range(self.Y): self.orients[x, y] = random.randrange(4) - def is_solved(self): - """Checks whether the puzzle is in a solved state.""" - - # check internal edge pairs - - for x in range(self.X - 1): - for y in range(self.Y): - - # check horizontal edge pair right of (x, y) - - l_piece = self.pieces [x, y] - l_orient = self.orients[x, y] - r_piece = self.pieces [x+1, y] - r_orient = self.orients[x+1, y] - l_edge = self.PIECE_ORIENT_TO_EDGES[l_piece, l_orient][2] - r_edge = self.PIECE_ORIENT_TO_EDGES[r_piece, r_orient][0] - if l_edge != r_edge: return False - - for x in range(self.X): - for y in range(self.Y - 1): - - # check vertical edge pair below (x, y) - - u_piece = self.pieces [x, y] - u_orient = self.orients[x, y] - d_piece = self.pieces [x, y+1] - d_orient = self.orients[x, y+1] - u_edge = self.PIECE_ORIENT_TO_EDGES[u_piece, u_orient][3] - d_edge = self.PIECE_ORIENT_TO_EDGES[d_piece, d_orient][1] - if u_edge != d_edge: return False - - # check boundary edge pairs + def check_right(self, x0, y): + """Check the horizontal edge pair right of (x0, y).""" + x1 = (x0 + 1) % self.X + l_piece = self.pieces [x0, y] + l_orient = self.orients[x0, y] + r_piece = self.pieces [x1, y] + r_orient = self.orients[x1, y] + l_edge = self.PIECE_ORIENT_TO_EDGES[l_piece, l_orient][2] + r_edge = self.PIECE_ORIENT_TO_EDGES[r_piece, r_orient][0] + if not self.toroidal and x1 == 0: + if l_edge or r_edge: return False + else: + if l_edge != r_edge: return False + return True - for y in range(self.Y): - l_piece = self.pieces [self.X-1, y] - l_orient = self.orients[self.X-1, y] - r_piece = self.pieces [0, y] - r_orient = self.orients[0, y] - l_edge = self.PIECE_ORIENT_TO_EDGES[l_piece, l_orient][2] - r_edge = self.PIECE_ORIENT_TO_EDGES[r_piece, r_orient][0] - if self.toroidal: - if l_edge != r_edge: return False - else: - if l_edge or r_edge: return False + def check_down(self, x, y0): + """Check the vertical edge pair below (x, y0).""" + y1 = (y0 + 1) % self.Y + u_piece = self.pieces [x, y0] + u_orient = self.orients[x, y0] + d_piece = self.pieces [x, y1] + d_orient = self.orients[x, y1] + u_edge = self.PIECE_ORIENT_TO_EDGES[u_piece, u_orient][3] + d_edge = self.PIECE_ORIENT_TO_EDGES[d_piece, d_orient][1] + if not self.toroidal and y1 == 0: + if u_edge or d_edge: return False + else: + if u_edge != d_edge: return False + return True + def is_solved(self): + """Check whether the puzzle is in a solved state.""" for x in range(self.X): - u_piece = self.pieces [x, self.Y-1] - u_orient = self.orients[x, self.Y-1] - d_piece = self.pieces [x, 0] - d_orient = self.orients[x, 0] - u_edge = self.PIECE_ORIENT_TO_EDGES[u_piece, u_orient][3] - d_edge = self.PIECE_ORIENT_TO_EDGES[d_piece, d_orient][1] - if self.toroidal: - if u_edge != d_edge: return False - else: - if u_edge or d_edge: return False - + for y in range(self.Y): + if not self.check_right(x, y): + return False + if not self.check_down(x, y): + return False return True class ooPlay: |