C# programok ismertetése érdeklődőknek kezdőktől haladókig

C# MŰHELY

C# MŰHELY

GRAFIKA: Hanoi tornyai

2020. augusztus 29. - Benkő Tiborné

Í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:

 

A bejegyzés trackback címe:

https://csharp-muhely.blog.hu/api/trackback/id/tr5716180124

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása