This program asks user for number of discs first. say n= 2 or 3 or any number. Then it will ask user to enter one option out of two.
1 If the user wants the solution of the Tower of Hanoi for disc he has entered.
or
2 If the user wants to play by himself and shuffle the discs between the pegs A B and C
And user will play till he moves all the discs from peg A to peg C and the peg B is auxiliary peg. The game continues till all the disc from peg A (Starting peg) to move peg C (Final peg).
CODE :
// TOWER OF HANOI #include <iostream.h> class hanoi{ public: int s[50],top,elem,i,count,count1; hanoi(){ top=-1; count1=0; } void push(int e){ ++top; s[top]=e; ++count1; } int pop(){ int e; if(top==-1){ cout<<"\npeg is empty\n"; return 0; } else{ e=s[top]; --top; --count1; return e; } } void display(){ if(top==-1) cout<<"| "<<endl; else{ cout<<"| "; for(i=0;i<=top;i++) cout<<s[i]<<"-"; cout<<endl; } } void store(int n){ count=n; for(i=0;i<n;i++){ push(count); --count; } count1=n; } }; void tower(int n,char frm,char aux,char to){ if(n==1){ cout<<"\tmov disc 1 from "<<frm<<" to "<<to<<endl; return; } else{ tower(n-1,frm,to,aux); cout<<"\tmov disc "<<n<<" from "<<frm<<" to "<<to<<endl; tower(n-1,aux,frm,to); } } int main(){ int n,op; cout<<"\n\t~~~~~~~~~TOWER OF HANOI~~~~~~~~~\n"; cout<<"\nEnter no.of disc= "; cin>>n; start: cout<<"\nPress 1 for solution OR 2 for playing\n"; cin>>op; if(op>2 || op<1) goto start; else if(op==1) tower(n,'A','B','C'); else{ char fp,tp; int disc; bool flag1,flag2,flag3; hanoi a,b,c; a.store(n); cout<<"\nstarting peg is A\tFinishing peg is C\n"; cout<<"\nA";a.display(); cout<<"\nB";b.display(); cout<<"\nC";c.display(); while (c.count1!=n){ mid: cout<<"\nmov disc from peg= "; cin>>fp; cout<<"\nmov disc to peg= "; cin>>tp; flag1=flag2=flag3=false; switch(fp){ case 'A':{disc=a.pop(); flag1=true; if(disc==0) goto mid; break; } case 'B':{disc=b.pop(); flag2=true; if(disc==0) goto mid; break; } case 'C':{disc=c.pop(); flag3=true; if(disc==0) goto mid; break; } } switch(tp){ case 'A':{if(disc>a.s[a.top] && a.top>-1){ cout<<"\nInvalid move\n"; if(flag1==true) a.push(disc); else if(flag2==true) b.push(disc); else if(flag3==true) c.push(disc); } else{ a.push(disc); } break; } case 'B':{if(disc>b.s[b.top] && b.top>-1){ cout<<"\nInvalid move\n"; if(flag1==true) a.push(disc); else if(flag2==true) b.push(disc); else if(flag3==true) c.push(disc); } else{ b.push(disc); } break; } case 'C':{if(disc>c.s[c.top] && c.top>-1){ cout<<"\nInvalid move\n"; if(flag1==true) a.push(disc); else if(flag2==true) b.push(disc); else if(flag3==true) c.push(disc); } else{ c.push(disc); } break; } } cout<<"\nA";a.display(); cout<<"\nB";b.display(); cout<<"\nC";c.display(); } if(c.count1==n) cout<<"\n\t\t~~~~~YOU WON!!~~~~~\n"; } return 0; }