Llop_Sudoku - Espacio de nombres Llop_Sudoku
Llop Site Home > Visual Studio .NET > Sudoku > Llop_Sudoku
Clase Form1
Namespace Llop_Sudoku Public Class Form1 : Inherits System.Windows.Forms.Form Private Shared LadoMargenEnPixels As Int32 = 30 Private Shared dimensiones()() As Int32 = {New Int32() {4, 4, 2, 2}, _ New Int32() {6, 6, 3, 2}, _ New Int32() {6, 6, 2, 3}, _ New Int32() {9, 9, 3, 3}, _ New Int32() {12, 12, 4, 3}, _ New Int32() {12, 12, 3, 4}, _ New Int32() {16, 16, 4, 4}} Private sudoku As Llop_Sudoku_Sudoku Private textboxes As New ArrayList Dim _creadorPdf As New CreadorPDF #Region " Código generado por el Diseñador de Windows Forms " Public Sub New() MyBase.New() 'El Diseñador de Windows Forms requiere esta llamada. InitializeComponent() inicializaComponentesDos() End Sub 'Form reemplaza a Dispose para limpiar la lista de componentes. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Requerido por el Diseñador de Windows Forms Private components As System.ComponentModel.IContainer 'NOTA: el Diseñador de Windows Forms requiere el siguiente procedimiento 'Puede modificarse utilizando el Diseñador de Windows Forms. 'No lo modifique con el editor de código. Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox Friend WithEvents Label2 As System.Windows.Forms.Label Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents Button2 As System.Windows.Forms.Button Friend WithEvents Button3 As System.Windows.Forms.Button Friend WithEvents StatusBar1 As System.Windows.Forms.StatusBar Friend WithEvents TrackBar1 As System.Windows.Forms.TrackBar Friend WithEvents ComboBox2 As System.Windows.Forms.ComboBox Friend WithEvents Label3 As System.Windows.Forms.Label Friend WithEvents GroupBox2 As System.Windows.Forms.GroupBox Friend WithEvents Label4 As System.Windows.Forms.Label Friend WithEvents Label5 As System.Windows.Forms.Label Friend WithEvents Label6 As System.Windows.Forms.Label Friend WithEvents Label7 As System.Windows.Forms.Label Friend WithEvents Label8 As System.Windows.Forms.Label Friend WithEvents Label9 As System.Windows.Forms.Label Friend WithEvents GroupBox3 As System.Windows.Forms.GroupBox Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox Friend WithEvents GroupBox4 As System.Windows.Forms.GroupBox Friend WithEvents Button4 As System.Windows.Forms.Button Friend WithEvents GroupBox5 As System.Windows.Forms.GroupBox Friend WithEvents Button5 As System.Windows.Forms.Button Friend WithEvents Button6 As System.Windows.Forms.Button Friend WithEvents GroupBox6 As System.Windows.Forms.GroupBox Friend WithEvents Button7 As System.Windows.Forms.Button Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBoxPrivate Sub InitializeComponent() Me.GroupBox1 = New System.Windows.Forms.GroupBox Me.Label9 = New System.Windows.Forms.Label Me.TrackBar1 = New System.Windows.Forms.TrackBar Me.Button1 = New System.Windows.Forms.Button Me.Label2 = New System.Windows.Forms.Label Me.Button2 = New System.Windows.Forms.Button Me.Button3 = New System.Windows.Forms.Button Me.StatusBar1 = New System.Windows.Forms.StatusBar Me.ComboBox2 = New System.Windows.Forms.ComboBox Me.Label3 = New System.Windows.Forms.Label Me.GroupBox2 = New System.Windows.Forms.GroupBox Me.Label8 = New System.Windows.Forms.Label Me.Label7 = New System.Windows.Forms.Label Me.Label6 = New System.Windows.Forms.Label Me.Label5 = New System.Windows.Forms.Label Me.Label4 = New System.Windows.Forms.Label Me.GroupBox3 = New System.Windows.Forms.GroupBox Me.CheckBox1 = New System.Windows.Forms.CheckBox Me.GroupBox4 = New System.Windows.Forms.GroupBox Me.Button6 = New System.Windows.Forms.Button Me.Button5 = New System.Windows.Forms.Button Me.Button4 = New System.Windows.Forms.Button Me.GroupBox5 = New System.Windows.Forms.GroupBox Me.ComboBox1 = New System.Windows.Forms.ComboBox Me.GroupBox6 = New System.Windows.Forms.GroupBox Me.Button7 = New System.Windows.Forms.Button Me.GroupBox1.SuspendLayout() CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).BeginInit() Me.GroupBox2.SuspendLayout() Me.GroupBox3.SuspendLayout() Me.GroupBox4.SuspendLayout() Me.GroupBox5.SuspendLayout() Me.GroupBox6.SuspendLayout() Me.SuspendLayout() ' 'GroupBox1 ' Me.GroupBox1.Controls.Add(Me.Label9) Me.GroupBox1.Controls.Add(Me.TrackBar1) Me.GroupBox1.Controls.Add(Me.Button1) Me.GroupBox1.Controls.Add(Me.Label2) Me.GroupBox1.Location = New System.Drawing.Point(640, 64) Me.GroupBox1.Name = "GroupBox1" Me.GroupBox1.Size = New System.Drawing.Size(232, 112) Me.GroupBox1.TabIndex = 0 Me.GroupBox1.TabStop = False Me.GroupBox1.Text = "Generación sudoku" ' 'Label9 ' Me.Label9.Location = New System.Drawing.Point(168, 56) Me.Label9.Name = "Label9" Me.Label9.Size = New System.Drawing.Size(56, 16) Me.Label9.TabIndex = 5 Me.Label9.TextAlign = System.Drawing.ContentAlignment.MiddleRight ' 'TrackBar1 ' Me.TrackBar1.AutoSize = False Me.TrackBar1.Location = New System.Drawing.Point(8, 72) Me.TrackBar1.Name = "TrackBar1" Me.TrackBar1.Size = New System.Drawing.Size(216, 32) Me.TrackBar1.TabIndex = 4 Me.TrackBar1.TickStyle = System.Windows.Forms.TickStyle.TopLeft ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(8, 24) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(216, 24) Me.Button1.TabIndex = 3 Me.Button1.Text = "Nuevo sudoku" ' 'Label2 ' Me.Label2.Location = New System.Drawing.Point(8, 56) Me.Label2.Name = "Label2" Me.Label2.Size = New System.Drawing.Size(56, 16) Me.Label2.TabIndex = 1 Me.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft ' 'Button2 ' Me.Button2.Location = New System.Drawing.Point(8, 24) Me.Button2.Name = "Button2" Me.Button2.Size = New System.Drawing.Size(216, 24) Me.Button2.TabIndex = 4 Me.Button2.Text = "Nuevo sudoku vacío" ' 'Button3 ' Me.Button3.Location = New System.Drawing.Point(8, 24) Me.Button3.Name = "Button3" Me.Button3.Size = New System.Drawing.Size(216, 24) Me.Button3.TabIndex = 5 Me.Button3.Text = "Resolver sudoku" ' 'StatusBar1 ' Me.StatusBar1.Location = New System.Drawing.Point(0, 632) Me.StatusBar1.Name = "StatusBar1" Me.StatusBar1.Size = New System.Drawing.Size(880, 22) Me.StatusBar1.TabIndex = 1 ' 'ComboBox2 ' Me.ComboBox2.Location = New System.Drawing.Point(56, 56) Me.ComboBox2.Name = "ComboBox2" Me.ComboBox2.Size = New System.Drawing.Size(48, 21) Me.ComboBox2.TabIndex = 2 ' 'Label3 ' Me.Label3.Location = New System.Drawing.Point(8, 64) Me.Label3.Name = "Label3" Me.Label3.Size = New System.Drawing.Size(48, 16) Me.Label3.TabIndex = 3 Me.Label3.Text = "Solución" ' 'GroupBox2 ' Me.GroupBox2.Controls.Add(Me.Label8) Me.GroupBox2.Controls.Add(Me.Label7) Me.GroupBox2.Controls.Add(Me.Label6) Me.GroupBox2.Controls.Add(Me.Label5) Me.GroupBox2.Controls.Add(Me.Label4) Me.GroupBox2.Controls.Add(Me.Button3) Me.GroupBox2.Controls.Add(Me.Label3) Me.GroupBox2.Controls.Add(Me.ComboBox2) Me.GroupBox2.Location = New System.Drawing.Point(640, 464) Me.GroupBox2.Name = "GroupBox2" Me.GroupBox2.Size = New System.Drawing.Size(232, 160) Me.GroupBox2.TabIndex = 2 Me.GroupBox2.TabStop = False Me.GroupBox2.Text = "Solución" ' 'Label8 ' Me.Label8.Location = New System.Drawing.Point(88, 136) Me.Label8.Name = "Label8" Me.Label8.Size = New System.Drawing.Size(136, 16) Me.Label8.TabIndex = 10 ' 'Label7 ' Me.Label7.Location = New System.Drawing.Point(8, 136) Me.Label7.Name = "Label7" Me.Label7.Size = New System.Drawing.Size(72, 16) Me.Label7.TabIndex = 9 Me.Label7.Text = "Tiempo (ms):" ' 'Label6 ' Me.Label6.Location = New System.Drawing.Point(88, 112) Me.Label6.Name = "Label6" Me.Label6.Size = New System.Drawing.Size(136, 16) Me.Label6.TabIndex = 8 ' 'Label5 ' Me.Label5.Location = New System.Drawing.Point(8, 112) Me.Label5.Name = "Label5" Me.Label5.Size = New System.Drawing.Size(72, 16) Me.Label5.TabIndex = 7 Me.Label5.Text = "Calificación:" ' 'Label4 ' Me.Label4.Location = New System.Drawing.Point(8, 88) Me.Label4.Name = "Label4" Me.Label4.Size = New System.Drawing.Size(216, 16) Me.Label4.TabIndex = 6 ' 'GroupBox3 ' Me.GroupBox3.Controls.Add(Me.CheckBox1) Me.GroupBox3.Controls.Add(Me.Button2) Me.GroupBox3.Location = New System.Drawing.Point(640, 184) Me.GroupBox3.Name = "GroupBox3" Me.GroupBox3.Size = New System.Drawing.Size(232, 80) Me.GroupBox3.TabIndex = 3 Me.GroupBox3.TabStop = False Me.GroupBox3.Text = "Creación sudoku" ' 'CheckBox1 ' Me.CheckBox1.Location = New System.Drawing.Point(8, 56) Me.CheckBox1.Name = "CheckBox1" Me.CheckBox1.Size = New System.Drawing.Size(216, 16) Me.CheckBox1.TabIndex = 5 Me.CheckBox1.Text = "Poniendo pistas" ' 'GroupBox4 ' Me.GroupBox4.Controls.Add(Me.Button6) Me.GroupBox4.Controls.Add(Me.Button5) Me.GroupBox4.Controls.Add(Me.Button4) Me.GroupBox4.Location = New System.Drawing.Point(640, 336) Me.GroupBox4.Name = "GroupBox4" Me.GroupBox4.Size = New System.Drawing.Size(232, 120) Me.GroupBox4.TabIndex = 4 Me.GroupBox4.TabStop = False Me.GroupBox4.Text = "Evaluación" ' 'Button6 ' Me.Button6.Location = New System.Drawing.Point(8, 56) Me.Button6.Name = "Button6" Me.Button6.Size = New System.Drawing.Size(216, 24) Me.Button6.TabIndex = 2 Me.Button6.Text = "Añadir pista" ' 'Button5 ' Me.Button5.Location = New System.Drawing.Point(8, 88) Me.Button5.Name = "Button5" Me.Button5.Size = New System.Drawing.Size(216, 24) Me.Button5.TabIndex = 1 Me.Button5.Text = "Volver a empezar" ' 'Button4 ' Me.Button4.Location = New System.Drawing.Point(8, 24) Me.Button4.Name = "Button4" Me.Button4.Size = New System.Drawing.Size(216, 24) Me.Button4.TabIndex = 0 Me.Button4.Text = "¿Qué tal voy?" ' 'GroupBox5 ' Me.GroupBox5.Controls.Add(Me.ComboBox1) Me.GroupBox5.Location = New System.Drawing.Point(640, 8) Me.GroupBox5.Name = "GroupBox5" Me.GroupBox5.Size = New System.Drawing.Size(232, 48) Me.GroupBox5.TabIndex = 5 Me.GroupBox5.TabStop = False Me.GroupBox5.Text = "Tamaño de la cuadrícula" ' 'ComboBox1 ' Me.ComboBox1.Location = New System.Drawing.Point(8, 16) Me.ComboBox1.Name = "ComboBox1" Me.ComboBox1.Size = New System.Drawing.Size(216, 21) Me.ComboBox1.TabIndex = 2 ' 'GroupBox6 ' Me.GroupBox6.Controls.Add(Me.Button7) Me.GroupBox6.Location = New System.Drawing.Point(640, 272) Me.GroupBox6.Name = "GroupBox6" Me.GroupBox6.Size = New System.Drawing.Size(232, 56) Me.GroupBox6.TabIndex = 6 Me.GroupBox6.TabStop = False Me.GroupBox6.Text = "Exportar" ' 'Button7 ' Me.Button7.Location = New System.Drawing.Point(8, 24) Me.Button7.Name = "Button7" Me.Button7.Size = New System.Drawing.Size(216, 24) Me.Button7.TabIndex = 0 Me.Button7.Text = "Crear .PDF" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(880, 654) Me.Controls.Add(Me.GroupBox6) Me.Controls.Add(Me.GroupBox5) Me.Controls.Add(Me.GroupBox4) Me.Controls.Add(Me.GroupBox3) Me.Controls.Add(Me.GroupBox2) Me.Controls.Add(Me.StatusBar1) Me.Controls.Add(Me.GroupBox1) Me.Name = "Form1" Me.Text = "Llop_Sudoku v1.0" Me.GroupBox1.ResumeLayout(False) CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).EndInit() Me.GroupBox2.ResumeLayout(False) Me.GroupBox3.ResumeLayout(False) Me.GroupBox4.ResumeLayout(False) Me.GroupBox5.ResumeLayout(False) Me.GroupBox6.ResumeLayout(False) Me.ResumeLayout(False) End Sub #End Region 'Private Function CBin(ByVal Number As Integer) As String ' Dim Temp As Object ' Temp = 1 'Can't fouble nothing ' Do Until Temp > Number 'sets starting point for Len ' Temp = Temp * 2 ' Loop ' Do Until Temp < 1 ' If Number >= Temp Then ' CBin = CBin + "1" ' Number = Number - Temp ' Else ' CBin = CBin + "0" ' End If ' Temp = Temp / 2 ' Loop 'Loop until string is complete ' CBin = CStr(Val(CBin)) 'End Function Private Sub inicializaComponentesDos() Dim tamanosComboBox As String() = {"Sudoku de 4x4 y regiones de 2x2", _ "Sudoku de 6x6 y regiones de 2x3", _ "Sudoku de 6x6 y regiones de 3x2", _ "Sudoku de 9x9 y regiones de 3x3", _ "Sudoku de 12x12 y regiones de 3x4", _ "Sudoku de 12x12 y regiones de 4x3", _ "Sudoku de 16x16 y regiones de 4x4"} ', "Cuadrícula de 25x25; regiones de 5x5"} Me.ComboBox1.DataSource = tamanosComboBox Me.ComboBox1.SelectedIndex = 3 Me.sudoku = New Llop_Sudoku_Sudoku(dimensiones(ComboBox1.SelectedIndex)(0), _ dimensiones(ComboBox1.SelectedIndex)(1), _ dimensiones(ComboBox1.SelectedIndex)(2), _ dimensiones(ComboBox1.SelectedIndex)(3)) 'Me.ajustaTamanoFormulario() Me.anadeCasillas() End Sub Private Sub anadeCasillas() Dim i As Int32 Dim j As Int32 Dim textbox As Llop_Sudoku_TextBox Dim casilla As Llop_Sudoku_Casilla Dim fila As Int32 Dim col As Int32 Dim ladoTextbox As Int32 = 576 / Me.sudoku.numeroFilas Dim maximaCapacidad As Int32 If Me.sudoku.numeroFilas < 10 Then maximaCapacidad = 1 Else maximaCapacidad = 2 End If Me.SuspendLayout() For Each antiguoTextbox As Llop_Sudoku_TextBox In textboxes Me.Controls.Remove(antiguoTextbox) Next textboxes.Clear() For i = 0 To Me.sudoku.numeroFilas - 1 For j = 0 To Me.sudoku.numeroColumnas - 1 casilla = Me.sudoku.Casilla(i, j) textbox = New Llop_Sudoku_TextBox(ladoTextbox, maximaCapacidad, casilla) If casilla.EsPista Then textbox.EsEditable = False textbox.ForeColor = Llop_Sudoku_Util.ColorPista End If textbox.Location = New System.Drawing.Point(LadoMargenEnPixels + j * ladoTextbox, LadoMargenEnPixels + i * ladoTextbox) textboxes.Add(textbox) Me.Controls.Add(textbox) Next j Next i Me.coloreaCasillas() Me.ResumeLayout() Me.refrescaCasillas() End Sub 'Private Sub ajustaTamanoFormulario() ' Dim y As Int32 ' Dim x As Int32 = 0 ' x += LadoMargenEnPixels * 2 + Me.sudoku.NumeroCasillasLado * Llop_Sudoku_TextBox.LadoEnPixels ' Me.SuspendLayout() ' Me.GroupBox1.Location = New Point(x, GroupBox1.Location.Y) ' Me.GroupBox2.Location = New Point(x, GroupBox2.Location.Y) ' 'Me.GroupBox1.Size = New Size(GroupBox1.Size.Width, x - 14) ' 'Me.Button1.Location = New Point(Button1.Location.X, GroupBox1.Size.Height - 96) ' 'Me.Button2.Location = New Point(Button2.Location.X, GroupBox1.Size.Height - 64) ' 'Me.Button3.Location = New Point(Button3.Location.X, GroupBox1.Size.Height - 32) ' If x + 22 < GroupBox1.Size.Height + GroupBox2.Size.Height + 38 Then ' y = GroupBox1.Size.Height + GroupBox2.Size.Height + 38 ' Else ' y = x + 22 ' End If ' Me.ClientSize = New Size(x + GroupBox1.Size.Width + 12, y) ' Me.ResumeLayout() 'End Sub Private Sub refrescaCasillas() For Each textbox As Llop_Sudoku_TextBox In textboxes textbox.refresca() Next End Sub Private Sub trataSolucion(ByVal solucion As Solucion) Dim cadena As String = solucion.getNumeroSoluciones & " solucion(es) encontrada(s) en " & solucion.getTiempoSolucion & " ms.; número de cambios: " & solucion.getCambios Me.StatusBar1.Text = cadena Me.Label4.Text = solucion.getNumeroSoluciones Me.Label6.Text = solucion.getCambios & " - " & Llop_Sudoku_Util.getDescripcionCalificación(solucion.getCambios) Me.Label8.Text = solucion.getTiempoSolucion If solucion.getNumeroSoluciones = 0 Then Me.ComboBox2.DataSource = Nothing MsgBox("Ninguna solución - ¡mal problema!", MsgBoxStyle.Exclamation, "Llop_Sudoku - Advertencia") Return End If Dim solucionesComboBox As New ArrayList Dim i As Int32 For i = 0 To solucion.getNumeroSoluciones - 1 solucionesComboBox.Add(i + 1) Next i Me.ComboBox2.DataSource = solucionesComboBox Me.ComboBox2.SelectedIndex = 0 Me.setValorCasillas(solucion.getSolucion(ComboBox2.SelectedIndex)) If Not solucion.getNumeroSoluciones = 1 Then MsgBox("Más de una solución - ¡mal problema!", MsgBoxStyle.Exclamation, "Llop_Sudoku - Advertencia") End If End Sub Private Sub setValorCasillas(ByVal valores()() As Int32) For i As Int32 = 0 To Me.sudoku.numeroFilas - 1 For j As Int32 = 0 To Me.sudoku.numeroColumnas - 1 Me.sudoku.Casilla(i, j).Valor = valores(i)(j) Next j Next i End Sub Private Sub limpiaPanelSoluciones() Me.Label4.Text = "" Me.Label6.Text = "" Me.Label8.Text = "" Me.ComboBox2.DataSource = Nothing End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try If Me.ComboBox1.SelectedIndex > 5 Then If Not MsgBox("Crear un sudoku de este tamaño puede tardar varios minutos." & Chr(13) & "¿Desea crearlo de todos modos?", MsgBoxStyle.YesNo, "Llop_Sudoku - Advertencia") = MsgBoxResult.Yes Then Return End If End If Dim sudokuTemp As New Llop_Sudoku_Sudoku(dimensiones(ComboBox1.SelectedIndex)(0), _ dimensiones(ComboBox1.SelectedIndex)(1), _ dimensiones(ComboBox1.SelectedIndex)(2), _ dimensiones(ComboBox1.SelectedIndex)(3)) Dim numPistas As Int32 = Me.TrackBar1.Value If sudokuTemp.generaPuzzle(numPistas) Then Me.sudoku = sudokuTemp Dim prob As Problema = Me.sudoku.Problema Me.StatusBar1.Text = Me.ComboBox1.SelectedItem & " creado en " & prob.getTiempoGeneracion & " ms.; número de cambios: " & prob.getCambios Me.limpiaPanelSoluciones() 'Me.ajustaTamanoFormulario() Me.anadeCasillas() Else Dim mensaje As String = "Ha fallado la creación de un puzzle válido." Me.StatusBar1.Text = mensaje MsgBox(mensaje, MsgBoxStyle.Exclamation, "Llop_Sudoku - Advertencia") End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Try Me.coloreaCasillas() If Not Me.sudoku.EsGenerado Then Me.establecePistas() End If If Me.sudoku.EstaSolucionado Then MsgBox("¡Sudoku bien resuelto!", MsgBoxStyle.Information, "Llop_Sudoku - ¡Felicidades!") Return End If If Not Me.sudoku.EstaVacio Then Me.sudoku.setProblema(Me.sudoku.getProblema) Me.trataSolucion(Me.sudoku.getSolucion) Me.refrescaCasillas() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub establecePistas() ' Si no hay casillas escritas en color oliva, pintamos las que están escritas de color oliva. Dim ctrl As Boolean = True For Each textbox As Llop_Sudoku_TextBox In textboxes If Not textbox.Text.Equals("") And textbox.ForeColor.Equals(Llop_Sudoku_Util.ColorPista) Then ctrl = False Exit For End If Next If ctrl Then For Each textbox As Llop_Sudoku_TextBox In textboxes If Not textbox.Text.Equals("") Then textbox.ForeColor = Llop_Sudoku_Util.ColorPista End If Next End If Me.fijarPistas() ' Establecemos como pista las casillas no editables. Las demás pasan a no ser pistas. Dim pivote As Int32 = 0 For i As Int32 = 0 To Me.sudoku.numeroFilas - 1 For j As Int32 = 0 To Me.sudoku.numeroColumnas - 1 If Not Me.sudoku.Casilla(i, j).EstaEscrita Then Me.sudoku.Casilla(i, j).EsPista = False Else If CType(Me.textboxes.Item(pivote), Llop_Sudoku_TextBox).EsEditable Then Me.sudoku.Casilla(i, j).EsPista = False Else Me.sudoku.Casilla(i, j).EsPista = True End If End If pivote += 1 Next j Next i Me.CheckBox1.Checked = False End Sub Private Sub coloreaTextboxesVacios(ByVal color As Color) For Each textbox As Llop_Sudoku_TextBox In textboxes If textbox.Text.Equals("") Then textbox.ForeColor = color End If Next End Sub Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged If Me.ComboBox2.DataSource Is Nothing Then Return End If Try If Not Me.sudoku.getSolucion.getNumeroSoluciones = 0 Then Me.setValorCasillas(Me.sudoku.getSolucion.getSolucion(ComboBox2.SelectedIndex)) Me.refrescaCasillas() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try Me.sudoku = New Llop_Sudoku_Sudoku(dimensiones(ComboBox1.SelectedIndex)(0), _ dimensiones(ComboBox1.SelectedIndex)(1), _ dimensiones(ComboBox1.SelectedIndex)(2), _ dimensiones(ComboBox1.SelectedIndex)(3)) 'Me.ajustaTamanoFormulario() Me.limpiaPanelSoluciones() Me.anadeCasillas() If Me.CheckBox1.Checked Then Me.coloreaTextboxesVacios(Llop_Sudoku_Util.ColorPista) Else Me.coloreaTextboxesVacios(Llop_Sudoku_Util.ColorNormal) End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub fijarPistas() For Each textbox As Llop_Sudoku_TextBox In textboxes If Not textbox.Text.Equals("") And textbox.ForeColor.Equals(Llop_Sudoku_Util.ColorPista) Then textbox.EsEditable = False Else textbox.EsEditable = True End If Next End Sub Private Function hayPistas() As Boolean For Each textbox As Llop_Sudoku_TextBox In textboxes If Not textbox.Text.Equals("") And textbox.ForeColor.Equals(Llop_Sudoku_Util.ColorPista) Then Return True End If Next Return False End Function Private Sub habilitarTextboxes() For Each textbox As Llop_Sudoku_TextBox In textboxes textbox.EsEditable = True Next End Sub Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged Try If Me.sudoku.EsGenerado Then Return End If If Me.CheckBox1.Checked Then Me.coloreaTextboxesVacios(Llop_Sudoku_Util.ColorPista) Me.habilitarTextboxes() Else Me.coloreaTextboxesVacios(Llop_Sudoku_Util.ColorNormal) Me.fijarPistas() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Try If Not Me.sudoku.EsGenerado And Me.hayPistas Then Me.establecePistas() End If Me.sudoku.vacia() Me.coloreaCasillas() Me.refrescaCasillas() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Try Me.coloreaCasillas() If Me.sudoku.EstaSolucionado Then MsgBox("¡Sudoku bien resuelto!", MsgBoxStyle.Information, "Llop_Sudoku - ¡Felicidades!") Return End If Me.trataEvaluacion(Me.sudoku.evalua) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub trataEvaluacion(ByVal evaluacion As Llop_Sudoku_Evaluacion) If evaluacion Is Nothing Then MsgBox("El problema no es de solución única y no se puede evaluar.", MsgBoxStyle.Exclamation, "Llop_Sudoku - Evaluación") Return End If Dim numRegion As Int32 Dim numCasilla As Int32 Dim fila As Int32 Dim columna As Int32 Dim coordX As Int32 Dim coordY As Int32 For i As Int32 = 0 To evaluacion.NumeroRegionesConError - 1 numRegion = evaluacion.RegionConError(i) fila = Decimal.Floor(numRegion / Me.sudoku.numeroFilasRegion) columna = numRegion Mod Me.sudoku.numeroFilasRegion For m As Int32 = 0 To Me.sudoku.numeroFilasRegion - 1 For n As Int32 = 0 To Me.sudoku.numeroColumnasRegion - 1 coordX = columna * Me.sudoku.numeroColumnasRegion + n coordY = fila * Me.sudoku.numeroFilasRegion + m numCasilla = coordX + Me.sudoku.numeroColumnas * coordY CType(Me.textboxes.Item(numCasilla), Llop_Sudoku_TextBox).BackColor = Llop_Sudoku_Util.ColorError Next n Next m Next i Dim mensaje As String If evaluacion.NumeroRegionesConError = 0 Then If Me.numeroTextboxesVacios = 0 Then mensaje = "¡Sudoku solucionado! ¡Felicidades!" Else mensaje = evaluacion.Mensaje & Chr(13) & " Te quedan " & Me.numeroTextboxesVacios & " números." End If End If MsgBox(evaluacion.Mensaje, MsgBoxStyle.Information, "Llop_Sudoku - Evaluación") End Sub Private Function numeroTextboxesVacios() As Int32 Dim cuenta As Int32 = 0 For Each txtbox As Llop_Sudoku_TextBox In textboxes If txtbox.Text.Equals("") Then cuenta += 1 End If Next Return cuenta End Function Private Sub coloreaCasillas() Dim fila As Int32 Dim col As Int32 Dim pivote As Int32 = 0 For i As Int32 = 0 To Me.sudoku.numeroFilas - 1 For j As Int32 = 0 To Me.sudoku.numeroColumnas - 1 fila = Decimal.Floor(i / Me.sudoku.numeroFilasRegion) col = Decimal.Floor(j / Me.sudoku.numeroColumnasRegion) CType(textboxes.Item(pivote), Llop_Sudoku_TextBox).BackColor = Llop_Sudoku_Util.getColor(fila, col) pivote += 1 Next j Next i End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Try Me.coloreaCasillas() If Me.sudoku.EstaLleno Then MsgBox("No hay donde poner la pista.", MsgBoxStyle.Exclamation, "Llop_Sudoku - Advertencia") Return End If Dim generadorAleatorios As New Random Dim indice As Int32 = generadorAleatorios.Next(0, textboxes.Count) While Not CType(textboxes.Item(indice), Llop_Sudoku_TextBox).Text.Equals("") indice = generadorAleatorios.Next(0, textboxes.Count) End While Dim pista As Int32 = Me.sudoku.getPista(indice) CType(textboxes.Item(indice), Llop_Sudoku_TextBox).EsEditable = False CType(textboxes.Item(indice), Llop_Sudoku_TextBox).ForeColor = Llop_Sudoku_Util.ColorPista Dim casilla As Llop_Sudoku_Casilla = CType(textboxes.Item(indice), Llop_Sudoku_TextBox).Casilla casilla.Valor = pista casilla.EsPista = True Me.refrescaCasillas() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click Try Dim filename As String = _creadorPdf.creaPdfSudoku(Me.sudoku) 'Dim pdf As New AxPdfLib.AxPdf 'pdf.LoadFile(filename) 'Dim pdf As New PdfLib.Pdf 'pdf.LoadFile(filename) System.Diagnostics.Process.Start(filename) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Llop_Sudoku - Excepción capturada") End Try End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Dim tamano As Int32 Select Case Me.ComboBox1.SelectedIndex Case 0 tamano = sudoku.CUATRO_X_CUATRO Case 1, 2 tamano = sudoku.SEIS_X_SEIS Case 3 tamano = sudoku.NUEVE_X_NUEVE Case 4, 5 tamano = sudoku.DOCE_X_DOCE Case 6 tamano = sudoku.DIECISEIS_X_DIECISEIS Case Else Throw New Exception("Tamaño del sudoku no permitido.") End Select Me.Label2.Text = sudoku.getRangoPistasPorDimension(tamano)(0) & " pistas" Me.Label9.Text = sudoku.getRangoPistasPorDimension(tamano)(1) & " pistas" Me.TrackBar1.Minimum = sudoku.getRangoPistasPorDimension(tamano)(0) Me.TrackBar1.Maximum = sudoku.getRangoPistasPorDimension(tamano)(1) End Sub End Class End Namespace
Clase Llop_Sudoku_Casilla
Namespace Llop_Sudoku Public Class Llop_Sudoku_Casilla Private _EstaEscrita As Boolean Private _EsPista As Boolean Private _maximoValor As Int32 Private _Valor As Int32 Private _PosiblesValores As New ArrayList Public Property EsPista() As Boolean Get Return _EsPista End Get Set(ByVal Value As Boolean) _EsPista = Value End Set End Property Public Property Valor() As Int32 Get Return _Valor End Get Set(ByVal Value As Int32) If Value < 0 Or Value > Me._maximoValor Then Throw New Exception("El valor no está permitido.") End If _Valor = Value If _Valor = 0 Then _EstaEscrita = False Else _EstaEscrita = True End If End Set End Property Public ReadOnly Property EstaEscrita() As Boolean Get Return _EstaEscrita End Get End Property Public Sub New(ByVal maximoValor As Int32) Me._maximoValor = maximoValor Me._EsPista = False Me.borrarValor() End Sub Public Sub borrarValor() Me.Valor = 0 End Sub Public Sub anadePosibleValor(ByVal posibleValor As Int32) Me._PosiblesValores.Add(posibleValor) End Sub Public Function getNumeroPosiblesValores() As Int32 Return Me._PosiblesValores.Count() End Function Public Function getPosibleValor(ByVal indice As Int32) As Int32 Return Me._PosiblesValores.Item(indice) End Function Public Overloads Overrides Function Equals(ByVal objeto As Object) As Boolean 'Miramos que objeto no sea nulo, y que sea del tipo 'LlopID3TagInfo'. If objeto Is Nothing Or Not Me.GetType() Is objeto.GetType() Then Return False End If Dim otraCasilla As Llop_Sudoku_Casilla = CType(objeto, Llop_Sudoku_Casilla) If Not Me.Valor = otraCasilla.Valor Or Not _ Me.getNumeroPosiblesValores = otraCasilla.getNumeroPosiblesValores() Then Return False End If Dim switch As Boolean Dim i As Int32 Dim j As Int32 Dim posibleValor As Int32 For i = 0 To Me.getNumeroPosiblesValores posibleValor = Me.getPosibleValor(i) switch = True For j = 0 To Me.getNumeroPosiblesValores If posibleValor = otraCasilla.getPosibleValor(j) Then switch = False Exit For End If Next j If switch Then Return False End If Next i Return True End Function End Class End Namespace
Clase Llop_Sudoku_ColumnaRegiones
Namespace Llop_Sudoku Public Class Llop_Sudoku_ColumnaRegiones : Inherits Llop_Sudoku_FilaRegiones End Class End Namespace
Clase Llop_Sudoku_ColumnaCasillas
Namespace Llop_Sudoku Public Class Llop_Sudoku_ColumnaCasillas : Inherits Llop_Sudoku_FilaCasillas End Class End Namespace
Clase Llop_Sudoku_Evaluacion
Namespace Llop_Sudoku Public Class Llop_Sudoku_Evaluacion Private _mensaje As String Private _numeroRegionesConError As Int32 Private _regionesConError As ArrayList Public ReadOnly Property Mensaje() As String Get Return Me._mensaje End Get End Property Public ReadOnly Property RegionConError(ByVal indice As Int32) As Int32 Get Return Me._regionesConError.Item(indice) End Get End Property Public ReadOnly Property NumeroRegionesConError() As Int32 Get Return Me._numeroRegionesConError End Get End Property Public Sub New(ByVal nuevasRegionesConError As ArrayList) Me._regionesConError = nuevasRegionesConError Me._numeroRegionesConError = nuevasRegionesConError.Count If Me._numeroRegionesConError = 0 Then Me._mensaje = "¡Por ahora bien!" Else Me._mensaje = "Algo falla en las regiones coloreadas." End If End Sub End Class End Namespace
Clase Llop_Sudoku_FilaCasillas
Namespace Llop_Sudoku Public Class Llop_Sudoku_FilaCasillas Private _casillas As New ArrayList Public Function getCasilla(ByVal indice As Int32) As Llop_Sudoku_Casilla Return CType(_casillas.Item(indice), Llop_Sudoku_Casilla) End Function Public Sub anadeCasilla(ByVal nuevaCasilla As Llop_Sudoku_Casilla) _casillas.Add(nuevaCasilla) End Sub End Class End Namespace
Clase Llop_Sudoku_FilaRegiones
Namespace Llop_Sudoku Public Class Llop_Sudoku_FilaRegiones Private regiones As ArrayList End Class End Namespace
Clase Llop_Sudoku_Region
Namespace Llop_Sudoku Public Class Llop_Sudoku_Region Private _numeroFilas As Int32 Private _numeroColumnas As Int32 Private _filas As New ArrayList Private _columnas As New ArrayList Public ReadOnly Property NumeroFilas() As Int32 Get Return _numeroFilas End Get End Property Public ReadOnly Property NumeroColumnas() As Int32 Get Return _numeroColumnas End Get End Property Public Sub New(ByVal arrayCasillas As Array) _numeroFilas = arrayCasillas.GetLength(0) _numeroColumnas = arrayCasillas.GetLength(1) ' Rellenar el array de filas Dim i As Int32 Dim j As Int32 Dim fila As Llop_Sudoku_FilaCasillas For i = 0 To _numeroFilas - 1 fila = New Llop_Sudoku_FilaCasillas For j = 0 To _numeroColumnas - 1 fila.anadeCasilla(arrayCasillas.GetValue(i, j)) Next j _filas.Add(fila) Next i ' Rellenar el array de columnas. Dim columna As Llop_Sudoku_ColumnaCasillas For j = 0 To _numeroColumnas - 1 columna = New Llop_Sudoku_ColumnaCasillas For i = 0 To _numeroFilas - 1 columna.anadeCasilla(arrayCasillas.GetValue(i, j)) Next i _columnas.Add(columna) Next j End Sub Public Function getCasilla(ByVal fila As Int32, ByVal columna As Int32) As Llop_Sudoku_Casilla Dim var As Llop_Sudoku_FilaCasillas = CType(_filas.Item(fila), Llop_Sudoku_FilaCasillas) Return var.getCasilla(columna) End Function Public Function getFilaCasillas(ByVal indice As Int32) As Llop_Sudoku_FilaCasillas Return CType(_filas.Item(indice), Llop_Sudoku_FilaCasillas) End Function Public Function getColumnaCasillas(ByVal indice As Int32) As Llop_Sudoku_ColumnaCasillas Return CType(_columnas.Item(indice), Llop_Sudoku_ColumnaCasillas) End Function End Class End Namespace
Clase Llop_Sudoku_Solucion
Namespace Llop_Sudoku Public Class Llop_Sudoku_Solucion Private _soluciones As New ArrayList Private _numeroSolucionesDisponibles As Int32 Private _numeroSolucionesReal As String Private _calificacion As String Private _tiempo As Int32 Public ReadOnly Property Solucion(ByVal indice As Int32) As String Get Return _soluciones.Item(indice) End Get End Property Public ReadOnly Property NumeroSolucionesDisponibles() As Int32 Get Return _numeroSolucionesDisponibles End Get End Property Public ReadOnly Property NumeroSolucionesReal() As String Get Return _numeroSolucionesReal End Get End Property Public ReadOnly Property Calificacion() As String Get Return _calificacion End Get End Property Public ReadOnly Property Tiempo() As Int32 Get Return _tiempo End Get End Property Public Sub New(ByVal solucion As String) Dim pivote1 As Int32 If solucion.StartsWith("0 ") Then Me._numeroSolucionesDisponibles = 0 Me._numeroSolucionesReal = solucion.Substring(0, 12) Me._calificacion = solucion.Substring(14, 19) pivote1 = solucion.IndexOf(" ms") Me._tiempo = Int32.Parse(solucion.Substring(40, pivote1 - 40)) Return End If Dim pivote2 As Int32 = solucion.IndexOf(", rating ") Dim arrSols As String() = solucion.Substring(0, pivote2).Split("#") Dim nulo As Char For pivote1 = 0 To arrSols.Length - 2 Me._soluciones.Add(arrSols(pivote1)) Next pivote1 Me._numeroSolucionesDisponibles = _soluciones.Count Me._numeroSolucionesReal = arrSols(pivote1) pivote1 = pivote2 + 9 pivote2 = solucion.IndexOf(", time ") Me._calificacion = solucion.Substring(pivote1, pivote2 - pivote1) pivote1 = pivote2 + 7 pivote2 = solucion.IndexOf(" ms") Me._tiempo = Int32.Parse(solucion.Substring(pivote1, pivote2 - pivote1)) End Sub End Class End Namespace
Clase Llop_Sudoku_Solucionador
Namespace Llop_Sudoku Public Class Llop_Sudoku_Solucionador Private sudoku As Llop_Sudoku_Sudoku Public Shared metodoIntermedioUno() End Class End Namespace
Clase Llop_Sudoku_Sudoku
Namespace Llop_Sudoku Public Class Llop_Sudoku_Sudoku : Inherits Sudoku Private _esGenerado As Boolean = False Private _problema As Problema Private _filas As New ArrayList Private _columnas As New ArrayList Private _regiones As Array Public ReadOnly Property EsGenerado() As Boolean Get Return Me._esGenerado End Get End Property Public ReadOnly Property Problema() As Problema Get Return _problema End Get End Property Public ReadOnly Property EstaVacio() As Boolean Get For i As Int32 = 0 To Me.numeroFilas - 1 For j As Int32 = 0 To Me.numeroColumnas - 1 If Me.Casilla(i, j).EstaEscrita Then Return False End If Next j Next i Return True End Get End Property Public ReadOnly Property EstaSolucionado() As Boolean Get If Not Me.EstaLleno Then Return False End If Return validaSolucion(Me.toInt32Array) End Get End Property Private Function validaSolucion(ByVal sol As Int32()()) As Boolean Dim i As Int32 Dim j As Int32 Dim m As Int32 Dim n As Int32 Dim coordX As Int32 Dim coordY As Int32 For i = 0 To Me.numeroFilas - 1 Dim restriccionFila(Me.numeroFilas) As Int32 For j = 0 To Me.numeroColumnas - 1 restriccionFila(sol(i)(j)) += 1 Next j For j = 0 To Me.numeroColumnas - 1 If Not restriccionFila(j) = 1 Then Return False End If Next j Next i For j = 0 To Me.numeroColumnas - 1 Dim restriccionColumna(Me.numeroColumnas) As Int32 For i = 0 To Me.numeroFilas - 1 restriccionColumna(sol(i)(j)) += 1 Next i For i = 0 To Me.numeroFilas - 1 If Not restriccionColumna(i) = 1 Then Return False End If Next i Next j For i = 0 To Me.numeroColumnasRegion - 1 For j = 0 To Me.numeroFilasRegion - 1 Dim restriccionRegion(Me.numeroCasillasRegion) As Int32 For m = 0 To Me.numeroFilasRegion - 1 For n = 0 To Me.numeroColumnasRegion - 1 coordX = i * Me.numeroFilasRegion + m coordY = j * Me.numeroColumnasRegion + n restriccionRegion(sol(coordX)(coordY)) += 1 Next n Next m For m = 0 To Me.numeroCasillasRegion - 1 If Not restriccionRegion(m) = 1 Then Return False End If Next m Next j Next i Return True End Function Public ReadOnly Property EstaLleno() As Boolean Get For i As Int32 = 0 To Me.numeroFilas - 1 For j As Int32 = 0 To Me.numeroColumnas - 1 If Not Me.Casilla(i, j).EstaEscrita Then Return False End If Next j Next i Return True End Get End Property Public ReadOnly Property Casilla(ByVal fila As Int32, ByVal columna As Int32) As Llop_Sudoku_Casilla Get Dim var As Llop_Sudoku_FilaCasillas = CType(_filas.Item(fila), Llop_Sudoku_FilaCasillas) Return var.getCasilla(columna) End Get End Property Public ReadOnly Property CasillaRegion(ByVal filaRegion As Int32, ByVal columnaRegion As Int32, ByVal filaCasilla As Int32, ByVal columnaCasilla As Int32) As Llop_Sudoku_Casilla Get Dim reg As Llop_Sudoku_Region = CType(_regiones.GetValue(filaRegion, columnaRegion), Llop_Sudoku_Region) Dim var As Llop_Sudoku_FilaCasillas = reg.getFilaCasillas(filaCasilla) Return var.getCasilla(columnaCasilla) End Get End Property Public Sub New(ByVal numFil As Int32, ByVal numCol As Int32, ByVal numFilReg As Int32, ByVal numColReg As Int32) MyBase.New(numFil, numCol, numFilReg, numColReg) Dim casillas As Array = Array.CreateInstance(GetType(Llop_Sudoku_Casilla), numFil, numCol) Dim i As Int32 Dim j As Int32 For i = 0 To numFil - 1 For j = 0 To numCol - 1 casillas.SetValue(New Llop_Sudoku_Casilla(Me.numeroCasillasRegion), i, j) Next j Next i ' Rellenar la matriz de regiones. _regiones = Array.CreateInstance(GetType(Llop_Sudoku_Region), numColReg, numFilReg) Dim casillasRegion As Array Dim region As Llop_Sudoku_Region Dim casilla As Llop_Sudoku_Casilla Dim m As Int32 Dim n As Int32 Dim coordX As Int32 Dim coordY As Int32 For i = 0 To numColReg - 1 For j = 0 To numFilReg - 1 casillasRegion = Array.CreateInstance(GetType(Llop_Sudoku_Casilla), numFilReg, numColReg) For m = 0 To numFilReg - 1 For n = 0 To numColReg - 1 coordX = i * numFilReg + m coordY = j * numColReg + n casillasRegion.SetValue(casillas.GetValue(coordX, coordY), m, n) Next n Next m region = New Llop_Sudoku_Region(casillasRegion) _regiones.SetValue(region, i, j) Next j Next i ' Rellenar las filas y las columnas Dim fila As Llop_Sudoku_FilaCasillas For i = 0 To numFil - 1 fila = New Llop_Sudoku_FilaCasillas For j = 0 To numCol - 1 fila.anadeCasilla(casillas.GetValue(i, j)) Next j _filas.Add(fila) Next i ' Rellenar el array de columnas. Dim columna As Llop_Sudoku_ColumnaCasillas For j = 0 To numCol - 1 columna = New Llop_Sudoku_ColumnaCasillas For i = 0 To numFil - 1 columna.anadeCasilla(casillas.GetValue(i, j)) Next i _columnas.Add(columna) Next j End Sub Private Overloads Sub rellenaValores(ByVal solucion As Int32()()) Me.rellenaValores(solucion, False) End Sub Private Overloads Sub rellenaValores(ByVal solucion As Int32()(), ByVal sonPistas As Boolean) Dim casilla As Llop_Sudoku_Casilla Dim i As Int32 Dim j As Int32 For i = 0 To Me.numeroFilas - 1 For j = 0 To Me.numeroColumnas - 1 casilla = Me.Casilla(i, j) casilla.Valor = solucion(i)(j) If sonPistas And Not casilla.Valor = 0 Then casilla.EsPista = True End If Next j Next i End Sub Public Function getPista(ByVal indice As Int32) As Int32 If Not Me._esGenerado Then Throw New Exception("Imposible añadir pistas si usted establece el problema.") End If Me.setProblema(Me.getProblema) Dim sol As Solucion = Me.getSolucion Dim fil As Int32 = Decimal.Floor(indice / Me.numeroColumnas) Dim col As Int32 = indice Mod Me.numeroColumnas Dim retorno As Int32 = sol.getSolucion(0)(fil)(col) Me._problema.getProblema(fil)(col) = retorno Return retorno End Function Public Function generaPuzzle(ByVal numeroPistas As Int32) As Boolean Me.setNumeroPistas(numeroPistas) Me._problema = Me.generaProblema Me._esGenerado = True Me.rellenaValores(Me._problema.getProblema, True) Return True End Function Public Function evalua() As Llop_Sudoku_Evaluacion Me.setProblema(Me.getProblema) If Not Me.getSolucion.getNumeroSoluciones = 1 Then Throw New Exception("Imposible evaluar - el sudoku no tiene una sola solución.") End If Dim regionesConError As New ArrayList Dim fil As Int32 Dim col As Int32 Dim prob()() As Int32 = Me.toInt32Array Dim sol()() As Int32 = Me.getSolucion.getSolucion(0) Dim pivoteReg As Int32 For i As Int32 = 0 To Me.numeroFilas - 1 For j As Int32 = 0 To Me.numeroColumnas - 1 If Not prob(i)(j) = 0 Then If Not prob(i)(j) = sol(i)(j) Then fil = Decimal.Floor(i / Me.numeroFilasRegion) col = Decimal.Floor(j / Me.numeroColumnasRegion) pivoteReg = fil * Me.numeroFilasRegion + col If Not regionesConError.Contains(pivoteReg) Then regionesConError.Add(pivoteReg) End If End If End If Next j Next i Return New Llop_Sudoku_Evaluacion(regionesConError) End Function Public Sub vacia() If Me._esGenerado Then Me.rellenaValores(Me.getProblema, True) Return End If For i As Int32 = 0 To Me.numeroFilas - 1 For j As Int32 = 0 To Me.numeroColumnas - 1 If Not Me.Casilla(i, j).EsPista Then Me.Casilla(i, j).borrarValor() End If Next j Next i End Sub Public Function getProblema() As Int32()() If Me._esGenerado Then Return Me._problema.getProblema End If Dim retorno(Me.numeroFilas - 1)() As Int32 Dim ctrl As Boolean = True For i As Int32 = 0 To Me.numeroFilas - 1 Dim fil(Me.numeroColumnas - 1) As Int32 retorno(i) = fil For j As Int32 = 0 To Me.numeroFilas - 1 If Me.Casilla(i, j).EsPista Then retorno(i)(j) = Me.Casilla(i, j).Valor If ctrl Then ctrl = False End If Else retorno(i)(j) = 0 End If Next j Next i If ctrl Then Return Me.toInt32Array End If Return retorno End Function Public Function toInt32Array() As Int32()() Dim retorno(Me.numeroFilas - 1)() As Int32 For i As Int32 = 0 To Me.numeroFilas - 1 Dim fil(Me.numeroColumnas - 1) As Int32 retorno(i) = fil For j As Int32 = 0 To Me.numeroColumnas - 1 retorno(i)(j) = Me.Casilla(i, j).Valor Next j Next i Return retorno End Function Public Overrides Function toString() As String Dim retorno As String = "" For i As Int32 = 0 To Me.numeroFilas - 1 For j As Int32 = 0 To Me.numeroColumnas - 1 retorno &= Llop_Sudoku_Util.getCaracterSudoku(Me.Casilla(i, j).Valor) Next j Next i Return retorno End Function End Class End Namespace
Clase Llop_Sudoku_TextBox
Namespace Llop_Sudoku Public Class Llop_Sudoku_TextBox : Inherits TextBox Private _EsEditable As Boolean Private _casilla As Llop_Sudoku_Casilla Public ReadOnly Property Casilla() As Llop_Sudoku_Casilla Get Return Me._casilla End Get End Property Public Property EsEditable() As Boolean Get Return Me._EsEditable End Get Set(ByVal Value As Boolean) Me._EsEditable = Value End Set End Property Public Sub New(ByVal lado As Int32, ByVal maximaCapacidad As Int32, ByVal nuevaCasilla As Llop_Sudoku_Casilla) MyBase.New() Dim tamFont As Single = lado * (14.25! / 28.0!) Me.AutoSize = False Me.BorderStyle = BorderStyle.FixedSingle Me.Font = New System.Drawing.Font("Microsoft Sans Serif", tamFont, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.MaxLength = maximaCapacidad Me.Size = New Size(lado, lado) Me.TextAlign = HorizontalAlignment.Center Me._EsEditable = True Me._casilla = nuevaCasilla End Sub Public Sub refresca() If _casilla.EstaEscrita Then Me.Text = _casilla.Valor Else Me.Text = "" End If End Sub ' Restricts the entry of characters to digits (including hex), ' the negative sign, the e decimal point, and editing keystrokes (backspace). Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs) MyBase.OnKeyPress(e) If Not Me._EsEditable Then e.Handled = True Return End If If [Char].IsDigit(e.KeyChar) Then ' Digits are OK Try _casilla.Valor = Int32.Parse(Me.Text & e.KeyChar) Catch ex As Exception e.Handled = True End Try ElseIf e.KeyChar = vbBack Then ' Backspace key is OK If Me.Text.Length = 1 Then _casilla.borrarValor() Else _casilla.Valor = Int32.Parse(Me.Text.Substring(0, Me.Text.Length - 1)) End If Else ' Swallow this invalid key and beep e.Handled = True End If End Sub Public ReadOnly Property IntValue() As Integer Get Return Int32.Parse(Me.Text) End Get End Property Public ReadOnly Property DecimalValue() As Decimal Get Return [Decimal].Parse(Me.Text) End Get End Property End Class End Namespace
Clase Llop_Sudoku_Util
Namespace Llop_Sudoku Public Class Llop_Sudoku_Util Private Shared CaracteresSudoku As Char() = {".", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "#", "*", "~"} Public Shared ColorNormal As Color = Color.Black Public Shared ColorPista As Color = Color.Olive Public Shared ColorError As Color = Color.Tomato Public Shared Function getDescripcionCalificación(ByVal calificacion As Int32) As String If calificacion < 2000 Then Return "¡Chupado!" ElseIf calificacion < 4000 Then Return "Niño pequeño" ElseIf calificacion < 6000 Then Return "Fácil" ElseIf calificacion < 8000 Then Return "Intermedio" ElseIf calificacion < 10000 Then Return "Avanzado" ElseIf calificacion < 12000 Then Return "Muy chungo" ElseIf calificacion < 20000 Then Return "Vas a llorar" Else Return "Nivel peninsular" End If End Function Public Shared Function getCaracterSudoku(ByVal valor As Int32) As Char If CaracteresSudoku.Length <= valor Then Throw New Exception("No existe un caracter para este valor.") End If Return CaracteresSudoku(valor) End Function Public Shared Function getValorSudoku(ByVal caracter As Char) As Int32 Dim i As Int32 For i = 0 To CaracteresSudoku.Length - 1 If caracter.Equals(CaracteresSudoku(i)) Then Return i End If Next i Throw New Exception("No existe un valor para este caracter.") End Function Public Shared Function getColor(ByVal fila As Int32, ByVal columna As Int32) As Color If fila Mod 2 = 0 Then columna += 1 End If If columna Mod 2 = 0 Then Return Color.LightSalmon End If Return Color.Beige End Function End Class End Namespace
Clase CreadorPDF
Imports System.Reflection Imports System.IO Imports iTextSharp.text Namespace Llop_Sudoku Public Class CreadorPDF Dim assyName As String = Path.GetFileName([Assembly].GetExecutingAssembly().GetName().CodeBase.ToString()) Dim assyVersion As String = [Assembly].GetExecutingAssembly().GetName().Version.ToString() Private rnd As New Random Private fileindex As Int32 = 0 Public Sub New() End Sub Public Function creaPdfSudoku(ByVal sudoku As Llop_Sudoku_Sudoku) As String Dim pid As Int32 = System.Diagnostics.Process.GetCurrentProcess().Id Dim Filename As String = System.IO.Path.Combine(System.IO.Path.GetTempPath(), String.Format("{0}-{1}-{2}.pdf", assyName, pid, fileindex + 1)) 'Dim filename As String = "C:\sudoku" & fileindex & ".pdf" fileindex += 1 Try ' step 1: create a document Dim document As New Document ' step 2: we set the ContentType and create an instance of the Writer 'string Filename= String.Format("{0}-{1}-{2}.pdf", assyName, pid, rnd.Next(1000)); iTextSharp.text.pdf.PdfWriter.GetInstance(document, New FileStream(Filename, FileMode.Create)) ' step 3: add metadata (before document.Open()) document.AddTitle("Llop_Sudoku") document.AddSubject("Sudoku") document.AddKeywords("Sudoku") document.AddCreator("Ensamblado .NET: " + assyName) document.AddAuthor("Albert Lobo") document.AddProducer() ' step 4: open the doc document.Open() ' step 5: Add content to the document Dim font28 As Font = FontFactory.GetFont(FontFactory.TIMES_BOLDITALIC, 28) Dim font18 = FontFactory.GetFont(FontFactory.HELVETICA, 18) 'Font font14= FontFactory.GetFont(FontFactory.HELVETICA, 14) Dim font12 = FontFactory.GetFont(FontFactory.HELVETICA_OBLIQUE, 12) Dim font8 = FontFactory.GetFont(FontFactory.HELVETICA, 8) Dim fontAnchor = FontFactory.GetFont(FontFactory.HELVETICA, 10, Font.UNDERLINE, New Color(0, 0, 255)) 'Chunk bullet= new Chunk("\u2022", font18) document.Add(New Paragraph(vbCr & vbCr & vbCr)) document.Add(New Paragraph(New Chunk("Llop_Sudoku", font28))) Dim info As String = String.Format("{0}, a las {1}" + vbCr, DateTime.Now.ToString("dddd, dd MMMM, yyyy"), DateTime.Now.ToString("hh:mm:ss tt zzzz")) document.Add(New Paragraph(New Chunk(info, font12))) If Not sudoku.getProblema Is Nothing Then Dim problema()() As Int32 = sudoku.getProblema Dim widthPercentage As Int32 Select Case sudoku.getNumeroFilas Case 4 widthPercentage = 25 Case 6 widthPercentage = 40 Case 9 widthPercentage = 60 Case 12 widthPercentage = 80 Case 16 widthPercentage = 90 End Select Dim bigtable As New iTextSharp.text.pdf.PdfPTable(sudoku.numeroFilasRegion) bigtable.WidthPercentage = widthPercentage bigtable.DefaultCell.BorderWidth = 1.2F bigtable.DefaultCell.Padding = 0.8F Dim coordX As Int32 Dim coordY As Int32 Dim s As String For i As Int32 = 0 To sudoku.numeroColumnasRegion - 1 For j As Int32 = 0 To sudoku.numeroFilasRegion - 1 Dim nested As New iTextSharp.text.pdf.PdfPTable(sudoku.numeroColumnasRegion) nested.DefaultCell.HorizontalAlignment = Element.ALIGN_CENTER nested.DefaultCell.VerticalAlignment = Element.ALIGN_MIDDLE nested.DefaultCell.MinimumHeight = 30 For n As Int32 = 0 To sudoku.numeroFilasRegion - 1 For m As Int32 = 0 To sudoku.numeroColumnasRegion - 1 coordX = i * sudoku.numeroFilasRegion + n coordY = j * sudoku.numeroColumnasRegion + m If problema(coordX)(coordY) = 0 Then s = " " Else s = problema(coordX)(coordY) End If 'nested.AddCell(s) nested.AddCell(New Phrase(New Chunk(s, font18))) Next m Next n bigtable.AddCell(nested) Next j Next i 'dim header as String.Format("seed: {0} rating level: {1}\rdifficulty: {2}\r", puzzle.seed, puzzle.ratingLevel+1, puzzle.actualRating) 'Paragraph p1= new Paragraph(new Chunk(header, font12)); 'p1.SetLeading(14,14); 'document.Add(p1); document.Add(New Paragraph(vbCr & vbCr & vbCr)) document.Add(bigtable) document.Add(New Paragraph(vbCr)) Else info = "No ha sido posible generar el sudoku." Dim p1 As New Paragraph(New Chunk(info, font12)) p1.SetLeading(14, 14) document.Add(p1) End If '// step 6: Close document document.Close() Catch ex As DocumentException Console.Error.WriteLine(ex.StackTrace) Console.Error.WriteLine(ex.Message) Filename = "--" End Try Return Filename End Function End Class End Namespace
¿Comentarios, sugerencias?: llopsite.at.yahoo.es | © 2005-07 Albert Lobo
Última actualización: 24-Feb-2007