Írjunk grafikus programot, amely a Hanoi tornyai logikai játékot 3 rúd felhasználásával oldja meg A feladat az, hogy az első rúdról átpakolja a korongokat a harmadik rúdra, segítségül használja a 2. rudat, azonban a szabály
- egyszerre csak egy korong mozgatható;
- mindig csak a legfelső korongot szabad levenni és áttenni egy másik rúdra;
- egy korong nem rakható nála kisebb átmérőjű korongra.
A feladat megoldása
//Hanoi_Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Hanoi_Form1
{
public partial class Form1 : Form
{
public Form
{
InitializeComponent()
}
HanoiTornyai ht = null;
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && textBox2.Text != "")
{
int korongszam = Convert.ToInt32(textBox1.Text);
int várakozás = Convert.ToInt32(textBox2.Text);
// várakozás a lépések között
ht = new HanoiTornyai(korongszam, panel1, várakozás);
}
}
private void button2_Click(object sender, EventArgs e)
{
ht.Megold();
}
}
}
//Hanoi.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
namespace Hanoi_Form1
{
// -------- Korong osztály --------
class Korong
{
public int meret { get; set; }
public Color color { get; set; }
public Korong(int m, Color c)
{
meret = m;
color = c;
}
// Például az 5 méretű korong: **"**
public override String ToString()
{
string ps = "\"";
if (meret > 2)
{
ps = new string('*', meret / 2) + ps +
new string('*', meret / 2);
}
return ps;
}
}
// -------- Palca osztály --------
class Palca
{
private String nev;
private Stack<Korong> korongok = new Stack<Korong>();
public Palca(String n)
{
nev = n;
}
public void Rateszi(Korong k)
{
if (korongok.Count == 0) // első korong, ráteszi
korongok.Push(k);
else
if (korongok.Peek().meret >= k.meret) // ráteszi
korongok.Push(k);
else
{
MessageBox.Show("Kisebbre nem tehető nagyobb!");
Environment.Exit(-1);
}
}
public Korong Leveszi()
{ // leveszi a felső korongot
if (korongok.Count == 0)
{
MessageBox.Show("Nincs mit levenni!");
Environment.Exit(-1);
return null; // a fordító kedvéért
}
else
{
Korong k = korongok.Pop();
return k;
}
}
public Korong this[int index]
{ // indexelő a pálcán lévő korongok eléréséhez
get
{
if (index < korongok.Count)
{
return korongok.ElementAt
(korongok.Count - index - 1);
}
else
return new Korong(0, Color.Black);
}
}
public override String ToString()
{
return nev;
}
}
// -------- HanoiTornyai osztály --------
public class HanoiTornyai
{
public int MAXMERET { get; set; }
public int korongszam { get; set; }
public int palcahossz { get; set; }
Palca[] palcak = new Palca[3];
Panel panel = null;
Random rnd = new Random();
int maxmeret;
float char2pixelX;
float char2pixelY;
int palcahpix;
int valtas = 0;
public HanoiTornyai(int kszam, Panel pan, int ms)
{
korongszam = kszam;
palcahossz = kszam + 3;
MAXMERET = 2 * kszam + 1
panel = pan;
valtas = ms;
maxmeret = panel.ClientSize.Width / 3;
char2pixelX = (float)maxmeret / MAXMERET;
char2pixelY = char2pixelX * 2;
palcahpix = (int)(palcahossz * char2pixelY);
palcak[0] = new Palca("első");
// A 0. palcára felteszi a megadott számú korongot
for (int i = korongszam; i > 0; i--)
palcak[0].Rateszi(new Korong(2 * i + 1,
Color.FromArgb(rnd.Next(256),
rnd.Next(256), rnd.Next(256)))); // ..7,5,3
palcak[1] = new Palca("második");
palcak[2] = new Palca("harmadik");
Rajzol(); // megjelenítjük a pálcákat
}
public void Megold()
{
Hanoi(korongszam, palcak[0], palcak[1], palcak[2]);
}
private void Hanoi(int n, Palca honnan, Palca mivel,
Palca hova)
{
if (n == 1)
HonnanHovaMozgatas(honnan, hova);
else
{
Hanoi(n - 1, honnan, hova, mivel);
HonnanHovaMozgatas(honnan, hova);
Hanoi(n - 1, mivel, honnan, hova);
}
}
private void HonnanHovaMozgatas(Palca innen, Palca ide)
{
ide.Rateszi(innen.Leveszi());
Rajzol();
}
public void Rajzol()
{
Graphics g = panel.CreateGraphics();
g.Clear(panel.BackColor);
int maxy = panel.ClientSize.Height - 20;
int miny = maxy - palcahpix;
Pen pen = new Pen(Color.Brown, 10);
for (int x = maxmeret / 2; x < 3 * maxmeret;
x += maxmeret)
{
g.DrawLine(pen, new Point(x, miny),
new Point(x, maxy));
}
int pozx, pozy, km;
for (int i = palcahossz - 1; i >= 0; i--)
{
for (int p = 0; p < palcak.Length; p++)
{
km = palcak[p][i].meret;
if (km != 0)
{
pozx = (int)((2 * p + 1) * maxmeret - km
* char2pixelX) / 2;
pozy = (int)(maxy - (i + 1) * char2pixelY);
Brush brush = new SolidBrush
(palcak[p][i].color);
g.FillRectangle(brush,
new Rectangle(pozx, pozy,
(int)(km * char2pixelX), (int)char2pixelY));
}
}
}
Thread.Sleep(valtas);
}
}
}
A program futási eredményei: