sábado, 15 de junio de 2013

LAS TORRES DE HANOI

Aplicación que simula el movimiento de las torres de Hanoi que utilizan métodos recursivos

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
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void cmdDibuja_Click(object sender, EventArgs e)
        {
            frmHanoi Hanoi = new frmHanoi();
            bool valido;
            int nDiscos;
            valido= int.TryParse(txtnDiscos.Text , out nDiscos);
            Hanoi.nDiscos = nDiscos;
            if (valido) Hanoi.Show();
        }
    }
}
=============================================================
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
{
    public partial class frmHanoi : Form
    {
        public  int nDiscos;
        private int anchoF;
        private int altoF;
        private int anchoT;
        private int altoT;
        private int[,] posT = new int[3,2];
        private Disco[] misDiscos; 

        private Torre[] MiTorre = new Torre[3];

        public frmHanoi()
        {
            InitializeComponent();
        }

        private void frmHanoi_Load(object sender, EventArgs e)
        {
            misDiscos = new Disco[nDiscos];
            
            AnchoAlto();
            RediForm();
            PosTorres();
            DibujaTorre();
            CreaDiscos();
            DibujaDiscos();
            

        }
        private void AnchoAlto()
        {
            anchoT = (nDiscos + 2) * 10;
            anchoF = anchoT * 3 + 40;
            altoT = (nDiscos + 2) * 10;
            altoF = altoT + 100;
        }
        private void RediForm()
        {
            this.Height = altoF;
            this.Width = anchoF;
        }
        private void PosTorres()
        {
            for (int i = 0; i < 3; i++)
            {
                posT[i,0]= 10*(i+1)+anchoT*i; //Defino la posicion horizontal
                posT[i,1]= 20 ;        //Defino la posicion vertical
            }
        }
        private void DibujaTorre()
        {
            for (int i = 0; i < 3; i++)
            {
                MiTorre[i]=new Torre(altoT, anchoT,posT[i,0],posT[i,1]);
                this.Controls.Add(MiTorre [i].GrafTorre);
            }
        }

        private void CreaDiscos()
        {
            for (int i = 0; i < nDiscos; i++)
            {
                misDiscos[i] = new Disco(i+1);
            }
        }

        private void DibujaDiscos()
        {
            
            for (int i = 0; i < 3 ; i++)
            {
                for (int j = nDiscos-1; j >=0  ; j--)
                {
                    if (misDiscos[j].Posicion == i)
                    {
                        misDiscos[j].CreaDisco(nDiscos, MiTorre[i].contenido+1,altoT );
                        MiTorre[i].GrafTorre.Controls.Add(misDiscos[j].Dibujo);
                        MiTorre[i].contenido++;
                    }
                }
            }
        }

        private void Mover(int disc)
        {

            int pausa = 1500;
            if (disc > 0) Mover(disc - 1);
            for (int i = 0; i < 3; i++)
            {
                this.Controls.Remove(MiTorre[i].GrafTorre);
            }
            DibujaTorre();
            misDiscos[disc].Posicion = Disco.Destino(nDiscos, disc + 1, misDiscos[disc].Posicion);
            DibujaDiscos();
            this.Refresh();
            System.Threading.Thread.Sleep(pausa);
            if (disc > 0) Mover(disc - 1);  
        }

        private void cmdIniciar_Click(object sender, EventArgs e)
        {
            Mover(nDiscos - 1);
        }
    }

    public class Torre
    {
        public int contenido=0;
        public GroupBox GrafTorre=new GroupBox ();
 
        public Torre(int alto,int ancho,int posh,int posv)
        {
            GrafTorre.Text = "";
            GrafTorre.Height = alto;
            GrafTorre.Width = ancho;
            GrafTorre.Left = posh;
            GrafTorre.Top = posv; 
        }
    }

    public class Disco
    {
        public int Tamaño;
        public int Posicion = 0;
        public Label Dibujo = new Label();

        public Disco(int t)//, int nDiscos, int puesto)
        {
            Tamaño = t;
            //CreaDisco(nDiscos, puesto);
        }

        public void CreaDisco(int nDiscos, int puesto, int altoT)
        {
            Dibujo.BackColor = Color.Red;
            Dibujo.BorderStyle = BorderStyle.FixedSingle;
            //Dibujo.AutoSize = false;
            Dibujo.Height = 10;
            Dibujo.Width = Tamaño * 10;
            Dibujo.Top = altoT - puesto * 10;
            Dibujo.Left = (nDiscos * 10 / 2) - (Tamaño * 10 / 2)+10;
        }

        public static int Destino(int Total, int nDisco, int origen)
        {
            origen = origen + 3;
            if (Total % 2 == 0)
            {
                if (nDisco % 2 == 0) return (origen - 1) % 3;
                else return (origen + 1) % 3;
            }
            else
            {
                if (nDisco % 2 == 0) return (origen + 1) % 3;
                else return (origen - 1) % 3;
            }
        }

    }
}
 

6 comentarios: