# Class for the puzzle data representation
+import cairo
+
class GridItem:
# initialize the item
def __init__ (self, item_char='.', across_start = False, down_start = False,
for j in range (cols):
self.data[i].append (GridItem ())
+ # export to an image
+ def export_image (self, filename, solution=False):
+ # don't export if grid is not frozen
+ if self.frozen_grid is False:
+ raise FrozenGridException
+
+ # create cairo image surface and context
+ px = 30
+ surf = cairo.ImageSurface (cairo.FORMAT_RGB24, self.cols*px, self.rows*px)
+ ctx = cairo.Context (surf)
+
+ ctx.set_source_rgb (1, 1, 1)
+ ctx.rectangle (0, 0, self.cols*px, self.rows*px)
+ ctx.fill ()
+
+ # traverse through the grid
+ for row in range (self.rows):
+ for col in range (self.cols):
+ # if grid is un-occupied
+ if (self.data[row][col].occupied_across is False and
+ self.data[row][col].occupied_down is False):
+ ctx.set_source_rgb (0, 0, 0)
+ ctx.rectangle (col*px, row*px, px, px)
+ ctx.fill ()
+ # grid is occupied
+ else:
+ ctx.set_source_rgb (1, 1, 1)
+ ctx.rectangle (col*px, row*px, px, px)
+ ctx.fill ()
+ ctx.set_source_rgb (0, 0, 0)
+ ctx.rectangle (col*px, row*px, px, px)
+ ctx.stroke ()
+ # if solution is not to be provided, number the grid
+ if solution is False:
+ if self.data[row][col].numbered <> 0:
+ ctx.select_font_face ("Serif")
+ ctx.set_font_size (10)
+ ctx.move_to (col*px+5, row*px+10)
+ ctx.show_text (str(self.data[row][col].numbered))
+ # display the words
+ else:
+ ctx.select_font_face ("Serif")
+ ctx.set_font_size (16)
+ ctx.move_to (col*px+10, row*px+20)
+ ctx.show_text (self.data[row][col].char)
+
+ surf.write_to_png (open (filename, "wb"))
+
# get the AcrossLite(TM) data for exporting
def export_acrosslite (self, title, author, copyright):
- # don't export if grid is frozen
+ # don't export if grid is not frozen
if self.frozen_grid is False:
raise FrozenGridException
across_data = []
- across_data.append ("<ACROSS PUZZLE>\n")
- across_data.append ("<TITLE>\n")
- across_data.append (title + "\n")
- across_data.append ("<AUTHOR>\n")
- across_data.append (author + "\n")
- across_data.append ("<COPYRIGHT>\n")
- across_data.append (copyright + "\n")
- across_data.append ("<SIZE>\n")
+ across_data.append ("<ACROSS PUZZLE>\r\n")
+ across_data.append ("<TITLE>\r\n")
+ across_data.append (title + "\r\n")
+ across_data.append ("<AUTHOR>\r\n")
+ across_data.append (author + "\r\n")
+ across_data.append ("<COPYRIGHT>\r\n")
+ across_data.append (copyright + "\r\n")
+ across_data.append ("<SIZE>\r\n")
str_size = str (self.cols) + "x" + str (self.rows)
- across_data.append (str_size + "\n")
- across_data.append ("<GRID>\n")
+ across_data.append (str_size + "\r\n")
+ across_data.append ("<GRID>\r\n")
for row in range (self.rows):
for col in range (self.cols):
if (self.data[row][col].occupied_across is True or
across_data.append (self.data[row][col].char)
else:
across_data.append (".")
- across_data.append ("\n")
+ across_data.append ("\r\n")
- across_data.append ("<ACROSS>\n")
+ across_data.append ("<ACROSS>\r\n")
clues_across = self.get_clues_across ()
for word, clue in clues_across:
if clue:
- across_data.append (clue + "\n")
+ across_data.append (clue + "\r\n")
else:
- across_data.append ("(No clue yet)\n")
+ across_data.append ("(No clue yet)\r\n")
- across_data.append ("<DOWN>\n")
+ across_data.append ("<DOWN>\r\n")
clues_down = self.get_clues_down ()
for word, clue in clues_down:
if clue:
- across_data.append (clue + "\n")
+ across_data.append (clue + "\r\n")
else:
- across_data.append ("(No clue yet\n")
+ across_data.append ("(No clue yet\r\n")
acrosslite_str = "".join (across_data)
return acrosslite_str