Serie ficheros virtuales



C Ficheros virtuales

 


B.II.4 La clase CJvida para el juego de la vida. 

 

 B.II.4.1 Introducción

 B.II.4.2 La clase CJvida como interfaz del servicio SRJvida, sintetización algorítmica del programa PJvida de generación de poblaciones del juego de la vida

 B.II.4.3 Lista completa de métodos de la clase CJvida

 B.II.4.4 El programa de presentación en VisualBasicJvida

 

                                                                                                               _______


B.II.4.1 Introducción

 

En el punto anterior se vio el desarrollo de CMagic como interfaz NET para el servicio de sudokus.

 

Ahora se verá el desarrollo de CJvida como interfaz NET del servicio SRjvida que finalmente se utilizará en el mismo programa Visual Basic que utilizaba el servicio COM.

 

 

 

                                                                                                               _______

 

 

B.II.4.2 La clase CJvida como interfaz del servicio SRJvida, sintetización algorítmica del programa PJvida de

         generación de poblaciones del juego de la vida

 

 

Para verlo, se presenta a continuación el fragmento inicial del código de la clase CJvida:

 

 

// CJvida.h

 

#pragma once

 

#using <mscorlib.dll>

using namespace System;

 

 

 

// Inclusión de los servicios de SRJvida, como código no administrado

 

#pragma unmanaged

#include "srjvidax.h"

#pragma managed

 

 

namespace CJvida

