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;
}
}
}
}
el programa?
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarOye y tu código debe estar en dos formularios de Windows Form?
ResponderEliminarPodría ver tus formularios??
ResponderEliminarGracias bro te saldria bien hacer un video tutorial asi se lleva la secuencia igual pero yo lo entiendo asi que gracias
ResponderEliminaroyes hiso 3 forms?
Eliminar