![]() |
General Programming »
Algorithms & Recipes »
Algorithms
License: The Code Project Open License (CPOL)
Towers of Hanoi with true GUI using Win32 and C++By Redwan Al-BoughaShows how to solve Towers of Hanoi puzzle visually using Win32 and C++ |
C++, Windows, Win32, GDI
|
||||||||||
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
Towers of Hanoi is a puzzle game where there are three stands, each holds number of plates.
The idea here is that you have to move plates in first stand to the third one, while moving plates you must consider :
Please note that I used the recursive method.
Formally, Towers of Hanoi recursive function is given by :
void Hanoi(int platesCount, int from, int dest, int by)
{
if (platesCount==1)
{
printf(
"Move the plate from %d to %d through %d"
, from, dest, by);
}
else
{
Hanoi(platesCount -1, from, by, dest);
Hanoi(1, from, dest, by);
Hanoi(platesCount -1, by, dest, from);
}
}
And here is a conceptual image :

When you lunch the application you will see the next screen:

Then you have to select whether to let the program step into solution automatically or not.

While implementing the program I faced a problem in separating steps since I used the recursive version, so I decided to keep the recursive way. But the call to Hanoi method will happen just first time when "next" or "solve" button is pressed. Inside Hanoi method I stored the states of the solution, meaning each time a call is happened the solution of the current step is stored in a list of integers. Since each step in Hanoi method require 4 parameters as mentioned above, 4 integer represents parameter is added to the list. Then each time SolveNextStep method is called, the program read from the list 4 items that represents the state.
Available classes:
HanoiDrawer PlateGUIInfo Tools Anyway I'll describe methods in HanoiDrawer class that are responsible directly about solving the puzzle.
// Advance one step to solve Hanoi
void HanoiDrawer::SolveNextStep()
{
int platesCount
, source
, destination
, intermediate;
if(listSavedState.size()==0)
{
this->Hanoi(this->iPlatesCount, HanoiDrawer::SOURCE
, HanoiDrawer::DESTINATION, HanoiDrawer::INTERMEDIATE);
}
if(listSavedState.size() % 4 != 0 )
{
return;
}
platesCount = listSavedState.front();
listSavedState.pop_front();
source = listSavedState.front();
listSavedState.pop_front();
destination = listSavedState.front();
listSavedState.pop_front();
intermediate = listSavedState.front();
listSavedState.pop_front();
MovePlateFromTo(source, destination);
this->iMovesCount++;
if(iMovesCount == this->GetTotalMovesCount())
{
this->solved = true;
}
SetDlgItemInt(this->hWnd, this->countContainerResourceId,
GetMovesCount(), FALSE);
SetDlgItemText(this->hWnd, this->fromContainerResourceId
, PlaceIntToString(source).c_str() );
SetDlgItemText(this->hWnd, this->toContainerResourceId
, PlaceIntToString(destination).c_str() );
SetDlgItemText(this->hWnd, this->throughContainerResourceId
, PlaceIntToString(intermediate).c_str() );
}
// Draws stands and plates
// then do Invalidate
// this operation is required
// in each step
void HanoiDrawer::ReDraw()
{
DrawStands();
DrawPlates();
Invalidate();
}
// The internal function that is responsible
// about solve the problem.
// platesCount : how many plates
// source : the index of the source
// destination : the index of the destination
// intermediate : the index of the intermediate
void HanoiDrawer::Hanoi(int platesCount, int source, int destination, int intermediate)
{
if (platesCount == 1)
{
listSavedState.push_back(platesCount);
listSavedState.push_back(source);
listSavedState.push_back(destination);
listSavedState.push_back(intermediate);
return;
}
else
{
Hanoi(platesCount - 1, source, intermediate, destination);
Hanoi(1, source, destination, intermediate);
Hanoi(platesCount - 1, intermediate, destination, source);
return;
}
}
| You must Sign In to use this message board. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 23 Oct 2008 Editor: Deeksha Shenoy |
Copyright 2008 by Redwan Al-Bougha Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |