//将x上的n个盘子通过y移动到z void movefunc(int n,char x,char y,char z) { if (n == 1) { printf("第%d步: %c---->%c\n",++count,x,z); } else { movefunc(n-1, x, z, y); printf("第%d步: %c---->%c\n",++count,x,z); movefunc(n-1, y, x, z); } }
int main(int argc, const char * argv[]) { int n; printf("请输入有几个盘: "); scanf("%d",&n); movefunc(n, 'X', 'Y', 'Z'); printf("一共需要%d步!",count); return 0; }
int move_down(board_t src, board_t dst) { movefunc(src[REVERSE(j)][i], dst[REVERSE(j2 - 1)][i], dst[REVERSE(j2)][i]); }
int move_up(board_t src, board_t dst) { movefunc(src[j][i], dst[j2 - 1][i], dst[j2][i]); }
int move_right(board_t src, board_t dst) { movefunc(src[i][REVERSE(j)], dst[i][REVERSE(j2 - 1)], dst[i][REVERSE(j2)]); }
int move_left(board_t src, board_t dst) { movefunc(src[i][j], dst[i][j2 - 1], dst[i][j2]); }
long mjoldoturn(struct mjolgame *game, struct mjolchr *chr) { struct mjolobj *dest = NULL; long lvl; long retval = 0; long n = mjolhasnturn(chr); long x; long y; int (*printmsg)(const char *, ...) = game->scr->printmsg; int (*getkbd)(void) = game->scr->getch; mjolcmdfunc *func; mjolcmdmovefunc *movefunc; int cmd; int dir; int item = 0; if (!n) { printmsg("You cannot move\n"); } while (n) { if (n > 1) { printmsg("You have %ld turns\n", n); } do { cmd = getkbd(); } while (cmd > 0xff); // clrmsg(); if (cmd == MJOL_CMD_BOSS) { exit(0); } else if (mjolismove(cmd)) { movefunc = mjolcmdmovefunctab[cmd]; movefunc(game, chr); } else { if (mjolhasdir(cmd)) { lvl = game->lvl; x = chr->data.x; y = chr->data.y; printmsg("Which direction?"); do { dir = getkbd(); } while (dir > 0xff); if ( #if (MJOL_CURSES) dir == KEY_UP || #endif dir == MJOL_CMD_MOVE_UP) { printmsg("UP"); if (y) { y--; } } else if ( #if (MJOL_CURSES) dir == KEY_DOWN || #endif dir == MJOL_CMD_MOVE_DOWN) { printmsg("DOWN"); if (y < game->height - 1) { y++; } } else if ( #if (MJOL_CURSES) dir == KEY_LEFT || #endif dir == MJOL_CMD_MOVE_LEFT) { printmsg("LEFT"); if (x) { x--; } } else if ( #if (MJOL_CURSES) dir == KEY_RIGHT || #endif dir == MJOL_CMD_MOVE_RIGHT) { printmsg("RIGHT"); if (x < game->width - 1) { x++; } } else { printmsg("%lx\n", dir); } dest = game->objtab[lvl][x][y]; func = mjolcmdfunctab[cmd][dir]; } if (mjolhasarg(cmd)) { printmsg("Which item?"); do { item = getkbd(); } while (item > 0xff); printmsg("%c\n", item); dest = game->inventory[item]; } if (dest) { func = mjolcmdfunctab[cmd][item]; if (func) { retval += func(chr, dest); n--; } } } } return retval; }