Código C# WPF: Conjunto Aleatorio con Temporizador DispatcherTimer
Código C# WPF: conjunto aleatorio con temporizador
A continuación se presenta el código de una aplicación WPF en C# que gestiona un conjunto de 16 elementos mediante un DispatcherTimer. El programa permite insertar y extraer elementos de forma aleatoria, actualizando la interfaz gráfica y mostrando un registro del proceso.
Clase principal: MainWindow
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
extraer.IsEnabled = false;
vaciar.IsEnabled = false;
salida.Clear();
mi_timer.Interval = new TimeSpan(0, 0, 0, 1, 0);
mi_timer.Tick += new EventHandler(ejecutar_cada_tick);
}
bool[] vector = new bool[16];
bool llenar = true;
Random r = new Random();
DispatcherTimer mi_timer = new DispatcherTimer();
private void vaciar_Click(object sender, RoutedEventArgs e)
{
empty_set();
for (int i = 0; i < 16; i++)
{
cambia_imagen(i, 0, false);
}
insertar.IsEnabled = true;
extraer.IsEnabled = false;
vaciar.IsEnabled = false;
llenar = true;
}
private void cambia_imagen(int valor, int contador, bool on_off)
{
string cadena;
if (on_off)
{
cadena = "imagen_" + valor + "_on.png";
progreso_1.Value = progreso_1.Value + 1;
salida.Text = salida.Text + "Elemento " + valor + " encontrado después de " + contador + " intento(s)\n";
}
else
{
cadena = "imagen_" + valor + "_off.png";
salida.Text = salida.Text + "Elemento " + valor + " extraído después de " + contador + " intento(s)\n";
progreso_1.Value = progreso_1.Value - 1;
}
salida.ScrollToEnd();
Image image = (Image)this.FindName("image_" + valor.ToString());
image.Source = new BitmapImage(new Uri(@cadena, UriKind.Relative));
}
private void ejecutar_cada_tick(object sender, EventArgs e)
{
if (llenar == true) // acción de llenar
{
int valor = 0;
int contador = 0;
insert(ref valor, ref contador);
if (valor != -1) // conjunto no lleno
{
cambia_imagen(valor, contador, true);
}
if (cardinal() == 16) // conjunto lleno
{
llenar = false;
insertar.IsEnabled = false;
extraer.IsEnabled = true;
vaciar.IsEnabled = true;
mi_timer.Stop();
}
}
else // acción de vaciar
{
int valor = 0;
int contador = extract(ref valor);
if (valor != -1) // conjunto no vacío
{
cambia_imagen(valor, contador, false);
}
if (cardinal() == 0) // conjunto vacío
{
llenar = true;
insertar.IsEnabled = true;
extraer.IsEnabled = false;
vaciar.IsEnabled = false;
mi_timer.Stop();
}
}
}
private bool is_in(int i)
{
if (vector[i] == true)
{
return true;
}
else
{
return false;
}
}
private int cardinal()
{
int contador = 0;
for (int i = 0; i < 16; i++)
{
if (is_in(i) == true)
{
contador++;
}
}
return contador;
}
private void insert(ref int valor, ref int contador)
{
contador = 0;
while (true)
{
if (cardinal() == 16)
{
valor = -1; // conjunto lleno, no se puede insertar
break;
}
else
{
valor = r.Next(0, 16);
if (is_in(valor) == false)
{
vector[valor] = true;
contador++;
break; // inserción exitosa
}
else
{
contador++;
}
}
}
}
private int extract(ref int valor)
{
int contador = 0;
while (true)
{
if (cardinal() == 0)
{
valor = -1; // conjunto vacío, no se puede extraer
break;
}
else
{
valor = r.Next(0, 16);
if (is_in(valor) == true)
{
vector[valor] = false;
contador++;
break; // extracción exitosa
}
else
{
contador++;
}
}
}
return contador;
}
private void empty_set()
{
for (int i = 0; i < 16; i++)
{
vector[i] = false;
}
}
private void insertar_Click(object sender, RoutedEventArgs e)
{
insertar.IsEnabled = false;
mi_timer.Start();
}
private void extraer_Click(object sender, RoutedEventArgs e)
{
extraer.IsEnabled = false;
vaciar.IsEnabled = false;
mi_timer.Start();
}
}