Ir para conteúdo
Fórum Script Brasil
  • 0

Loop Infinito


Darknnez

Pergunta

E aí.

Eu estou fazendo um programa no VB6, e num determinado momento, numa parte específica do código, começou a dar loop infinito.

Eu fiz de tudo, mas não consegui descobrir o motivo.

Se puderem me dar uma força, aí está o código:

No Form_Load:


Dim número As Integer
Dim quantidade As Integer
Dim lugar As Integer

quantidade = Int(6 * Rnd) + 25

Regra
Regra2

Randomize
While quantidade > 0
lugar = Int(80 * Rnd)
For z = 1 To 9
For y = 1 To 9
If casa(lugar) = Me.Controls("C" & z & "L" & y).Name Then
If Me.Controls("C" & z & "L" & y).Enabled = True Then
número = Int(9 * Rnd) + 1
Me.Controls("C" & z & "L" & y).Text = número
Regra
If erro1 = False Then
Regra2
If erro2 = False Then
Me.Controls("C" & z & "L" & y).Enabled = False
quantidade = quantidade - 1
Else
Me.Controls("C" & z & "L" & y).Text = ""
End If
Else
Me.Controls("C" & z & "L" & y).Text = ""
End If
End If
End If
Next
Next
Wend
[/codebox]

Regra()

[codebox]
Public Sub Regra()
For c = 1 To 9
For l = 1 To 9
For c2 = 1 To 9
For l2 = 1 To 9
If Me.Controls("C" & c & "L" & l).Name <> Me.Controls("C" & c2 & "L" & l2).Name Then
If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c2 & "L" & l2).Text Then
erro1 = True
Exit Sub
End If
End If
Next
Next
Next
Next
End Sub

Regra2()


Public Sub Regra2()
Dim q1 As Integer
Dim q2 As Integer
Dim x As Integer

Posição

For q1 = 0 To 8
For q2 = 0 To 8
For c = 1 To 9
For l = 1 To 9
If quadrante(q1, q2) = Me.Controls("C" & c & "L" & l).Name Then
For x = 0 To 8
If quadrante(q1, q2) <> quadrante(q1, x) Then
For c2 = 1 To 9
For l2 = 1 To 9
If quadrante(q1, x) = Me.Controls("C" & c2 & "L" & l2).Name Then
If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c2 & "L" & l2).Text Then
erro2 = True
Exit Sub
End If
End If
Next
Next
End If
Next
End If
Next
Next
Next
Next
End Sub
[/codebox]

Se for necessário, eu mando o projeto completo por MP.

Valeu. =)

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

meu deus quanto for.

Eu estou fazendo um programa no VB6, e num determinado momento, numa parte específica do código, começou a dar loop infinito.

você sabe q parte é essa??

tava olhando aqui, sera q não é no while?? você tem certeza q a quantidade vai baixar pra menor q 0??

Se for necessário, eu mando o projeto completo por MP.

Valeu. =)

se quiser manda la.

Link para o comentário
Compartilhar em outros sites

  • 0
meu deus quanto for.

rs. Não sei fazer melhor.

Se tiver alguma dica...

você sabe q parte é essa??
Eu não sei exatamente que parte. Fico na dúvida se está no Form_Load, no Regra ou no Regra2.

Se ajuda, quando eu aperto 'Ctrl + Break' para parar o loop, sempre fica marcada à linha do último End If no Form_Load

tava olhando aqui, sera q não é no while?? você tem certeza q a quantidade vai baixar pra menor q 0??

Bem, eu imagino que a quantidade chegue à 0 em algum momento, condição suficiente para terminar o While, não?

se quiser manda la.

Vou mandar então.

Valeu kuroi, firme como sempre. rs :)

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0

heheh legal, precisa de mta coragem pra fazer um sudoku.

meu deus quanto for.

rs. Não sei fazer melhor.

Se tiver alguma dica...

hum não sei se tem um jeito muito melhor, acho q você ta bem perto do jeito mais rapido. fazer de outras formas, a não ser q você estudasse vinte anos, e fizesse uma tese de mestrado e, baseado em calculos matematicos complexos, você desenvolvesse uma formula melhor.

vo tentar te dar uma dicas aqui...

primeiro, ponha o Randomize sempre antes de chamar qualquer Rnd(). veja q você esta calculando a quantidade antes do Randomize.

e só pra comentar outro modo de contar o tempo, não precisaria de variaveis pra hora, minuto e segundo, você poderia por uma variavel pra segundos e ir somando só nela. ai você teria a qtde de segundos e poderia mostrar em formato de hora com essa funcao aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=108910

acho q seria mais simples, mas do jeito q você fez tb ta legal, e acho q não vai ter tanta diferenca de performance, e não acho q você tenha necessidade de mudar, mas da forma como eu passei facilitaria se você precissasse fazer operacoes. exemplo, somar o tempo do primeiro jogo com o do segundo.

ou alias, acho q você usou isso ai no jogo da formula 1 não??

agora uma coisa q deixaria mais "correto" as subs das regras, seria usar funcions e não sub. ai não precisaria das variaveis de erro. ai você declarava assim:

Public Function Regra() As Boolean
na primeira linha, você adicionaria:
Regra = False
e ai você trocaria erro1 = True por Regra = True ai na hora de testar la em cima, você faria, em vez de:
Regra
If erro1 = False Then[/code] simplesmente:
[code]If Regra = False Then
ou
If Not Regra Then
agora uma dica bem importante, seria na hora de comparar aqui:
If Me.Controls("C" & c & "L" & l).Name <> Me.Controls("C" & c2 & "L" & l2).Name Then
    If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c2 & "L" & l2).Text Then[/code] você ve q de cada 9^4 (9 elevado a 4) comparacoes na primeira linha, só uma retornaria False, certo?? então não seria perda de tempo faze-la ai se praticamente todas as vezes ele entrara dentro do if?? assim ele faz muito mais comparacoes e demora muito mais tempo. você poderia por o if de cima DENTRO do if de baixo, já q o if de baixo só retornara True quando os numeros baterem. ai se os numeros baterem ai sim você testa se não é o mesmo textbox. mais uma coisa, é q você tb ta fazendo dois Fors desnecessario dentro do while, principal. se você já sabe o nome do textbox do lugar (dentro do array casa), então você não precisa procurar ele. você poderia acessar normalmente pelo conteudo do array casa. exemplo, em vez de:
[code]If Me.Controls("C" & z & "L" & y).Enabled = True Then
você faria
If Me.Controls(casa(lugar)).Enabled = True Then
bom, quanto ao problema, ta tarde aqui e meu racicionio ta ruim, mas pelo q parece o problema esta na sub Regra1(). pelo q parece você esta comparando todas os quadradinhos com todos os quadradinhos, certo?? mas o numero não pode se repetir apenas na mesma linha e na mesma coluna. pelo q você fez, se um numero aparecesse em C1L1 e depois em C4L4, ele retornaria como errado apesar de estar correto, não?? por isso é q a quantidade não diminui. você deveria criar mais uma sub Regra(). ai seria uma sub pra comparar linha, uma pra comparar coluna e outra pra comparar o quadrante grandao (q, fiquei com preguica de olhar, mas parece q é o q é feito pelo Regra2(), não??). ou você poderia comparar linha e coluna na propria sub Regra(), mas em Fors separados. e tb tava pensando aqui... essa sub Regra() como você fez compararia todos os quadradinhos com todos os quadradinhos não?? não seria mais simples comparar apenas o q você esta alterando no momento?? ai você passaria por parametro. tipo assim:
Public Sub Regra(q As string) As Boolean
    For c = 1 To 9
        For l = 1 To 9
            If Me.Controls("C" & c & "L" & l).Text = Me.Controls(q).Text Then
                If "C" & c & "L" & l <> q Then
                    erro1 = True
                    Exit Sub
                End If
            End If
        Next
    Next
End Sub[/code] ai só precisaria adapatar pra calcular por linha e por coluna separadamente. ai você chamaria tipo assim:
[code]If Not Regra("C" & z & "L" & y) Then
ou acho q assim funcionaria:
If Not Regra(casa(lugar)) Then