{

 

//----------------------------------------------------------------------------------

// Clase CJvida. Interfaz de SRjvida para uso NET

//----------------------------------------------------------------------------------

 

public __gc class CJvida

{

// TODO: agregar aquí los métodos de la clase.

 


 

public:

 

// Constructor. Apertura de proceso

 

CJvida(void)

{

 long lresul = 0; // Control de resultados

 

 lresul = SRjvida_Open();

 

 return;

}

 

 

// Cierre de proceso

 

short int Close(void)

{

 return SRjvida_Close();

}

 

 

// Reinicio. Nueva muestra. Devuelve 1er.tamaño poblacional

 

long Reinicio(long Nmax)

{

 return SRjvida_New(Nmax);

}

 

 

// Vacia de población a la muestra actual

 

short int CLRF(void)

{

 return SRjvida_CLRF();

}

 

 

// Crea una nueva generación poblacional. Devuelve contador generacional

 

long Gen(void)

{

 return SRjvida_Gen();

}

 

. . .

                                                                                                               _______

 

 

B.II.4.3 Lista completa de métodos de la clase CJvida

 

 

Apertura y cierre de proceso

 

CJvida(void)          // Constructor. Apertura de proceso

 

short int Close(void) // Cierre de proceso

 

 

Control de proceso

 

long Reinicio(long Nmax)                // Reinicio. Nueva muestra. Devuelve 1er.tamaño poblacional

 

short int CLRF(void)                    // Vacia de población a la muestra actual

 

long Gen(void)                          // Crea una nueva generación poblacional. Devuelve contador generacional

 

long Npob(void)                         // Recupera el tamaño poblacional actual

 

short int Ocupada(long i, long j)       // Evalúa si una celda está ocupada

 

long Read(long indice)                  // Lectura secuencial del fichero de soporte Devuelve IJ = j + 100000 * (i - 1)

 

long Write(long i, long j, short int a) // Graba una celda

 

 

 

Control del marco de referencia

 

long Recupera_i01(long Nmax)

long Recupera_j01(long Nmax)

long Recupera_i02(long Nmax)

long Recupera_j02(long Nmax)

long Recupera_i1(long Nmax)

long Recupera_j1(long Nmax)

long Recupera_i2(long Nmax)

long Recupera_j2(long Nmax)

long Recupera_SIZE(long Nmax)

 

 

 

Control de desplazamiento a esquinas

 

void GO_00(short int holgura)

void GO_i0(short int holgura)

void GO_0j(short int holgura)

void GO_99(long Nmax, short int holgura)

void GO_9j(long Nmax, short int holgura)

void GO_90(long Nmax, short int holgura)

void GO_i9(long Nmax, short int holgura)

void GO_09(long Nmax, short int holgura)

 

 

 

Control de desplazamiento horizontal/vertical

 

void H(long Desp)

void HD(long Desp)

void HI(long Desp)

void V(long Desp)

void VI(long Desp)

void VS(long Desp)

                                                                                                               _______

 

 

B.II.4.4 El programa de presentación en VisualBasicJvida

 

Al disponer de la clase .Net CJvida, se pueden desarrollar interfaces para ella en cualquier lenguaje .Net, tal y como en el capítulo anterior se hizo para Magic, veremos ahora la implementación (expurgada de rutinas del sistema) del programa “Magic” desarrollado en VisualBasic.Net cuya imagen se presentó antes:

 

 

Public Class Form1

Inherits System.Windows.Forms.Form

 


 

Dim CJvida As New CJvida.CJvida ' Inclusión de la clase de soporte CJvida

 


 

Dim lNMAX As Long ' Tamaño base (En Pvida tamaño ventana visualización)

Dim lNGEN As Long ' NºGeneración en curso

Dim lNPOB As Long ' Tamaño poblacional

Dim lSIZE As Long ' Tamaño diagonal total

Dim lNMUESTRA As Long ' NºMuestra

Dim ValorLapso As Integer 'Valor lapso del timer en segundos

 

 

 

' Carga del formulario

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles MyBase.Load

 

 

' Valor inicial del lapso de autorespuesta para el reloj

ValorLapso = 60

 

LapsoNumericUpDown.Text = ValorLapso.ToString

Timer1.Interval = ValorLapso * 1000

 

 

' Tamaño base por defecto

 

lNMAX = 30

 

BaseNumericUpDown.Text = lNMAX.ToString

 

 

' Generación inicial

 

Reiniciar_Click(sender, e)

 

 

' Activación del reloj

 

Timer1.Enabled() = True

 

 

' Valor del lapso de autorespuesta para el reloj

 

ValorLapso = 1

 

LapsoNumericUpDown.Text = ValorLapso.ToString

Timer1.Interval = ValorLapso * 1000

 

End Sub

 

 

 

' Cierre de la aplicación

 

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)

Handles MyBase.Closing

 

Dim lErro As Short

 

lErro = CJvida.Close()

 

End Sub

 

 

 

' Generar nueva población

 

Private Sub Generar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Generar.Click

 

lNGEN = CJvida.Gen()

 

Presentar_Click(sender, e)

 

End Sub

 

 

 

' Presentación de resultados (Rutina principal)

 

Private Sub Presentar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Presentar.Click

 

Dim dtJvida As New DataTable ' Tabla soporte grid

Dim drJvida As DataRow ' Soporte filas grid

 

Dim i As Long ' Contador de for

Dim j As Long ' Contador de for

Dim a As Long ' 0/1 ocupada

 

 

 

' Tamaño poblacional actual

 

lNPOB = CJvida.Npob()

 

 

 

' Valores de referencia en curso

 

Dim i01 As Long

. . .

 

 

i01 = CJvida.Recupera_i01(lNMAX)

. . .

 

lSIZE = CJvida.Recupera_SIZE(lNMAX)

 

 

 

' A posición 00

 

CJvida.GO_90(lSIZE, 1)

 

 

' Pasa valores ajustados obtenidos

 

i01 = CJvida.Recupera_i01(lNMAX)

. . .

 

lSIZE = CJvida.Recupera_SIZE(lNMAX)

 

If lSIZE < (i02 - i01) Then

lSIZE = i02 - i01

End If

 

If lSIZE < (j02 - j01) Then

lSIZE = j02 - j01

End If

 

Nmuestra.Text = lNMUESTRA.ToString

Ngen.Text = lNGEN.ToString

Npob.Text = lNPOB.ToString

SizeTot.Text = lSIZE.ToString

 

 

 

' Carga del grid

 

 

' Crea columnas de soporte

 

For j = 1 To lSIZE + 3

 

dtJvida.Columns.Add(New DataColumn(j.ToString, GetType(String)))

 

Next j

 

 

 

' Crea filas de soporte

 

For i = 1 To lSIZE + 3

 

drJvida = dtJvida.NewRow()

 

For j = 1 To lSIZE + 3

 

a = CJvida.Ocupada(lSIZE - i, j)

 

If a = 1 Then

 

drJvida(j.ToString) = "@"

 

Else : drJvida(j.ToString) = " "

 

End If

 

Next j

 

 

' Añade fila a la tabla

 

dtJvida.Rows.Add(drJvida)

 

Next i

 

 

 

' Aplica al grid

 

With Jvida

.Visible = True

.DataSource = New DataView(dtJvida)

End With

 

End Sub

 

 

 

 

' Generación poblacional por temporizador

 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

 

Generar_Click(sender, e)

 

End Sub

 

 

 

 

' Regeneración inicial

 

Private Sub Reiniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Reiniciar.Click

 

lNPOB = CJvida.Reinicio(lNMAX)

lNGEN = 1

lNMUESTRA += 1

 

Presentar_Click(sender, e)

 

End Sub

 

 

 

' Vaciado de datos

 

Private Sub Limpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Limpiar.Click

 

Dim er As Short

 

er = CJvida.CLRF()

 

Presentar_Click(sender, e)

 

End Sub

 

 

 

' Cambio de estado de celdas del grid

 

Private Sub Jvida_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

Handles Jvida.MouseDown

 

Dim myGrid As DataGrid = CType(sender, DataGrid)

 

Dim hti As System.Windows.Forms.DataGrid.HitTestInfo

 

Dim i As Long

Dim j As Long

Dim Ocupada As Integer

Dim lResul As Long

 

hti = myGrid.HitTest(e.X, e.Y)

 

Select Case hti.Type

Case System.Windows.Forms.DataGrid.HitTestType.None

' Console.WriteLine("You clicked the background.")

 

 

Case System.Windows.Forms.DataGrid.HitTestType.Cell

' Console.WriteLine("You clicked cell at row " & hti.Row & ", col " & hti.Column)

 

i = hti.Row

j = hti.Column

 

 

' Evalua el estado de la celda solicitada

 

Ocupada = CJvida.Ocupada(lSIZE - i - 1, j + 1)

 

 

' Cambia el estado de la celda solicitada

 

If Ocupada = 1 Then

 

lResul = CJvida.Write(lSIZE - i - 1, j + 1, 0)

 

Else : lResul = CJvida.Write(lSIZE - i - 1, j + 1, 1)

 

End If

 

 

' Representación

 

Presentar_Click(sender, e)

 

 

Case . . .

 

End Select

 

 

End Sub

                                                                                                               _______



La codificación completa extractada aquí se adjunta en el apéndice

"C5 Relación de programas de muestra desarrollados en el libro"


 

                                                                                                               _______