#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까지의 블록을 경유지에서 도착지로 옮김.
*/
}
}
스파게티 같아 보이지..?
들여쓰기를 스페이스 1개로함?