Soduko Codigo Fuente VB

4
Option Explicit 'Este código intenta solucionar los problemas de 9x9 Su Doku.' 'C opyright (C) 2004 David Ireland', 'Este programa es software libre, puede redist ribuirlo y / o "modificado bajo los términos de la Licencia Pública General de GNU" publicada por la Free Software Foundation, versión 2 'de la Licencia, o (a su elec ción) cualquier versión posterior. "" Este programa se distribuye con la esperanza d e que sea útil, "pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de 'o IDON EIDAD PARA UN PROPÓSITO PARTICULAR. Ver la "GNU General Public License para más det alles." "Usted debería haber recibido una copia de la GNU General Public License" junto con este programa, si no, escriba a la Free Software 'Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, EE.UU.. <http://www.gnu.org/l icenses/> '"Contacto: David Ireland, DI Management Services Pty Ltd' <http://www .di-mgt.com.au> '<http://www. > di-mgt.com.au/contactmsg.php '<http://www.crypto sys.net> Const ncSIZE As Integer = 9 Const ncINDEXLEN As Integer = ncSIZE * ncSI ZE Tipo Valor udtSQUARE As Integer '0 = no establecido, de lo contrario valor 1 .. 9 Possibles ( ncSIZE ) As Integer '1 = 0 es posible, = no es posible GuessLev el As Integer '0 = firme, más nivel de adivinar 1,2,3, ... Teniendo en cuenta As B oolean True 'si se le da en el problema nRow As Integer 'Para la búsqueda rápida. E stablecidos por InitPuzzle nCol As Integer 'ídem NBox As Integer 'ídem End Type 'mat riz Almacenar en un array lineal, una basada en lo ignore (0). Públicas cuadrados ( ncSIZE * ncSIZE ) Como udtSQUARE "A nivel mundial en la que estamos adivinar ( 0 = empresa) privada mnGuessLevel As Integer 'Índices de conjeturas que ya hemos t ratado (esperemos que no demasiados) Const ncGUESSEDMAX As Integer = 12 'número ar bitrario privado adivinado ( ncGUESSEDMAX ) As Integer 'Dificultad Pública mnDiffi culty Como la Función Pública entero DoPuzzle () Dim BadIndex As Integer 'Crear la m atriz de llamadas InitPuzzle 'Leer los datos en la matriz BadIndex = ReadInput ( ) Si BadIndex <> 0 Entonces MsgBox "los datos de entrada no es válida. Problema co n (" y GetRow ( BadIndex ) y "", y GetCol ( BadIndex ) y ")" , vbCritical End Fu nction Si la salida de depuración . Imprimir "En el comienzo, valores perdidos =" y MissingValues ??() 'Intenta resolver sin una conjetura llamada TrySolve Si Mis singValues ??()> 0 Luego, "Ahora vamos a tener de adivinar, posiblemente de form a recursiva llamada TryGuess End If Si MissingValues ??() = 0 Entonces MsgBox "H emos encontrado una solución. nivel de dificultad = problema" y FillInResults mnDi fficulty más si vbOK = MsgBox ( "Lo siento, no podía resolver. ¿Quieres que el valores conocidos llenado? " , vbOKCancel ) Luego FillInResults End If End If End Funct ion Función Pública TryGuess () As Boolean 'Trate de adivinar. Función recursiva. Dim GuessIndex como Dim entero i As Integer Dim nValue As Integer Dim nMaxGuesses A s Integer Dim GuessPossibles ( ncSIZE ) As Integer Dim TrialIndex As Integer Try Guess = Falso mnDifficulty = mnDifficulty + 1 'Incrementa el nivel actual de adi vinar lo que puede dar marcha atrás si fuese necesario mnGuessLevel = mnGuessLevel + una depuración . Imprimir "adivinar NIVEL =" y mnGuessLevel "Todo lo que hacemo s a partir de ahora será provisional ..." Verificación del límite de lo que no duran para siempre Si mnGuessLevel > ncGUESSEDMAX Entonces MsgBox "Intenté adivinar dema siado!" , vbExclamation Final Exit Function Si 'Elija un cuadrado con las tarifa s más posibilidades # ??«con exclusión de cualquier conjeturas antes GuessIndex = Find MinPossibles () "Recuerden por lo que no vuelva a intentarlo adivinado ( mnGuess Level ) = GuessIndex nMaxGuesses = CountPossibles ( GuessIndex ) 'recordar los d etalles de esta plaza central para i = 1 Para ncSIZE GuessPossibles ( i ) = Cuad rados ( GuessIndex ). Possibles ( i ) A continuación de depuración . Imprimir "Adivi nar por cuadrados (" y GetRow ( GuessIndex ) y "", y GetCol ( GuessIndex ) y ")" depuración . nMaxGuesses de impresión y "valores posibles" 'Rellenar con la conjetu ra siguiente, el trabajo a través de todos los posibles para TrialIndex = 1 Para n MaxGuesses nValue = TheNthPossible ( GuessIndex , TrialIndex ) de depuración . Imp rimir "valor = Adivinar" y nValue Si nValue < = 0 Entonces MsgBox "Run de conjet uras" Final Exit Function Si la llamada escuadra ( nValue , GuessIndex ) Si TryS olve () A continuación, "Hemos terminado la salida para ventas de depuración . Impri mir "Supongo que fracasó". Llame UndoGuess ( mnGuessLevel ) de depuración . Imprimir "Después de UndoGuess: Los valores perdidos =" y MissingValues ??() End If Next d epuración . Imprimir ". END TryGuess valores perdidos =" y MissingValues ??() 'Si no estamos allí todavía, que pruebe con otro (recursiva) Supongo que en el siguiente nivel si MissingValues ??()> 0 Luego de llamadas TryGuess End If End Function F

description

programacion

Transcript of Soduko Codigo Fuente VB

Page 1: Soduko Codigo Fuente VB

Option Explicit 'Este código intenta solucionar los problemas de 9x9 Su Doku.' 'Copyright (C) 2004 David Ireland', 'Este programa es software libre, puede redistribuirlo y / o "modificado bajo los términos de la Licencia Pública General de GNU" publicada por la Free Software Foundation, versión 2 'de la Licencia, o (a su elección) cualquier versión posterior. "" Este programa se distribuye con la esperanza de que sea útil, "pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de 'o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Ver la "GNU General Public License para más detalles." "Usted debería haber recibido una copia de la GNU General Public License" junto con este programa, si no, escriba a la Free Software 'Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, EE.UU.. <http://www.gnu.org/licenses/> '"Contacto: David Ireland, DI Management Services Pty Ltd' <http://www.di-mgt.com.au> '<http://www. > di-mgt.com.au/contactmsg.php '<http://www.cryptosys.net> Const ncSIZE As Integer = 9 Const ncINDEXLEN As Integer = ncSIZE * ncSIZE Tipo Valor udtSQUARE As Integer '0 = no establecido, de lo contrario valor 1 .. 9 Possibles ( ncSIZE ) As Integer '1 = 0 es posible, = no es posible GuessLevel As Integer '0 = firme, más nivel de adivinar 1,2,3, ... Teniendo en cuenta As Boolean True 'si se le da en el problema nRow As Integer 'Para la búsqueda rápida. Establecidos por InitPuzzle nCol As Integer 'ídem NBox As Integer 'ídem End Type 'matriz Almacenar en un array lineal, una basada en lo ignore (0). Públicas cuadrados ( ncSIZE * ncSIZE ) Como udtSQUARE "A nivel mundial en la que estamos adivinar (0 = empresa) privada mnGuessLevel As Integer 'Índices de conjeturas que ya hemos tratado (esperemos que no demasiados) Const ncGUESSEDMAX As Integer = 12 'número arbitrario privado adivinado ( ncGUESSEDMAX ) As Integer 'Dificultad Pública mnDifficulty Como la Función Pública entero DoPuzzle () Dim BadIndex As Integer 'Crear la matriz de llamadas InitPuzzle 'Leer los datos en la matriz BadIndex = ReadInput () Si BadIndex <> 0 Entonces MsgBox "los datos de entrada no es válida. Problema con (" y GetRow ( BadIndex ) y "", y GetCol ( BadIndex ) y ")" , vbCritical End Function Si la salida de depuración . Imprimir "En el comienzo, valores perdidos =" y MissingValues ??() 'Intenta resolver sin una conjetura llamada TrySolve Si MissingValues ??()> 0 Luego, "Ahora vamos a tener de adivinar, posiblemente de forma recursiva llamada TryGuess End If Si MissingValues ??() = 0 Entonces MsgBox "Hemos encontrado una solución. nivel de dificultad = problema" y FillInResults mnDifficulty más si vbOK = MsgBox ( "Lo siento, no podía resolver. ¿Quieres que el valores conocidos llenado? " , vbOKCancel ) Luego FillInResults End If End If End Function Función Pública TryGuess () As Boolean 'Trate de adivinar. Función recursiva. Dim GuessIndex como Dim entero i As Integer Dim nValue As Integer Dim nMaxGuesses As Integer Dim GuessPossibles ( ncSIZE ) As Integer Dim TrialIndex As Integer TryGuess = Falso mnDifficulty = mnDifficulty + 1 'Incrementa el nivel actual de adivinar lo que puede dar marcha atrás si fuese necesario mnGuessLevel = mnGuessLevel + una depuración . Imprimir "adivinar NIVEL =" y mnGuessLevel "Todo lo que hacemos a partir de ahora será provisional ..." Verificación del límite de lo que no duran para siempre Si mnGuessLevel > ncGUESSEDMAX Entonces MsgBox "Intenté adivinar demasiado!" , vbExclamation Final Exit Function Si 'Elija un cuadrado con las tarifas más posibilidades # ??«con exclusión de cualquier conjeturas antes GuessIndex = FindMinPossibles () "Recuerden por lo que no vuelva a intentarlo adivinado ( mnGuessLevel ) = GuessIndex nMaxGuesses = CountPossibles ( GuessIndex ) 'recordar los detalles de esta plaza central para i = 1 Para ncSIZE GuessPossibles ( i ) = Cuadrados ( GuessIndex ). Possibles ( i ) A continuación de depuración . Imprimir "Adivinar por cuadrados (" y GetRow ( GuessIndex ) y "", y GetCol ( GuessIndex ) y ")" depuración . nMaxGuesses de impresión y "valores posibles" 'Rellenar con la conjetura siguiente, el trabajo a través de todos los posibles para TrialIndex = 1 Para nMaxGuesses nValue = TheNthPossible ( GuessIndex , TrialIndex ) de depuración . Imprimir "valor = Adivinar" y nValue Si nValue < = 0 Entonces MsgBox "Run de conjeturas" Final Exit Function Si la llamada escuadra ( nValue , GuessIndex ) Si TrySolve () A continuación, "Hemos terminado la salida para ventas de depuración . Imprimir "Supongo que fracasó". Llame UndoGuess ( mnGuessLevel ) de depuración . Imprimir "Después de UndoGuess: Los valores perdidos =" y MissingValues ??() End If Next depuración . Imprimir ". END TryGuess valores perdidos =" y MissingValues ??() 'Si no estamos allí todavía, que pruebe con otro (recursiva) Supongo que en el siguiente nivel si MissingValues ??()> 0 Luego de llamadas TryGuess End If End Function F

