maze-maker-2.py

'''Maze Maker.

commands:
    www-pub         - Generate mazes and solutions for /pub/python/maze
    main            - []
    demo            - []
    test            - []

Coder@Sonnack.com
September 16, 2014
'''
####################################################################################################
from sys import stdoutstderrargv
from os import path
from logger import loggerinfodebugtrace
from colors import *
from maze_obj import MazeObject
from maze_gif import MazeImage as MazeImageGIF
from maze_img import MazeImage as MazeImagePNG
from maze_xml import MazeXML
from maze_sol import MazeSolver
from maze_gen import MazeGen1
####################################################################################################
Log = logger('MazeMaker2')



##================================================================================================##
def www_pub_python_maze (*args):
    '''Generate multiple mazes (w/ solutions).'''
    Log.debug('www-pub/arguments: %d' % len(args))
    n_imgs = int(args[0]) if 0 < len(argselse 50
    n_rows = int(args[1]) if 1 < len(argselse 40
    n_cols = int(args[2]) if 2 < len(argselse 40
    f_name = args[3if 3 < len(argselse r'C:\CJS\www\root\pub\python\maze'
    Log.debug('www-pub/images: %d' % n_imgs)
    Log.debug('www-pub/dimensions: %dx%d' % (n_rows,n_cols))
    Log.debug('www-pub/filename: %s' % f_name)
    # For N images...
    filelist = []
    for ix in range(n_imgs):
        Log.info(ix)
        # Create filenames...
        fn1 = path.join(f_path'maze%03d.png'   % ix)
        fn2 = path.join(f_path'maze%03d_solved.png' % ix)
        filelist.append([fn1fn2])
        Log.info(fn1)
        Log.info(fn2)
        # Create a Maze...
        mz = MazeObject(n_rowsn_cols)
        mg = MazeGen1(mz)
        mg.generate_maze()
        # Save (unsolved) maze...
        mi = MazeImagePNG(mz)
        mi.draw_maze()
        mi.save(fn1)
        # Solve the maze...
        maze_path = []
        ms = MazeSolver(mz)
        ms.solve(maze_path)
        # Show the path...
        mz.set_all_cells(MazeObject.EmptyCell)
        for cell in maze_path:
            mz.set_cell(cell[0], cell[1], MazeObject.PathMarker)
        mz.set_entry_and_exit()
        mz.print_maze(Log.fp())
        # Save solved maze...
        mi.draw_maze()
        mi.save(fn2)
    # Return (rows,cols), #images, and list-of-files...
    return ((n_rows,n_cols), n_imgsfilelist)

##================================================================================================##
def test (*args):
    Log.debug('test/arguments: %d' % len(args))
    n_rows = int(args[0]) if 0 < len(argselse 10
    n_cols = int(args[1]) if 1 < len(argselse 16
    Log.debug('test/dimensions: %dx%d' % (n_rows,n_cols))
    # Maze Objects...
    mz = MazeObject(n_rowsn_cols)
    mi = MazeImageGIF(mz)
    mg = MazeGen1(mz)
    # Set Maze print symbols...
    mz.cell_syms = ['   '' o '' A '' Z '' - ']
    # Create a Maze...
    mg.generate_maze()
    # Log it, draw it, display it, and save it...
    mz.print_maze(Log.fp())
    mi.draw_maze()
    mi.show()
    mi.save('maze-test.gif')
    # Return Maze, Maze-Image, and Maze-Generator objects...
    return (mzmimg)

##================================================================================================##
def demo (*args):
    Log.debug('demo/arguments: %d' % len(args))
    n_rows = int(args[0]) if 0 < len(argselse 25
    n_cols = int(args[1]) if 1 < len(argselse 40
    Log.debug('demo/dimensions: %dx%d' % (n_rows,n_cols))
    # Maze Objects...
    mz = MazeObject(n_rowsn_cols)
    mi = MazeImagePNG(mz)
    mx = MazeXML(mz)
    ms = MazeSolver(mz)
    mg = MazeGen1(mz)
    # Create a Maze...
    mg.generate_maze()
    # Save (unsolved) maze...
    mi.draw_maze()
    mi.save('maze-demo.png')
    # Solve the maze...
    a = []
    ms.solve(a)
    # Show the path...
    #mz.set_all_cells(MazeObject.EmptyCell)
    for t in a:
        if t[0or t[1]:
            mz.set_cell(t[0], t[1], ixColorLightYellow)
    mz.set_entry_and_exit()
    mz.print_maze(Log.fp())
    # Save solved maze...
    try:
        mi.draw_maze()
    except:
        raise
    mi.show()
    mi.save('maze-demo-solved.png')
    # Save Maze XML...
    xml = mx.get_xml_paths()
    fp = open('maze-demo.xml''w')
    fp.write(xml)
    fp.close()
    # Return Maze, Maze-Image, and Maze-Generator objects...
    return (mzmimg)

##================================================================================================##
def main (*args):
    Log.debug('main/arguments: %d' % len(args))
    n_rows = int(args[0]) if 0 < len(argselse 8
    n_cols = int(args[1]) if 1 < len(argselse 8
    f_name = args[2if 2 < len(argselse 'maze.png'
    Log.debug('main/dimensions: %dx%d' % (n_rows,n_cols))
    Log.debug('main/filename: %s' % f_name)
    # Maze Objects...
    mz = MazeObject(n_rowsn_cols)
    mi = MazeImagePNG(mz)
    mg = MazeGen1(mz)
    # Create a Maze...
    mg.generate_maze()
    # Log it, draw it, display it, and save it...
    mz.print_maze(Log.fp())
    mi.draw_maze()
    mi.show()
    mi.save(f_name)
    # Return Maze, Maze-Image, and Maze-Generator objects...
    return (mzmimg)

##================================================================================================##
def dispatch (cmd, *args):
    Log.debug('command: %s' % cmd)
    Log.debug('arguments: %d' % len(args))
    if cmd == 'www-pub': return www_pub_python_maze(*args)
    if cmd == 'main': return main(*args)
    if cmd == 'demo': return demo(*args)
    if cmd == 'test': return test(*args)
    return (Nonecmdargs)
####################################################################################################
if __name__ == '__main__':
    print 'autorun:',argv[0]
    Log.start('maze-maker-2.log')
    Log.level(info())
    cmnd = argv[1]  if 1 < len(argvelse 'main'
    args = argv[2:]
    try:
        obj = dispatch(cmnd, *args)
        Log.info()
        Log.info('exit: %s' % type(obj))
    except Exception as e:
        print >> stderre
        Log.error(e)
        raise
    finally:
        Log.end()
####################################################################################################
'''eof'''