#ident "$Id: hanoi.h,v 1.6 2006/05/29 23:34:51 pwh Rel $" /* * Hanoi puzzle object. */ #if !defined ( _HANOI_PUZZLE_H_ ) #define _HANOI_PUZZLE_H_ #include /* Use the ncurses library. */ #define PUZZLE_TITLE "Tower of Hanoi Puzzle" #define ESC 27 /* Animation speed settings. */ #define WARP_SPEED 2 #define XTREME_SPEED 10 #define HIGH_SPEED 20 #define NORMAL_SPEED 50 #define SLOW_SPEED 100 /* Disk object. */ typedef struct { int size; int peg; int height; int x; int y; } DISK; /* Puzzle object. */ typedef struct { int height; /* Height of tower. */ int y0; /* Upper left corner of puzzle space. */ int x0; /* Upper left corner of puzzle space. */ int xc; /* Center column of screen. */ int xp[3]; /* Screen location of the pegs. */ int interactive; /* Is user playing the game? */ int speed; /* Animation speed. */ int newSpeed; /* Set new speed. */ int warpFactor; /* Animation speed. */ int moves; /* Move count. */ int peg_tops [3]; /* Number of disks on each peg. */ DISK *disks; /* Location of each disk. */ DISK **pegs [3]; /* Internal representaion of puzzle. */ DISK *xDisk; /* Disk in transition. */ } PUZZLE; /* Peg mnemonics. */ #define LEFT_PEG 0 #define CENTER_PEG 1 #define RIGHT_PEG 2 #define OTHER_PEG(peg1,peg2) (3-(peg1)-(peg2)) /* Puzzle object constructor and destructor and configurator. */ PUZZLE *openPuzzle ( int height, int animated, int speed ); void closePuzzle ( PUZZLE *puzzle ); int resetPuzzle ( PUZZLE *puzzle ); void setSpeed ( PUZZLE *puzzle, int speed ); /* Interactive display and game play functions. */ int playGame ( PUZZLE *puzzle ); /* Useful macros. */ #define isAnimated(puzzle) ((puzzle)->speed) #define isSolved(puzl) ((puzl)->peg_tops[RIGHT_PEG]==(puzl)->height) #define FIND_DISK(puzzle,disk) ((puzzle)->disks[disk].peg) #define DISK_HEIGHT(puzl,disk) ((puzl)->disks[disk].height) #define TOP_DISK(puzl,p) (((puzl)->xDisk&&(puzl)->xDisk->peg==(p))?\ (puzl)->xDisk->size:((puzl)->peg_tops[p]>0?\ (puzl)->pegs[p][(puzl)->peg_tops[p]-1]->size:\ -1)) /* Puzzle manipulation functions. */ int solvePuzzle ( PUZZLE *puzzle, int speed ); int moveDisk ( PUZZLE *puzzle, int src, int dest ); int pickupDisk ( PUZZLE *puzzle, int src ); int slideDisk ( PUZZLE *puzzle, int dest ); int dropDisk ( PUZZLE *puzzle, int dest ); /* Solution function. */ int solve ( PUZZLE *puzzle ); #endif /* !_HANOI_PUZZLE_H_ */