Page 2: Soduko Codigo Fuente VB

unción Pública UndoGuess ( ByVal ThisLevel As Integer ) 'Deshacer todas las conjeturas en este "nivel y rehacer todos los posibles, porque están equivocados Dim Índice Como Dim entero i As Integer Dim nOldLevel As Integer Para Indice = 1 Para ncINDEXLEN Si cuadrados ( Índice ). GuessLevel = ThisLevel Luego cuadrados ( Índice ). Valor = 0 End If Para i = 1 Para ncSIZE cuadrados ( Índice ). Possibles ( i ) = 1 Siguiente "Para restablecer todos los posibles, el uso escuadra para restablecer las plazas conocidas", pero supongo que cambiar temporalmente el nivel de cero, mientras lo hacemos nOldLevel = mnGuessLevel Si Siguiente mnGuessLevel = depuración nOldLevel . Imprimir "Supongo que a nivel de deshecho" y mnGuessLevel Función Pública fin TrySolve () As Boolean 'tratar de resolver con una respuesta definitiva' Devuelve True si resuelve Dim iRound como Dim entero hecho As Boolean Dim nPrevious As Integer mnDifficulty = mnDifficulty + 1 iRound = 0 nPrevious = 0 hacer = Falso Hacer hasta hace o nPrevious = MissingValues ??() "Recuerden el conteo previo para que podamos dejar de nPrevious = MissingValues ??() 'Este va primero puede resolver los problemas más simples absoluta Hacer mientras SetKnownValues ??( ) iRound = iRound + una depuración . Imprimir "Completado todo" y iRound y ". Los valores perdidos =" y MissingValues ??() bucle si MissingValues ??() = 0 Luego de depuración . Imprimir "Resuelto en Primera Go!" hace = salida verdadera acaban Si "Ahora esforzarse más mnDifficulty = mnDifficulty + 1 Hacer mientras TryEachBox () de depuración . Imprimir "Traté de cada caja. Los valores perdidos =" y MissingValues ??() Hacer mientras SetKnownValues ??() iRound = iRound + una depuración . Imprimir "Completado todo" y iRound y ". Valores perdidos =" y MissingValues ??() Loop Si MissingValues ??() = 0 Luego hacer = salida verdadera Do End If Do Mientras TryEachRow () de depuración . Imprimir "Traté de cada fila. Los valores perdidos =" y MissingValues ??() No Si SetKnownValues ??() iRound = iRound + una depuración . Imprimir "Completado todo" y iRound y ". Los valores perdidos =" y MissingValues ??() Loop Si MissingValues ??() = 0 Luego hacer = salida verdadera Do End If Do Mientras TryEachCol () Depuración . Imprimir "Traté de cada col. Los valores perdidos =" y MissingValues ??() Hacer mientras SetKnownValues ??() iRound = iRound + una depuración . Imprimir "Completado todo" y iRound y ". Valores perdidos =" y MissingValues ??() Loop Si MissingValues ??( ) = 0 Luego hacer = salida verdadera Do End If bucle "Hasta hace TrySolve = ( MissingValues ??() = 0 ) End Function Función Pública AlreadyGuessed ( ThisIndex As Integer ) As Boolean 'Devuelve True si ya hemos adivinado el valor de este índice "a un nivel inferior (es decir, mnGuessLevel ya se ha incrementado) Dim i As Integer Para i = 1 Para mnGuessLevel - 1 Si adivinado ( i ) = ThisIndex Luego AlreadyGuessed = true Para Salir End If Next End Function Función Pública FindMinPossibles () As Integer "más bajo índice de devoluciones a una plaza sin resolver por el n º posibilidades" con exclusión de cualquier conjeturas antes en los niveles inferiores Dim Indice As Integer Dim nMin As Integer Dim nMinIndex As Integer nMin = ncSIZE + 1 Por Índice = 1 Para ncINDEXLEN Si cuadrados ( Índice ). Valor = 0 Y CountPossibles ( Índice ) < nMin Entonces Si no AlreadyGuessed ( Índice ) Luego nMin = CountPossibles ( Índice ) nMinIndex = Índice End If End If Next FindMinPossibles = nMinIndex End Function Función Pública TryEachBox () As Boolean 'Trate a todos los candidatos de cada caja, hasta que nos encontramos con algo nuevo: "Si encontramos una nueva, detener, ajustar el valor y el retorno True 'Si no hay suerte, devuelva False Dim iBox As Integer Dim iValue As Integer Dim n As Integer Dim nFoundAt As Integer TryEachBox = False para iBox = 1 A ncSIZE Para iValue = 1 Para ncSIZE n = PossiblesInBox ( iValue , iBox , nFoundAt ) Si n = 1 A continuación, "Marque esta no está configurado Si cuadrados ( nFoundAt ). Valor = 0 A continuación, "¡Hurra! Hemos resuelto esta plaza llamada escuadra ( iValue , nFoundAt ) "No vayamos más lejos ahora TryEachBox = True End If End Exit Function Si Siguiente End Function Public Function TryEachRow () As Boolean 'Trate a todos los candidatos para cada fila hasta que encontremos algo nueva 'Si encontramos una nueva, detener, ajustar el valor y el retorno True' Si no hay suerte, devuelva False Dim IRow As Integer Dim iValue As Integer Dim n As Integer Dim nFoundAt As Integer TryEachRow = False para IRow = 1 Para ncSIZE Para iValue = 1 Para ncSIZE n = PossiblesInRow ( iValue , IRow , nFoundAt ) Si n = 1 A continuación, "Marque esta no está configurado Si cuadrados ( nFoundAt ). Valor = 0 A continuación, "¡Hurra! Hemos resuelto esta plaza llamada escuadra ( iValue , nFoundAt ) "No vayamos más lejos ahora TryEachRow = True End If End Exit Function S

Page 3: Soduko Codigo Fuente VB

i Siguiente End Function Public Function TryEachCol () As Boolean 'Trate a todos los candidatos para cada columna hasta que encontremos algo nueva 'Si encontramos una nueva, detener, ajustar el valor y el retorno True' Si no hay suerte, devuelva False Dim iCol As Integer Dim iValue As Integer Dim n As Integer Dim nFoundAt As Integer TryEachCol = False para iCol = 1 Para ncSIZE Para iValue = 1 Para ncSIZE n = PossiblesInCol ( iValue , iCol , nFoundAt ) Si n = 1 A continuación, "Marque esta no está configurado Si cuadrados ( nFoundAt ). Valor = 0 A continuación, "¡Hurra! Hemos resuelto esta plaza llamada escuadra ( iValue , nFoundAt ) "No vayamos más lejos ahora TryEachCol = True End Exit Function End If Next Si Final de la Función Pública Función PossiblesInBox ( ThisValue As Integer , NBox As Integer , ByRef FoundAt As Integer ) ' Devoluciones no de los posibles para este valor en esta "caja y se pone FoundAt a ser el índice, donde la última vez que encontró una posible este valor Dim Indice As Integer Dim n como > 0 entonces n = n + 1 FoundAt = Índice End If End If Next PossiblesInBox = n End Function Función Pública PossiblesInRow ( ThisValue As Integer , nRow As Integer , ByRef FoundAt As Integer ) 'Devuelve no de los posibles para este valor en esta línea " y establece FoundAt a ser el índice, donde la última vez que encontró una posible este valor Dim Indice As Integer Dim n como > 0 entonces n = n + 1 FoundAt = Índice End If End If Next PossiblesInRow = n End Function Public Function PossiblesInCol ( ThisValue As Integer , nCol As Integer , ByRef FoundAt As Integer ) 'Devuelve no de los posibles para este valor en este col' y establece FoundAt a ser el índice, donde la última vez que encontró una posible este valor Dim Indice As Integer Dim n como > 0 entonces n = n + 1 FoundAt = Índice End If End If Next PossiblesInCol = n End Function Public Function MissingValues ??() As Integer no el número "Devoluciones de escuadras. Si es cero, tenemos una solución completa. Dim Indice As Integer Dim n As Integer n = 0 Para Indice = 1 Para ncINDEXLEN Si cuadrados ( Índice ). Valor = 0 Luego, n = n + 1 End If Next MissingValues ??= n End Function Función Pública SetKnownValues ??() As Boolean 'Comprueba si simple eliminación de los posibles nos da ninguna solución' Devuelve True si se hace un cambio o falso si no hay cambios en este paso Dim Indice As Integer Dim iValue As Integer Dim bChanged As Boolean bChanged = False Índice = 1 Para ncINDEXLEN Si CountPossibles ( Índice ) = 1 Y cuadrados ( Índice ). Valor = 0 A continuación, 'encontrado otra respuesta iValue = ThePossible ( índice ) de depuración . Imprimir "Se ha encontrado de valor (" y GetRow ( índice ) y "", y GetCol ( Índice de ) y ") =" y iValue 'Establecer el valor (y eliminar los posibles más) Llame a escuadra ( iValue , Índice ) bChanged = True End If Next depuración . Imprimir "SetKnownValues:" y SiInm ( bChanged , "encontrado más ..." , "NO HAY CAMBIOS esta ronda" ) SetKnownValues ??= bChanged End Function Public Function CountPossibles ( Índice de As Integer ) As Integer 'Número no de los valores que son posibles para esta plaza: "Si, tenemos la" solución Si es cero, tenemos un error Dim i As Integer Dim n As Integer n = 0 para i = 1 Para ncSIZE n = n + cuadrados ( Índice ). Possibles ( i ) Siguiente CountPossibles = n End Function Función Pública ThePossible ( Índice de As Integer ) As Integer 'Se supone sólo un posible valor Dim i As Integer Para i = 1 Para ncSIZE Si cuadrados ( Índice ). Possibles ( i ) = 1 Entonces ThePossible = i Exit For End If Next End Función Pública Función TheNthPossible ( Índice de As Integer , n_th As Integer ) As Integer ' encuentra el valor n posible para esta plaza (base 1) Dim i As Integer Dim nValue As Integer Dim n As Integer n = n_th Para i = 1 Para ncSIZE Si cuadrados ( Índice ). Possibles ( i ) = 1 entonces n = n - 1 Si n = 0 Luego nValue = i Exit For End If End If Next TheNthPossible = nValue End Function Función Pública IsDataOK () As Integer 'Devuelve cero si los datos son correctos, el índice más del primer error Dim Indice As Integer IsDataOK = 0 ' inocente hasta que se demuestre < = 0 Luego IsDataOK = Índice de Exit For End If Next End Function Public Function escuadra ( iValue As Integer , ThisIndex As Integer ) As Boolean 'Establecer el valor plaza y eliminar todos los posibles en la misma fila, columna y caja de Dim i As Integer cuadrados ( ThisIndex ). Valor = iValue = 0 End If Si cuadrados ( i ). nCol = Cuadrados ( ThisIndex ). nCol Luego cuadrados ( i ). Possibles ( iValue ) = 0 End If Si cuadrados ( i ). NBox = Cuadrados ( ThisIndex ). NBox Luego cuadrados ( i ). Possibles ( iValue ) = 0 End If Next 'y asegúrese de Possibles esta plaza se han establecido correctamente para i = 1 Para ncSIZE cuadrados ( ThisIndex ). Possibles ( i ) = 0 Siguiente cuadrados ( ThisIndex ). Possibles ( iValue ) = 1 escuadra = True End Fu

