Click here to Skip to main content
15,892,965 members
Articles / Desktop Programming / Win32

Towers of Hanoi with True GUI using Win32 and C++

Rate me:
Please Sign up or sign in to vote.
4.43/5 (18 votes)
23 Oct 2008CPOL2 min read 67.5K   3.3K   30   9
Shows how to solve Towers of Hanoi puzzle visually using Win32 and C++

Introduction

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 the first stand to the third one, while moving plates you must consider:

  1. Size order, meaning when moving a plate you can't put it on a smaller one.
  2. Only one plate can be moved at each step.

Please note that I used the recursive method.

Background

Formally, Towers of Hanoi recursive function was given by :

C++
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 :

Tower_of_Hanoi_4.gif

Credits: MG from Wikipedia

Using the Program

When you launch the application, you will see the next screen: 

Image 2

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

hanoi2.gif

Using the Code

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 the Hanoi method, I stored the states of the solution, meaning each time a call happens, the solution of the current step is stored in a list of integers. Since each step in the Hanoi method requires 4 parameters as mentioned above, 4 integers represent parameter is added to the list. Then each time SolveNextStep method is called, the program reads from the list 4 items that represent the state.

Available classes are as follows:

  1. HanoiDrawer
  2. PlateGUIInfo
  3. Tools

Anyway I'll describe methods in HanoiDrawer class that are responsible directly for solving the puzzle.

HanoiDrawer Class

C++
// 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;
	}
}

Improvements

  • The user has the ability to drag and drop the plates, then the program should verify user choice.

Notices

History

  • v1.0 14/7/2007: Main core and functionality

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Syrian Arab Republic Syrian Arab Republic
I'm currently studying IT engineering. My general computer skills can be outlined :

• Programming languages :
C/C++, C#, Databases(Oracle and MySQL), PHP, ASP.NET.

• Operating systems :
Windows and Linux

• Frameworks and environments :
Borland development environment (C++), Windows SDK/Shell/GDI, MFC

• Programs and tools :
Adobe Dreamweaver, Adobe Photoshop, Adobe Flash

• Also :
Web Development skills (HTML, CSS, Javascript).

I'm interested in computer vision applications. Also I'm giving some tries to OS programming.

I hope to gain both the applied and theoretical knowledge of image processing field.

Comments and Discussions

 
Questionnyc bt how do i convert it to a game??!! Pin
code leaner8-Mar-13 3:07
code leaner8-Mar-13 3:07 
GeneralMy vote of 5 Pin
farrelled30-Sep-11 1:40
farrelled30-Sep-11 1:40 
GeneralI like this! Pin
LloydA11128-Aug-09 10:36
LloydA11128-Aug-09 10:36 
GeneralRe: I like this! Pin
Redwan Albougha29-Aug-09 0:04
Redwan Albougha29-Aug-09 0:04 
Thanks Lloyd.
I appreciate your help.

Cheers. Roll eyes | :rolleyes:

Best wishes,
Redwan Al-Bougha

GeneralTower of Hanoi Animated GIF... Pin
Drew Stainton23-Oct-08 5:04
Drew Stainton23-Oct-08 5:04 
GeneralRe: Tower of Hanoi Animated GIF... Pin
Redwan Albougha23-Oct-08 5:14
Redwan Albougha23-Oct-08 5:14 
GeneralRe: Tower of Hanoi Animated GIF... Pin
Drew Stainton23-Oct-08 5:24
Drew Stainton23-Oct-08 5:24 
GeneralRe: Tower of Hanoi Animated GIF... Pin
Redwan Albougha23-Oct-08 5:42
Redwan Albougha23-Oct-08 5:42 
GeneralWaiting your comments Pin
Redwan Albougha23-Oct-08 3:36
Redwan Albougha23-Oct-08 3:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.