a acho q o problema era na sub Regra mesmo, mas não conferi a Regra2, tem mta coisa la, se continuar com problema a gente olha, mas você tb pode aproveitar as dicas q te dei pra diminuir o tamanho dela. veja se resolve ai, qualquer coisa poste de novo.

Link para o comentário
Compartilhar em outros sites

  • 0
hum não sei se tem um jeito muito melhor, acho q você ta bem perto do jeito mais rapido. fazer de outras formas, a não ser q você estudasse vinte anos, e fizesse uma tese de mestrado e, baseado em calculos matematicos complexos, você desenvolvesse uma formula melhor.

só pra comentar... tava pensando aqui... uma outra forma de fazer seria você preencher todos os quadrados (de forma correta, logico) e depois só "apagar" os quadrados q o cara deve preencher. assim, você já teria a resposta desde o inicio (assim seria mais facil de testar se ele acertou) e, acho q é mais ou menos assim q são feitos os jogos de sudoku por ai.

só q ai precisaria pensar em uma logica, sem ter q fazer a comparacao do tabuleiro todo. existiria uma logica, tipo você preenche a primeira linha com 1-2-3-4-5-6-7-8-9 ai você já sabe q, na duas linhas de baixo, 1-2-3 tem q aparecer do quarto quadrado pra frente.

acho q o esquema seria você fazer as matrizes pra cada numero. assim q você preenche uma casa com ele, você marca quais as casas q ele não pode aparecer. ai quando você for colocar o numero de novo, você poe numa casa q não esteja marcada.

so q ai tem q pensar bastante, talvez de mais trabalho do q o modo como você esta fazendo, mas teria uma performance melhor.

mas do jeito q você fez tb esta legal, só precisaria tirar redundancias e deixar a execucao do codigo o mais agil possivel.

Link para o comentário
Compartilhar em outros sites

  • 0
heheh legal, precisa de mta coragem pra fazer um sudoku.
Será? Não parece tão difícil assim.

hum não sei se tem um jeito muito melhor, acho q você ta bem perto do jeito mais rapido. fazer de outras formas, a não ser q você estudasse vinte anos, e fizesse uma tese de mestrado e, baseado em calculos matematicos complexos, você desenvolvesse uma formula melhor.

huahahaha

Deixa quieto então.

primeiro, ponha o Randomize sempre antes de chamar qualquer Rnd(). veja q você esta calculando a quantidade antes do Randomize.
É verdade, não tinha percebido.

e só pra comentar outro modo de contar o tempo, não precisaria de variaveis pra hora, minuto e segundo, você poderia por uma variavel pra segundos e ir somando só nela. ai você teria a qtde de segundos e poderia mostrar em formato de hora com essa funcao aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=108910

acho q seria mais simples, mas do jeito q você fez tb ta legal, e acho q não vai ter tanta diferenca de performance, e não acho q você tenha necessidade de mudar, mas da forma como eu passei facilitaria se você precissasse fazer operacoes. exemplo, somar o tempo do primeiro jogo com o do segundo.

ou alias, acho q você usou isso ai no jogo da formula 1 não??

Eu usei isso no jogo de F1 mesmo, é verdade.

Mas não estou tão preocupado com isso agora, não é tão importante.

agora uma coisa q deixaria mais "correto" as subs das regras, seria usar funcions e não sub. ai não precisaria das variaveis de erro. ai você declarava assim:

Public Function Regra() As Boolean
na primeira linha, você adicionaria:
Regra = False
e ai você trocaria erro1 = True por Regra = True ai na hora de testar la em cima, você faria, em vez de:
Regra
If erro1 = False Then
simplesmente:
If Regra = False Then
ou
If Not Regra Then
Hmm, certo. Mudei isso lá Só uma dúvida, eu não preciso chamar a function Regra duas vezes então né? Não precisa fazer:
Regra
If Regra = False Then
agora uma dica bem importante, seria na hora de comparar aqui:
If Me.Controls("C" & c & "L" & l).Name <> Me.Controls("C" & c2 & "L" & l2).Name Then
    If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c2 & "L" & l2).Text Then

você ve q de cada 9^4 (9 elevado a 4) comparacoes na primeira linha, só uma retornaria False, certo?? então não seria perda de tempo faze-la ai se praticamente todas as vezes ele entrara dentro do if?? assim ele faz muito mais comparacoes e demora muito mais tempo. você poderia por o if de cima DENTRO do if de baixo, já q o if de baixo só retornara True quando os numeros baterem. ai se os numeros baterem ai sim você testa se não é o mesmo textbox.

Hmm, entendi, valeu.

Bem, eu to no meio da aula (huahaha) e tenho que ir pro laboratório correndo.

Depois eu comento o resto, mas só queria dizer que eu adotei as suas dicas, mas continua dando loop infinito.

Até mais, e valeu!

Link para o comentário
Compartilhar em outros sites

  • 0
Só uma dúvida, eu não preciso chamar a function Regra duas vezes então né?

Não precisa fazer:

Regra
If Regra = False Then[/code]

não precisa não. você pondo ela na expressao do if, ela é executada e já retorna o valor.

Depois eu comento o resto, mas só queria dizer que eu adotei as suas dicas, mas continua dando loop infinito.

hum, talvez esteja no regra2... mas olhei ela e não entendi nd...

mas tipo da pra simplifica-la, e fazer como eu disse sobre o regra1, passar o quadradinho q você esta preenchendo como parametro e pesquisar só os do quadradao a q ele pertence. não precisa comparar todos com todos.

bom, mas vo esperar os comentarios então, depois a gente ve.

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, voltando...

Tipo, realmente a function Regra tava errada.

Eu não tinha a intenção de comparar todos os quadradinhos com todos os quadradinhos.

Agora eu já corrigi, e fiz a function Regra para comparar apenas coluna por coluna, a function Regra2 para comparar linha por linha, e passei o conteúdo da antiga Regra2 para uma nova function Regra3 (deu pra entender?). E corrigi também os dois For desnecessário dentro do While.

Ficou assim:

While:


While quantidade > 0
lugar = Int(80 * Rnd)
If Me.Controls(casa(lugar)).Enabled = True Then
número = Int(9 * Rnd) + 1
Me.Controls(casa(lugar)).Text = número
If Regra = False Then
If Regra2 = False Then
If Regra3 = False Then
Me.Controls(casa(lugar)).Enabled = False
quantidade = quantidade - 1
Else
Me.Controls(casa(lugar)).Text = ""
End If
Else
Me.Controls(casa(lugar)).Text = ""
End If
Else
Me.Controls(casa(lugar)).Text = ""
End If
End If
Wend
[/codebox]

Regra:

[codebox]
Public Function Regra() As Boolean
Regra = False
For c = 1 To 9
For l = 1 To 9
For l2 = 1 To 9
If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c & "L" & l2).Text Then
If Me.Controls("C" & c & "L" & l).Name <> Me.Controls("C" & c & "L" & l2).Name Then
Regra = True
Exit Function
End If
End If
Next
Next
Next
End Function

Regra2:


Public Function Regra2() As Boolean
Regra2 = False
For l = 1 To 9
For c = 1 To 9
For c2 = 1 To 9
If Me.Controls("C" & c & "L" & l).Text = Me.Controls("C" & c2 & "L" & l).Text Then
If Me.Controls("C" & c & "L" & l).Name <> Me.Controls("C" & c2 & "L" & l).Name Then
Regra2 = True
Exit Function
End If
End If
Next
Next
Next
End Function
[/codebox]

Acho que tá certo.

Quanto ao Regra3 (antiga Regra2)...

e tb tava pensando aqui... essa sub Regra() como você fez compararia todos os quadradinhos com todos os quadradinhos não?? não seria mais simples comparar apenas o q você esta alterando no momento??

ai você passaria por parametro.

Pois é, eu não tive tempo de comentar antes, mas essa foi a única parte que eu não entendi muito bem.

Como eu vou aplicar isso dentro do While?

Mas de qualquer maneira, eu não sei se comparar apenas o "quadrado" que está sendo alterado daria certo, por que é preciso conferir todas as regras novamente assim que o jogador terminar o jogo.

Enfim, eu acho que dá pra simplificar essa parte do código, seguindo a dica que você me deu para evitar os dois For desnecessários no While.

Aí ficaria assim:

[codebox]
Public Function Regra3() As Boolean
Regra3 = False
Dim q1 As Integer
Dim q2 As Integer
Dim x As Integer

Posição

For q1 = 0 To 8
For q2 = 0 To 8
If quadrante(q1, q2) = Me.Controls(quadrante(q1, q2)).Name Then
For x = 0 To 8
If quadrante(q1, q2) <> quadrante(q1, x) Then
If quadrante(q1, x) = Me.Controls(quadrante(q1, x)).Name Then
If Me.Controls(quadrante(q1, q2)).Text = Me.Controls(quadrante(q1, x)).Text Then
Regra3 = True
Exit Function
End If
End If
End If
Next
End If
Next
Next
End Function

só pra comentar... tava pensando aqui... uma outra forma de fazer seria você preencher todos os quadrados (de forma correta, logico) e depois só "apagar" os quadrados q o cara deve preencher. assim, você já teria a resposta desde o inicio (assim seria mais facil de testar se ele acertou) e, acho q é mais ou menos assim q são feitos os jogos de sudoku por ai.

só q ai precisaria pensar em uma logica, sem ter q fazer a comparacao do tabuleiro todo. existiria uma logica, tipo você preenche a primeira linha com 1-2-3-4-5-6-7-8-9 ai você já sabe q, na duas linhas de baixo, 1-2-3 tem q aparecer do quarto quadrado pra frente.

acho q o esquema seria você fazer as matrizes pra cada numero. assim q você preenche uma casa com ele, você marca quais as casas q ele não pode aparecer. ai quando você for colocar o numero de novo, você poe numa casa q não esteja marcada.

so q ai tem q pensar bastante, talvez de mais trabalho do q o modo como você esta fazendo, mas teria uma performance melhor.

Realmente, essa seria a forma mais correta.

Do jeito que eu estou fazendo, não dá sequer para ter certeza se é possível terminar o jogo.

Mas foi por isso que eu mandei preencher de 25 à 30 quadradinhos no início do jogo, para torná-lo fácil.

Por enquanto eu estou preocupado apenas em fazer o jogo funcionar.

Se eu conseguir descobrir o motivo do loop infinito, o jogo já fica praticamente pronto.

Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui descobrir o motivo do loop infinito.

O problema é que, como eu mandava preencher o quadradinho com o número aleatório e depois conferir as regras, quando dava Regra = True, eu mandava preencher o quadradinho com "" (vazio). Aí quando eu mandava conferir as regras depois, se achasse dois quadradinhos com "" na mesma linha ou na mesma coluna ou no mesmo quadrante, aí dava Regra = True pra sempre, e por isso a variável quantidade nunca chegava à 0. rs

Mas agora tá resolvido, e quase pronto.

Valeu!

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0
Mas de qualquer maneira, eu não sei se comparar apenas o "quadrado" que está sendo alterado daria certo, por que é preciso conferir todas as regras novamente assim que o jogador terminar o jogo.

é verdade, mas achei q você fosse usar essas subs so pra montar o jogo. achei q pra conferir a vitoria você ainda ia fazer.

Mas agora tá resolvido, e quase pronto.

legal, beleza então, qualquer coisa posta.

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é....

É mais difícil do que eu imaginava. huahahaha

Eu achava que só conferindo as linhas, as colunas e os quadrantes, não tinha como dar erro.

Mas tem sim, olha só:

errosudokuig0.png

Eu rodei um jogo, e os números saíram mais ou menos igual acima. (fora os outros números que eu tirei)

Quando o jogo foi criado, não saiu nada errado de acordo com as regras.

Mas na ora de jogar, note que não tinha lugar pra colocar o número 1 no último quadrante da direita.

E eu não tenho nem idéia de como corrigir isso.

Eu pensei em fazer como você falou, gerando todos os números primeiro e só depois apagar os que devem ser preenchidos.

Mas se acontecer um caso semelhante ao da imagem acima, daria loop infinito. =/

Link para o comentário
Compartilhar em outros sites

  • 0

hahahah foi por isso q eu disse:

heheh legal, precisa de mta coragem pra fazer um sudoku.

é esse pego nos dois... eu tb tava achando q do jeito q você tava fazendo não teria erro...

E eu não tenho nem idéia de como corrigir isso.

Eu pensei em fazer como você falou, gerando todos os números primeiro e só depois apagar os que devem ser preenchidos.

Mas se acontecer um caso semelhante ao da imagem acima, daria loop infinito. =/

hum, ficou complicado mesmo. ai tem q pensar bastante. mas tipo, o q você tem q fazer tb então é, na hora de colocar o numero, testar os lugares onde ele pode aparecer. ai você vai ter q fazer uns testes maiores ainda. do tipo, a cada numero q você for incluir, você tem q ver se tera espaco pra ele mesmo nas demais posicoes e se ele não atrapalha nenhum outro...

heheheh por isso nunca tive coragem de fazer um sudoku... mas to pensando umas coisas aqui, se tiver alguma ideia eu falo. mas tipo tem uma logica q a gente deveria seguir q não estamos achando.

Link para o comentário
Compartilhar em outros sites

  • 0

opa opa opa tem um jeito q vai dar certo sempre, a gente q não tinha visto.

bom sei la, não signfica q não tem solucao pelo jeito q você faz, nem q você tenha q fazer obrigatoriamente como vou falar. e tb não significa q vai ser facil.

bom e tb de repente talvez eu te dar a ideia estrague sua diversao, porque talvez seja uma coisa q você queira fazer com seu proprio esforco. logico q o esforco todo vai ser seu, pois a ideia é mais facil, o dificil é por em pratica. mas vou por ate escondido aqui, caso você não queira ler por enquanto hehehe (selecione o texto se quiser ler)

mas o esquema é você por um numero por vez no tabuleiro inteiro. tipo ponha todos os 1 (seguindo as regras, logico), depois todos os 2 e assim por diante, encaxando cada um nas posicoes de acordo com a regra. ai o q acontece é não importam os outros numeros. se o numero estiver correto em relacao a ele mesmo, vai sobrar o espaco correto pros outros numeros, pode testar.

mas ai teria q ser o esquema de primeiro preencher o tabluero todo e depois apagar alguns numeros.

bom, mas é isso. se você escolher seguir essa forma, ai vai ser complicado tb de fazer, mas dara certo. outra coisa a se pensar tb, é q na hora de apagar o numero, tb não sei se pode ser qualquer numero. acho q nos sudokus q a gente ve por ai, eles devem seguir alguma logica... sei la. as vezes de repente se você apaga numero demais, o jogo vai acabar ficando com varias solucoes possiveis e o cara vai ter q resolver na base do chute em vez de seguir a logica do jogo.

Link para o comentário
Compartilhar em outros sites

  • 0

Humm... ótima idéia.

Receber ajudar não tira a diversão não, embora eu seja meio fissurado em fazer programinha malucos no VB. huahaha

Mas desde que eu consiga fazê-los eu fico satisfeito.

Será que essa sua idéia dá 100% de certeza mesmo?

Você falou com tanta confiança que eu to acreditando que sim. huahaha

Vou bolar um jeito de fazer isso, acho que não tãããããão difícil não.

O pior de tudo é que eu to cheio de coisa pra facul, mas fico numa ansiedade pra fazer o sudoku funcionar.

huahaha

Vamos ver, se hoje eu não for no jogo Galo eu vou tentar fazer.

Valeu! xD

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0
Vamos ver, se hoje eu não for no jogo Galo eu vou tentar fazer.

e ae?? foi no jogo?? heheh acho q você não vai ter coragem de levanta da cama por uns dia não?? ou já se acostumou com esses "incidentes"??

zuera hahahah mas ou o atletico minero esse ano ta de zuera mesmo em

Será que essa sua idéia dá 100% de certeza mesmo?

Você falou com tanta confiança que eu to acreditando que sim. huahaha

ou fiz ate no papel pra testar hehehhe

só q você tem q ficar meio esperto, principalmente quando for chegando no final e o espaco for diminuindo.

tipo, minha sugestao seria q você fosse vendo pelo quadradao. tipo pusesse o 1 no primero quadradao, depois no segundo depois no terceiro.

só q tem q ficar de olho, porque quando tiver nos ultimos numeros, tem quadradao q pode parecer q tem mais de um quadrado disponivel, mas acontece q se você escolher o errado, pode prejudicar os proximos quadradoes. pelo menos quando chegar no 7 e 8 (se você seguir a ordem crescente) tem q prestar bastante atencao.

Link para o comentário
Compartilhar em outros sites

  • 0
e ae?? foi no jogo?? heheh acho q você não vai ter coragem de levanta da cama por uns dia não?? ou já se acostumou com esses "incidentes"??

zuera hahahah mas ou o atletico minero esse ano ta de zuera mesmo em

Graças à Deus minha carona desistiu de ir no jogo, e eu acabei ficando em casa mesmo. hahahaha

Esse time do Galo tá uma vergonha. Nunca vi um time perder tantos jogos por goleado num único ano.

Mas no final das contas eu nem mexi no projeto, tive que fazer um trabalho.

Agora eu to com um pouquinho de tempo livre, vamos ver no que vai dar.

ou fiz ate no papel pra testar hehehhe

só q você tem q ficar meio esperto, principalmente quando for chegando no final e o espaco for diminuindo.

tipo, minha sugestao seria q você fosse vendo pelo quadradao. tipo pusesse o 1 no primero quadradao, depois no segundo depois no terceiro.

só q tem q ficar de olho, porque quando tiver nos ultimos numeros, tem quadradao q pode parecer q tem mais de um quadrado disponivel, mas acontece q se você escolher o errado, pode prejudicar os proximos quadradoes. pelo menos quando chegar no 7 e 8 (se você seguir a ordem crescente) tem q prestar bastante atencao.

Pois é, boa idéia, vou fazer aqui no papel também pra ter uma noção de como deve ser feito o processo.

E depois eu passo pro VB.

Até mais.

Link para o comentário
Compartilhar em outros sites

  • 0

Bem.... eu tentei fazer aqui.

A princípio eu não me preocupei muito com a possibilidade de um número "impedir" o número seguinte de ser criado, como você sugeriu no seu post.

Então eu só fiz o seguinte:


Randomize

For número = 1 To 9
For q1 = 0 To 8
q2 = Int(9 * Rnd)
If Me.Controls(quadrante(q1, q2)).Enabled = True Then
Me.Controls(quadrante(q1, q2)).Text = número
If Regra = False Then
If Regra2 = False Then
Me.Controls(quadrante(q1, q2)).Enabled = False
Else
Me.Controls(quadrante(q1, q2)).Text = h
h = h + 1
End If
Else
Me.Controls(quadrante(q1, q2)).Text = h
h = h + 1
End If
End If
Next
Next

quantidade = 81 - (Int(6 * Rnd) + 25)

While quantidade > 0
lugar = Int(80 * Rnd)
If Me.Controls(casa(lugar)).Enabled = False Then
Me.Controls(casa(lugar)).Text = ""
Me.Controls(casa(lugar)).Enabled = True
quantidade = quantidade - 1
End If
Wend
[/codebox]

No For, teoricamente, todos os números são criados.

E no While eu apago aleatoriamente alguns dos números criados.

O problema é que, novamente, deu loop infinito.

Será por causa desse problema que você disse, de um número "impedir" o outro de ser criado?

Edit: é, deve ser por causa disso mesmo.

Eu fiz uns testes aqui, manualmente, e parece que a chance disso acontecer é muito grande.

O que eu não sei, é que ação deve-se realizar quando não existir uma posição para um determinado número.

Editado por Darknnez
Link para o comentário
Compartilhar em outros sites

  • 0
O problema é que, novamente, deu loop infinito.

Será por causa desse problema que você disse, de um número "impedir" o outro de ser criado?

então, mas você tentou dar um control break e olhar o tabuleiro pra ver como ficou?? por q acho q, se o codigo estiver correto, esse problema só ia ocorrer quando chegar no 7. alias, talvez nem no 7, acho q só quando faltar só 8 e 9.

e ai quando acontecesse isso, o esquema seria: comecar no primero quadrante, e em vez de pular direto pro segundo, procurar algum quadrado livre q esteja na mesma linha ou coluna q ele e marcar o outro quadradinho no mesmo quadradao.

mas ce sabe, quando quiser, pode mandar o projeto la.

Link para o comentário
Compartilhar em outros sites

  • 0
então, mas você tentou dar um control break e olhar o tabuleiro pra ver como ficou?? por q acho q, se o codigo estiver correto, esse problema só ia ocorrer quando chegar no 7. alias, talvez nem no 7, acho q só quando faltar só 8 e 9.
Não sei não.... no teste que eu fiz, chegou uma ora que não tinha onde colocar o número 6 no último quadrante da esquerda.

e ai quando acontecesse isso, o esquema seria: comecar no primero quadrante, e em vez de pular direto pro segundo, procurar algum quadrado livre q esteja na mesma linha ou coluna q ele e marcar o outro quadradinho no mesmo quadradao.

Não entendi... =/

Bem, de qualquer jeito, vou mandar o projeto lá, se você acha necessário.

Link para o comentário
Compartilhar em outros sites

  • 0

caso você ainda não tenha resolvido...

e ai quando acontecesse isso, o esquema seria: comecar no primero quadrante, e em vez de pular direto pro segundo, procurar algum quadrado livre q esteja na mesma linha ou coluna q ele e marcar o outro quadradinho no mesmo quadradao.

Não entendi... =/

é... acho q tem q ser mais ou menos nesse caminho.

olha o q aconteceu comigo aqui:

sudokumy8.jpg

veja q numerei a ordem em q os numeros 2 foram colocados. veja o seguinte:

ate o sexto 2 tava tudo bem. o setimos 2, podia entrar em mais de um lugar no quadradao. ai você pos em um lugar qualquer. e a mesma coisa no oitavo 2. mas ao fazer isso, você eliminou todas as possibilidades no ultimo quadradao. não tem onde encaxar um 2 la.

e é isso q você tem q prever, entendeu??

agora... como fazer isso??

não tenho ideia hahahhaha

bom... uma ideia é a seguinte. pra facilitar (mas não obrigatorio) você podia criar uma outra matriz para cada quadrante. só q ela seria pra guardar os lugares onde os numeros não podem entrar. exemplo, pensei aqui, a matriz seria do tipo string e seria preenchida de inicio, todos os indices com "0123456789". ai quando você inserisse um numero, por exemplo o 2, você testaria todos os lugares onde não é mais permitido inseri-lo e removeria o 2 da string. assim você já sabe q não entra o 2 la e não teria a necessidade de ficar testando sempre q precisar saber, o q reduziria bem o tempo.

bom, mas não é necessarimente necessario.

e ai o q você teria q fazer seria. no exemplo, você pos o oitavo 8 e acabou com as possibilidades do nono, certo?? então, o q você deveria fazer era... apagar o oitavo e marcar q aquela casa não serve pro 2. e preencher outra. e se essa tb não der, você faz o mesmo. e ai se necessario você voltaria ate ao primeiro 2 e poria em outro lugar.

bom... dependendo isso pode fazer demorar demais, e o codigo pra fazer isso não seria exatamente muito facil, e talvez exista ate alguma outra maneira mais simples, mas pelo menos daria certo.

veja ai se você entendeu, qualquer coisa poste.

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm... entendi sim.

Foi mais ou menos o que eu tentei fazer há alguns dias atrás, só que o código ficou muito bagunçado.

Você ainda tem o project da última vez que eu te passei, ou o link?

Quero recomeçar de onde tinha parado da última vez que te mandei.

Se tiver, manda pra mim por favor.

Valeu!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...