#include <iostream>

#include <windows.h> 

#include "stack.h"

void gotoxy(int x,int y)

{

COORD pos={x,y};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

using namespace std;


class tower

{

private:

stack* zone;

int pos;

public:

tower(int a);

int move(tower& to);

int check(tower& to);

int show();

int show_tower(int b);

int return_pos();

int return_data_x(int x);

};


int tower::show_tower(int x)

{

switch(x)

{

case 1:

cot<<"    *";

break;

case 2:

cot<<"   ***";

break;

case 3:

cot<<"  *****";

break;

case 4:

cot<<" *******";

break;

case 5:

cot<<"*********";

break;

default:

cot<<"         ";

break;

}

}


int tower::return_data_x(int x)

{

return zone->return_data_x(x);

}


int tower::return_pos()

{

return pos;

}


tower::tower(int a)

{

zone=new stack(5);

pos=a;

if(pos==1)

{

for(int i=0;i<5;i++)

{

zone->push(5-i);

}

}

}


int tower::move(tower& to)

{

int data_from,data_to,a;

if(this->zone->pop(data_from))

{

if(to.zone->pop(data_to))

{

if(data_to>data_from)

{

to.zone->push(data_to);

to.zone->push(data_from);

cot<<"\tpush:"<<data_from;

to.check(to);

}

}

else 

{

to.zone->push(data_from);

cot<<"\tpush:"<<data_from;

to.check(to);

}

}

else cot<<"cant pop data at From tower";

}


tower::check(tower& to)

{

if(to.zone->return_end_data()==to.zone->return_size())

{

cot<<"end";

}

}


int tower::show()

{

gotoxy(20,1);

cot<<"Welcome to Hanoi Tower!";

for(int i=0;i<25;i++)

{

gotoxy(20*(pos-1)+i,3);

cot<<"*";

}

for(int i=0;i<25;i++)

{

gotoxy(20*(pos-1)+i,14);

cot<<"*";

}

gotoxy(20*(pos-1)+5,15);

cot<<"tower_"<<pos;

gotoxy(20*(pos-1)+5,13);

for(int i=0;i<5;i++)

{

gotoxy(20*(pos-1)+5,12-i);

show_tower(return_data_x(i));

}

gotoxy(25,21);

}


void hanoi(int num,tower from,tower to,tower thru);


int main(int argc,char* argv[])

{

tower tower[3]={1,2,3};

tower[0].move(tower[1]);

for(int i=0;i<3;i++)

{

tower[i].show();

}

}


void hanoi(int num,tower from,tower to,tower thru)

{

if(num==1)

{

cot<<"\nsize:"<<num<<"\tfrom:"<<from.return_pos()<<"\tto:"<<to.return_pos();

from.move(to);

}

else

{

/* 하노이의 탑에서 쓸 수 있는 가짓수는 모두

3가지로 1,2,3인데 여기서 나머지 2개를 다 쓰는데에 아이디어를 얻음*/

hanoi(num-1,from,thru,to);

cot<<"\nsize:"<<num<<"\tfrom:"<<from.return_pos()<<"\tto:"<<to.return_pos();

from.move(to);

hanoi(num-1,thru,to,from);

/*

1. n-1까지의 블록을 중간 경유지로 옮김

2. n번째의 블록을 도착지로 옮김.

3. n-1까지의 블록을 경유지에서 도착지로 옮김.

*/

}

}


스파게티 같아 보이지..?