Page 4: Soduko Codigo Fuente VB

nción Pública Función SetSquareRC ( iValue As Integer , IRow As Integer , iCol As Integer , opcional IsGiven As Boolean ) As Boolean Valor de ajuste cuadrado "dado (fila, columna). Opcionalmente, establecer la etiqueta dada. Dim Indice As Integer Índice = getIndex ( IRow , iCol ) Cuadrados ( Índice ). Teniendo en cuenta = IsGiven SetSquareRC = escuadra ( iValue , Índice ) End Function Public Function FillInResults () Dim rng Como Range Dim IRow As Integer , iCol As Integer Dim iValue As Integer Dim índice como conjunto entero rng = Range ( "Rompecabezas" ) Para IRow = 1 Para ncSIZE Para iCol = 1 Para ncSIZE Índice = getIndex ( IRow , iCol ) Si cuadrados ( Índice ). Teniendo en cuenta entonces 'Just formato para mostrar que era un hecho generador de números aleatorios ( IRow , iCol ). Interior . ColorIndex = 6 rng ( IRow , iCol ). Fuente . Negrita = verdadero cuadrados ElseIf ( Índice ). Valor > 0 Luego encontrado una solución rng ( IRow , iCol ). Valor = Cuadrados ( Índice ). rng Valor ( IRow , iCol ). Interior . ColorIndex = xlNone rng ( IRow , iCol ). Fuente . Negrita = False End If Next Next End Función Pública ClearGrid () Dim rng Como Range Dim IRow As Integer , iCol As Integer Dim iValue como Dim entero índice como conjunto entero rng = Range ( "Rompecabezas" ) Para IRow = 1 Para ncSIZE Para iCol = 1 Para ncSIZE Índice = getIndex ( IRow , iCol ) rng ( IRow , iCol ) . Valor = "" rng ( IRow , iCol ). Interior . ColorIndex = xlNone rng ( IRow , iCol ). Fuente . Negrita = Falso Siguiente End Function Public Function ReadInput () As Integer 0 "si el índice más bien de la plaza con el problema Dim rng Como Range Dim wkb Como libro Dim IRow As Integer , iCol As Integer Dim iValue As Integer Set wkb = ActiveWorkbook Set rng = Range ( "Rompecabezas" ) Para IRow = 1 Para ncSIZE Para iCol = 1 Para ncSIZE iValue = Val ( rng . artículo ( IRow , iCol )) Si iValue > 0 Luego, "tienda le da un valor en la matriz Si no SetSquareRC ( iValue , IRow , iCol , cierto ) Entonces MsgBox "entrada no válida en (" y IRow y "," y iCol y ") " Final Exit Function End If Si Siguiente ReadInput = IsDataOK () End Function Función Pública InitPuzzle () 'Inicializar las Plazas de la matriz Dim IRow As Integer , iCol As Integer Dim Índice Como Dim entero i As Integer 'init todos los valores por Índice = 1 Para ncINDEXLEN cuadrados ( Índice ). Teniendo en cuenta = Falso cuadrados ( Índice ). GuessLevel = 0 Cuadrados ( Índice ). Valor = 0 Siguiente Para i = 1 Para ncGUESSEDMAX adivinado ( i ) = 0 Siguiente 'Set todos los posibles para un para índice = 1 Para ncINDEXLEN Para i = 1 Para ncSIZE cuadrados ( Índice ). Possibles ( i ) = 1 Siguiente 'Ajuste el nivel de adivinar mundial mnGuessLevel = 0 mnDifficulty = 0 'Inicializar el número de fila, columna y la caja "para agilizar las búsquedas" (Estos se podría hacer con las constantes, pero esto es más fácil) 'fila almacenados columna x, base-1 Para iCol = 1 a 9 para IRow = 1 a 9 Índice = getIndex ( IRow , iCol ) Cuadrados ( Índice ). nRow = IRow cuadrados ( Índice ). nCol = iCol Siguiente 'números Set caja 1 .. 9' (hay sin duda un algoritmo sencillo, pero esta Función Pública getIndex ( IRow As Integer , iCol As Integer ) As Integer dado "valor de retorno (IRow, iCol) del índice (1 .. 81) getIndex = ( IRow - 1 ) * ncSIZE + iCol End Function Public Function GetRow ( iIndex As Integer ) As Integer GetRow = (( iIndex - 1 ) \ ncSIZE ) + 1 End Function Public Function GetCol ( iIndex As Integer ) As Integer GetCol = (( iIndex - 1 ) Mod ncSIZE ) + 1 End Function Public Function GetBox ( iIndex As Integer ) As Integer Dim nRow As Integer , nCol como Dim entero nBand como Dim entero nStack As Integer nRow = GetRow ( iIndex ) nCol = GetCol ( iIndex ) nBand = ( nRow - 1 ) \ 3 + 1 nStack = ( nCol - 1 ) \ 3 + 1 GetBox = ( nBand - 1 ) * 3 + nStack End Function Función Pública InThisRow ( TheValue As Integer , TheIndex As Integer ) As Boolean Dim Índice Como Dim entero nRow como Por End If End If Next End Function Public Function InThisCol ( TheValue As Integer , TheIndex As Integer ) Dim como Boolean Índice Como Dim entero nCol como Por End If End If Next End Function Public Function InThisBox ( TheValue As Integer , TheIndex As Integer ) Dim como Boolean Índice Como Dim entero NBox como Por End If End If Next End Function Sub Button1_Click () DoPuzzle End Sub Sub Button3_Click () ClearGrid End Sub