summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Anderson <jandew+dev@gmail.com>2016-02-15 17:18:01 -0800
committerJoe Anderson <jandew+dev@gmail.com>2016-02-15 17:18:01 -0800
commit26ddaef6826664c8d80f92a6ba09b26a4112fbe2 (patch)
tree69866fbafcbcf24e7099ccca6ec7608287e102bb
parentd71b051249668afa584452daf632bfcf619736f5 (diff)
downloadoo-26ddaef6826664c8d80f92a6ba09b26a4112fbe2.tar.gz
oo-26ddaef6826664c8d80f92a6ba09b26a4112fbe2.zip
cleaned up ooPuzzle.is_solved
-rw-r--r--oo.py89
1 files changed, 35 insertions, 54 deletions
diff --git a/oo.py b/oo.py
index ed02a9c..d86ad8a 100644
--- a/oo.py
+++ b/oo.py
@@ -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: