Avatar billede cyberspace Nybegynder
08. januar 2004 - 14:57 Der er 21 kommentarer og
1 løsning

der er uendelige løkker i programmet

jeg har prøvet at lave et program hvor der er 16x16 felter man markerer så nogle felter starter programmet og den vil ud fra bestemte regler markere/slette felter. Hvordan kan jeg fjerne at den laver løkker

KODE: Option Explicit
Dim StartTid As Long
Dim Tid As Long
Dim hvid, sort, blå As Long
Dim Navn(200) As String
Dim AntalNavne As String

Const bredde = 16
Private Sub cmdReset_Click()
Dim lodret, vandret, feltid As Integer
    For lodret = 1 To bredde
        For vandret = 1 To bredde
            feltid = (lodret * bredde) + vandret
            lblFelt(feltid).BackColor = sort
            lblFelt(feltid).Tag = False
        Next
    Next
    lblTid.Caption = Format$(0, "00")
End Sub
Function CheckOmViErDone()
Dim lodret As Integer, vandret As Integer
Dim cnt As Integer, feltid As Integer
   
    For lodret = 1 To bredde
        For vandret = 1 To bredde
            feltid = (lodret * bredde) + vandret
           
            If lblFelt(feltid).Tag = True Then
                cnt = cnt + 1
            End If
        Next vandret
    Next lodret
   
    If cnt = 0 Then
        Timer1.Enabled = False
       
        MsgBox "Desværre - Alt liv blev udslettet!"
        Command1.Caption = "Start"
    End If

End Function

Private Sub Command1_Click()
Timer1.Enabled = True
StartTid = Timer

If Command1.Caption = "Start" Then
    Command1.Caption = "Stop"
    Do While Command1.Caption = "Stop"
        Generation
        CheckOmViErDone
        DoEvents
      Loop
    Else
    Command1.Caption = "Start"
End If
   
End Sub
Private Sub Command2_Click()
MsgBox "LIV - Spil Forklaring: De otte felter omkring et givet felt kaldes feltets naboer - En brik, som har to eller tre nabobrikker overlever til næste generation - En brik som har fire eller flere naboer, dør på grund af overbefolkning og bliver fjernet - En hver brik som kun har én nabo, dør af mangel på støtter - I et hvert tomt felt, som har tre - og kun tre- naboer, sker der en fødsel og der placeres en brik i næste generation"

End Sub

Private Sub Command3_Click()
MsgBox "Man starter med at markere x antal felter, så klikker man på start og spillet går igang, man kan løbende klikke på felter. - Det gælder om at holde liv i spillet så længe som muligt - spillet er slut når alle felte/liv er slettet/døde - Spillet kan midlertidigt stoppes ved at trykke stop."
End Sub
Private Sub Form_Load()
Dim lodret, vandret, feltid As Integer
  hvid = RGB(255, 255, 128)
  sort = RGB(0, 128, 0)
  blå = RGB(0, 0, 128)
    For lodret = 1 To bredde
    For vandret = 1 To bredde
    feltid = (lodret * bredde) + vandret
      Load lblFelt(feltid)
      lblFelt(feltid).Move lodret * _
      lblFelt(feltid).Width, _
      vandret * lblFelt(feltid).Height
      lblFelt(feltid).BackColor = sort
      lblFelt(feltid).Tag = False
      lblFelt(feltid).Visible = True
   
    Next
  Next
  End Sub

Private Sub lblFelt_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
  If Button = 1 Then  'Venstre Knap
     
    lblFelt(Index).BackColor = hvid
    lblFelt(Index).Tag = True
  End If
  If Button = 2 Then  'Højre knap
      lblFelt(Index).BackColor = sort
      lblFelt(Index).Tag = False
    End If
   
End Sub
Function FeltOverlever(lblID As Integer) 'Funktion header
Dim AntalLevendeNaboer As Integer
Dim ILiveNu As Integer
  ILiveNu = lblFelt(lblID).Tag = True
  AntalLevendeNaboer = 0
 
  ' Test de felter ovenover
  If lblFelt(lblID - (bredde + 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID - bredde).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID - (bredde - 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1

' Test de to felter på hver sin side af det aktuelle felt
If lblFelt(lblID - 1).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + 1).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1

' Test de tre felter nedenunder
If lblFelt(lblID + (bredde - 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + bredde).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1
If lblFelt(lblID + (bredde + 1)).Tag = True Then _
  AntalLevendeNaboer = AntalLevendeNaboer + 1

'Funktion Retunerer True eller False
FeltOverlever = (ILiveNu And ((AntalLevendeNaboer = 2) _
  Or (AntalLevendeNaboer = 3))) _
  Or ((Not ILiveNu) And (AntalLevendeNaboer = 3))
If AntalLevendeNaboer = 0 Then
    lblTid = Timer - StartTid
 
  End If
 
End Function

Private Sub Generation()
Dim lodret, vandret, feltid As Integer
 
  'Tegn overlevende felter
  For lodret = 2 To (bredde - 1)
    For vandret = 2 To (bredde - 1)
    feltid = (lodret * bredde) + vandret
    lblFelt(feltid).BackColor = _
    IIf(FeltOverlever(feltid), hvid, sort)
    Next
  Next
 
  'opdater True-properties
  For lodret = 2 To (bredde - 1)
    For vandret = 2 To (bredde - 1)
      feltid = (lodret * bredde) + vandret
      lblFelt(feltid).Tag = _
        IIf(lblFelt(feltid).BackColor = hvid, True, False)
       
          Next
        Next
        End Sub
       
Private Sub Timer1_Timer()
Timer1.Enabled = False
Tid = StartTid - Timer1

End Sub
Avatar billede cyberspace Nybegynder
08. januar 2004 - 15:24 #1
se frem til at der er et klogt hoved der kan og vil hjælpe
Avatar billede kabbak Professor
08. januar 2004 - 15:46 #2
du skal dimme denne udenfor funktionen i global, den glemmer værdien

Dim cnt As Integer
Avatar billede kabbak Professor
08. januar 2004 - 15:47 #3
glem det
Avatar billede martin_moth Mester
08. januar 2004 - 18:49 #4
"Hvordan kan jeg fjerne at den laver løkker"

Hvor langt er et stykke snor?
Avatar billede joern Nybegynder
08. januar 2004 - 20:35 #5
Hej.

Du må anvende VB's indbyggede debugger, så kan du se hvor den første løkke ikke afslutter.  Når den er rettet, kan du finde den næste, hvis der er mere end én.
Der er næppe nogen, - der som cyberspace skriver - vil gennemse din kildetekst fuldstændig.

M.v.h.  Jørn
Avatar billede helmet Nybegynder
08. januar 2004 - 22:29 #6
Jeg kan se du kun kontrollere felterne der ligger +1 fra en kant og ind efter, du bliver nok nødt til at kontrollere alle felter også de yderste. Ellers kan de yderste felter jo aldrig dø.
Avatar billede helmet Nybegynder
08. januar 2004 - 22:40 #7
Grunden til at du får et loop, hænger jo også samme med at dine regler, som giver mulighed for kombinationer, som ikke bliver slået ihjel. Prøv fx. at lave et kvadrat og tryk start. Så kan den dælme stå længe.
Avatar billede cyberspace Nybegynder
09. januar 2004 - 08:48 #8
er der ikke nogen der kan komme med et par kode eksempler.

helmet>> vil det sige at udover at checke på +1 også skal checke på 0 ?
Avatar billede martin_moth Mester
09. januar 2004 - 08:53 #9
Du har jo selv skrevet programmet - hvad for kodeeksempler vil du da have?

Debug debug debug - det er vejen frem.

Kod evt. en lille del ad gangen, og kontroller hele tiden at det virker før du går videre. Good luck :o)
Avatar billede cyberspace Nybegynder
09. januar 2004 - 08:58 #10
gerne Eksempem på hvordan jeg checker de yderste felter
Avatar billede cyberspace Nybegynder
09. januar 2004 - 11:10 #11
eller noget hjælp til af fjerne ueldelige løkker
Avatar billede martin_moth Mester
09. januar 2004 - 11:21 #12
Jeg kan kun gentage : Brug debuggeren!

En løkke kører jo indtil en betindelse er opfyldt - tjek betingelserne :o)
Avatar billede cyberspace Nybegynder
09. januar 2004 - 11:46 #13
Jeg har problemer med at få rettet,  så den checker på andet end felterne der ligger +1 fra kant
Avatar billede cyberspace Nybegynder
09. januar 2004 - 11:48 #14
skal jeg lave en ny cnt kommando? hvis ja hvad skal den være
Avatar billede cyberspace Nybegynder
09. januar 2004 - 12:38 #15
er der ikke en der kan fortælle mig hvor i koden jeg kan ændre flg.

når jeg har markeret 3 felter ved siden af hinanden, og trykker start markeres 1 firkant og går i lykke.
Avatar billede helmet Nybegynder
09. januar 2004 - 12:46 #16
Det er dine regler.. Hvis en brik har 2-3 naboer overlever den til næste generation. Altså bliver de ved med at overleve, og spillet slutter aldrig.
Avatar billede helmet Nybegynder
09. januar 2004 - 14:42 #17
For at lave en der tjekker de yderste felter skal der laves om i bla. din generations funktion
For lodret = 1 To bredde
    For vandret = 1 To bredde
    feltid = (lodret * bredde) + vandret
    lblFelt(feltid).BackColor = _
    IIf(FeltOverlever(feltid), hvid, sort)
    Next
  Next
MEN.. det vil ikke virke når du kalder FeltOverlever, den funktion tager ikke højde for at felterne i kanten ikke har 8 naboer men henholdsvis 3 og 5 naboer, så det er du nødt til at tage hånd om.
Avatar billede sion Nybegynder
13. januar 2004 - 15:41 #18
Ha! Jeg har også lavet præcis samme livscyklus-spil/program for et par års tid siden :)
Jeg kan godt oploade min version hvis du er interesseret.
Avatar billede cyberspace Nybegynder
15. januar 2004 - 10:15 #19
sion>> er din version uden løkker m.m./ har du lavet ændringer - hvis ja hvilke?

Hvis du har lavet ændringer (i forhold til original koden/programmet) så kan du sende din udgave til mig. Gerne med forklaringer. Du kan sende til mig på cyberspace@sol.dk

Uden ændringer har det ingen! interesse
Avatar billede sion Nybegynder
15. januar 2004 - 19:36 #20
Jeg har lavet nogle få ændringer, de er dog mest kosmetiske... Jeg sender dig koden, så kan du jo bare bruge den eller lade være - jeg tror den burde løse dit løkke-problem. Koden er dog ret grim da den er fra min begyndertid som VB-nørd, og er ukommenteret ;)
Avatar billede cyberspace Nybegynder
16. januar 2004 - 08:55 #21
sion>> takker. Der dog stadig enkelte løkker i dit program, men jeg kan godt bruge dit program. som jeg lige retter til

skriv lige svar og point er dinne
Avatar billede sion Nybegynder
16. januar 2004 - 17:26 #22
Godt at du kunne bruge mit program til noget ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester