Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
trouble with 'FOR - NEXT' thingies. Please help
#1
Hi all,
I just got FBIDE today and while I was playing round with it I came up with this program. Trouble is FBIDE is saying that it needs another 'FOR' only I can't see where.

Code:
SCREEN 19
RANDOMIZE TIMER
troops% = 1000
mindistx% = 5000
mindisty% = 5000
TYPE soldier
   side AS INTEGER
   health AS INTEGER
   strength AS INTEGER
   experience AS INTEGER
   posx AS INTEGER
   posy AS INTEGER
   shortlist AS INTEGER
END TYPE

DIM army(1 TO troops%) AS soldier

FOR X% = 1 TO troops%
   army(X%).side = INT(RND * 2) + 1
   army(X%).health = 100
   army(X%).strength = INT(RND * 50) + 25
   army(X%).experience = INT(RND * 10) + 1
   IF army(X%).side = 1 THEN
      army(X%).posx = INT(RND * 350) + 1
   ELSEIF army(X%).side = 2 THEN
      army(X%).posx = 800 - INT((RND * 350) + 1)
   END IF
   army(X%).posy = INT(RND * 600) + 1
NEXT X%

FOR X% = 1 TO troops%
   IF army(X%).side = 1 THEN
      one% = one% + 1
   ELSE
      two% = two% + 1
   END IF
NEXT X%

one$ = STR$(one%)
two$ = STR$(two%)

PRINT "Side one has: " + one$ + " troops."
PRINT "Side two has: " + two$ + " troops."
PRINT "Press any key to continue."
DO
   press$ = INKEY$
   IF press$ <> "" THEN
      CLS
      press$ = ""
      EXIT DO
   END IF
LOOP

DO
   FOR X% = 1 TO troops%
      
      IF army(X%).health <= 0 THEN
      ELSE
         PSET (army(X%).posx, army(X%).posy), army(X%).side
      END IF
      
      FOR Y% = 1 TO troops%
        
         army(Y%).shortlist = 0
        
         IF army(X%).side <> army(Y%).side THEN
            army(Y%).shortlist = 1
         ELSE
            army(Y%).shortlist = 0
         END IF
        
         IF army(X%).posx - army(Y%).posx < mindistx% AND army(X%).posy - army(Y%).posy < mindisty% AND army(Y%).shortlist = 1 THEN
               army(Y%).shortlist = 1
         ELSE
               army(Y%).shortlist = 0
         END IF
        
      NEXT Y%
      
      FOR Y% = 1 TO troops%
        
         IF army(X%).posx - army(Y%).posx < mindistx% AND army(X%).posy - army(Y%).posy < mindisty% AND army(Y%).shortlist = 1 THEN
               army(Y%).shortlist = 1
         ELSE
               army(Y%).shortlist = 0
         END IF
        
      NEXT Y%
      
      FOR Y% = 1 TO troops%
        
         IF army(Y%).shortlist = 1 THEN
            
            IF army(Y%).posx < army(X%).posx THEN
                  army(X%).posx = army(X%).posx - 1
            ELSE
                  army(X%).posx = army(X%).posx + 1
            END IF
            
            IF army(Y%).posy < army(X%).posy THEN
                  army(X%).posy = army(X%).posy - 1
            ELSE
                  army(X%).posy = army(X%).posy + 1
         END IF
        
      NEXT Y%
      
   NEXT X%
  
   SLEEP 1000
LOOP

Thanks in advance. Big Grin
Reply
#2
Look two lines above the last "NEXT Y%" You're missing an END IF, so the compiler thinks you're doing this:

IF
FOR
IF
NEXT
Reply
#3
thank you sooooo much!

Just thought I should let you know that it's still work in progress.
Reply
#4
Here's the finished version i you're interested.

Code:
SCREEN 19
RANDOMIZE TIMER
troops% = 1000
mindistx% = 5000
mindisty% = 5000
TYPE soldier
   side AS INTEGER
   health AS INTEGER
   strength AS INTEGER
   experience AS INTEGER
   posx AS INTEGER
   posy AS INTEGER
   shortlist AS INTEGER
   chance AS INTEGER
END TYPE

DO

dead% = deada% + deadb%
LOCATE 1, 80
PRINT dead%

DIM army(1 TO troops%) AS soldier

FOR X% = 1 TO troops%
   army(X%).side = INT(RND * 2) + 1
   army(X%).health = 100
   army(X%).strength = INT(RND * 50) + 25
   army(X%).experience = INT(RND * 10) + 1
   IF army(X%).side = 1 THEN
      army(X%).posx = INT(RND * 350) + 1
   ELSEIF army(X%).side = 2 THEN
      army(X%).posx = 800 - INT((RND * 350) + 1)
   END IF
   army(X%).posy = INT(RND * 600) + 1
NEXT X%

one% = 0
two% = 0
FOR X% = 1 TO troops%
   IF army(X%).side = 1 THEN
      one% = one% + 1
   ELSE
      two% = two% + 1
   END IF
NEXT X%

one$ = STR$(one%)
two$ = STR$(two%)

PRINT "Side one has: " + one$ + " troops."
PRINT "Side two has: " + two$ + " troops."
PRINT "Press any key to continue."
DO
   press$ = INKEY$
   IF press$ <> "" THEN
      CLS
      press$ = ""
      EXIT DO
   END IF
LOOP

DO
   FOR X% = 1 TO troops%
      
      IF army(X%).health <= 0 THEN
      ELSE
         PSET (army(X%).posx, army(X%).posy), army(X%).side
      END IF
      
      FOR Y% = 1 TO troops%
        
         army(Y%).shortlist = 0
        
         IF army(Y%).health <= 0 THEN
            army(Y%).shortlist = 0
         ELSE
            army(Y%).shortlist = 1
         END IF
        
         IF army(X%).side <> army(Y%).side AND army(Y%).shortlist = 1 THEN
            army(Y%).shortlist = 1
         ELSE
            army(Y%).shortlist = 0
         END IF
        
         IF army(X%).posx - army(Y%).posx < mindistx% AND army(X%).posy - army(Y%).posy < mindisty% AND army(Y%).shortlist = 1 THEN
               army(Y%).shortlist = 1
         ELSE
               army(Y%).shortlist = 0
         END IF
        
      NEXT Y%
      
      FOR Y% = 1 TO troops%
        
         IF army(X%).posx - army(Y%).posx < mindistx% AND army(X%).posy - army(Y%).posy < mindisty% AND army(Y%).shortlist = 1 THEN
               army(Y%).shortlist = 1
         ELSE
               army(Y%).shortlist = 0
         END IF
        
      NEXT Y%
      
      FOR Y% = 1 TO troops%
        
         IF army(Y%).shortlist = 1 THEN
            
            IF army(Y%).posx < army(X%).posx THEN
                  army(X%).posx = army(X%).posx - 1
            ELSE
                  army(X%).posx = army(X%).posx + 1
            END IF
            
            IF army(Y%).posy < army(X%).posy THEN
                  army(X%).posy = army(X%).posy - 1
            ELSE
                  army(X%).posy = army(X%).posy + 1
            END IF
            
            IF army(Y%).posy = army(X%).posy AND army(Y%).posx = army(X%).posx THEN
                  army(Y%).chance = army(Y%).strength + army(Y%).experience * (INT(RND * 10) + 1)
                  army(X%).chance = army(X%).strength + army(X%).experience * (INT(RND * 10) + 1)
                  IF army(Y%).chance < army(X%).chance THEN
                     army(Y%).health = army(Y%).health - army(X%).strength * INT(RND * 10) + 1
                  ELSE
                     army(X%).health = army(X%).health - army(Y%).strength * INT(RND * 10) + 1
                  END IF
            END IF
            
         END IF
        
      NEXT Y%
      
   NEXT X%
  
   SLEEP 500
   CLS
   deada% = 0
   deadb% = 0
   FOR Y% = 1 TO troops%
      IF army(Y%).side = 1 THEN
         IF army(Y%).health <= 0 THEN
            deadb% = deadb% + 1
         END IF
      ELSEIF army(Y%).side = 2 THEN
         IF army(Y%).health <= 0 THEN
            deada% = deada% + 1
         END IF
      END IF
   NEXT Y%
   IF deada% = two% THEN
      winner$ = "side one"
      EXIT DO
   ELSEIF deadb% = one% THEN
      winner$ = "side two"
      EXIT DO
   END IF
LOOP

CLS
PRINT "The round was won by " + winner$ + "."
PRINT "Press any key to continue."

DO
   press$ = INKEY$
   IF press$ <> "" THEN
      EXIT DO
   END IF
LOOP
LOOP

that's it. give it a go, it isn't that great but i enjoyed making it.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)