The QBasic / QB64 Discussion Forum      Other Subforums, Links and Downloads
 
 

 Return to Index  

Fish

February 23 2011 at 2:09 AM
  (Login MCalkins)
R


Response to old, unfinished, and/or abandoned programs.

 
I like this one. It is public domain.




' Now us MS-DOS users can see fish too. Windows 98 has lost its monopoly.
DECLARE FUNCTION correct% (n%)
delay& = 4000                   ' The bigger the number, the slower the fish.
                                ' Use to adjust speed for different computers.
music% = 0                      ' 1 is enabled. 0 is disabled. 2 is use noise.
upDown% = 1                     ' For enabling or disabling variation of y. 1 is enabled. 0 is disabled.
screenMode% = 9                 ' For CGA, use 1. For VGA or EGA, use 9. For Herc., use 3.
music$ = "mlmbo5p2l16ababl4g.dec.p4l16ababl4g.de>c.<p2"  ' My guess at the notes of The Good, Bad, and Ugly.
ON ERROR GOTO term
IF music% = 1 THEN ON PLAY(2) GOSUB playbackground
DIM SHARED dir%
oSM% = screenMode%
1 ON ERROR GOTO term
SELECT CASE screenMode%
CASE 1                  ' Will work on CGA, EGA, and VGA cards.
 totalX% = 320
 totalY% = 200
 totalC% = 3
 mag% = 1
CASE 9                  ' Will work on VGA. I think it will work on EGA as well.
 totalX% = 640
 totalY% = 350
 totalC% = 15
 mag% = 2
CASE 3                  ' Will work on Hercules.
 totalX% = 720
 totalY% = 348
 totalC% = 1
 mag% = 2
CASE ELSE
 PRINT "Why don't you like the choices I gave you? If you really want to use that mode,"
 PRINT "modify the program. Press any key to detect a usable screen mode."
 screenMode% = -1
 SLEEP: WHILE INKEY$ <> "": WEND
END SELECT
ON ERROR GOTO videoCard
SCREEN screenMode%
ON ERROR GOTO term
RANDOMIZE TIMER
oMag% = mag%
IF music% = 1 THEN PLAY ON
IF music% = 1 THEN PLAY music$
DO
 mag% = oMag% * (RND * 1.5 + .25)    ' Choses a random size.
 oriY% = INT(RND * (totalY% - 55 * mag% * 2)) + 55 * mag%  ' Choses a random y location.
 var1Y% = INT(RND * 6)          ' Choses a random variation of y (var. = var1Y * SIN(x / 10)).
 var2Y% = INT(RND * 26)         ' Choses a random variation of y (var. = var2Y * SIN(x / divisor)).
 divisor% = INT(RND * 20) + 80 ' Choses a random divisor for big sine wave.
 var1Y% = var1Y% * upDown%      ' Enables or disables variation of y.
 var2Y% = var2Y% * upDown%
 c% = INT(RND * totalC%) + 1    ' Choses a random color.
 s! = ((INT(RND * 4) + 2) / 2) * mag%   ' Choses a random fish speed (the number of pixels jumped per loop).
 dir% = INT(RND * 2)            ' Choses a random direction.
 IF dir% = 1 THEN               ' 1 is left to right.
  f1% = -50 * mag%
  f2% = totalX% + 1
  f3! = 1 * s!
 ELSE                           ' 0 is right to left.
  f1% = totalX% + 1
  f2% = -50 * mag%
  f3! = -1 * s!
 END IF
 IF screenMode% = 1 THEN
  COLOR 0, INT(RND * 2)         ' For screen mode 1, choses random palette.
 END IF
 FOR x! = f1% TO f2% STEP f3!
  LINE (x! + 1, y% + 1)-(x! + 50 * mag%, y% + 50 * mag%), 0, BF     ' Clears old fish.
  y% = oriY% + SIN(x! / 10) * var1Y% + SIN(x! / divisor%) * var2Y%
  IF music% = 2 THEN SOUND (y% - oriY%) * 10 + 300, .182
  ' Draws new fish:
  ' body:
  CIRCLE (x! + correct%(30) * mag%, y% + 25 * mag%), 15 * mag%, c%, , , .5
  ' tail:
  LINE (x! + correct%(5) * mag%, y% + 20 * mag%)-(x! + correct%(15) * mag%, y% + 25 * mag%), c%
  LINE (x! + correct%(5) * mag%, y% + 30 * mag%)-(x! + correct%(15) * mag%, y% + 25 * mag%), c%
  LINE (x! + correct%(5) * mag%, y% + 20 * mag%)-(x! + correct%(9) * mag%, y% + 25 * mag%), c%
  LINE (x! + correct%(5) * mag%, y% + 30 * mag%)-(x! + correct%(9) * mag%, y% + 25 * mag%), c%
  ' eye:
  CIRCLE (x! + correct%(40) * mag%, y% + 23 * mag%), 1 * mag%, c%
  ' fins:
  LINE (x! + correct%(28) * mag%, y% + 17 * mag%)-(x! + correct%(26) * mag%, y% + 11 * mag%), c%
  LINE (x! + correct%(32) * mag%, y% + 17 * mag%)-(x! + correct%(26) * mag%, y% + 11 * mag%), c%
  LINE (x! + correct%(28) * mag%, y% + 33 * mag%)-(x! + correct%(26) * mag%, y% + 39 * mag%), c%
  LINE (x! + correct%(32) * mag%, y% + 33 * mag%)-(x! + correct%(26) * mag%, y% + 39 * mag%), c%
  IF INKEY$ <> "" THEN PLAY OFF: SCREEN 0: WIDTH 80, 25: SYSTEM
  FOR i& = 1 TO delay&: NEXT i&         ' Time delay
 NEXT x!
LOOP

playbackground:         ' Subroutine for music event-trapping.
 PLAY music$
 RETURN

term:                   ' Subroutine for error event-trapping.
 PLAY OFF
 SCREEN 0: WIDTH 80, 25
 PRINT "Error"; ERR
 SYSTEM

videoCard:              ' Subroutine for error event-trapping. To determine best screen mode.
 SELECT CASE screenMode%
 CASE 9
  PRINT "Video card is not VGA or EGA. Testing for CGA."
  screenMode% = 1
 CASE 1
  PRINT "Video card is not CGA. Testing for Hercules."
  screenMode% = 3
 CASE 3
  IF msherc% = 0 THEN
   PRINT "Fish could not use screen mode 3. Fish will try to load MSHERC.COM."
   PRINT
   msherc% = 1
   SHELL "msherc > c:\fish.tmp"
   SHELL "type c:\fish.tmp"
   OPEN "c:\fish.tmp" FOR INPUT AS #1
   LINE INPUT #1, t$
   CLOSE
   KILL "c:\fish.tmp"
   IF t$ = "Bad command or file name" THEN
    PRINT
    PRINT "MSHERC could not be found. Try running it manually and then run Fish again."
    SYSTEM
   END IF
   PRINT
   RESUME
  ELSE
   PRINT "Video card not Hercules. "
   IF oSM% = 3 THEN SLEEP 3: GOTO 2
   PRINT "Sorry, you need a video card capable of graphics to run Fish."
   PRINT
   SYSTEM
  END IF
 CASE ELSE
2 screenMode% = 9
  PRINT "Testing for VGA or EGA."
 END SELECT
 SLEEP 3
 RESUME 1

' This function inverts the x axis on fish traveling right to left.
FUNCTION correct% (n%)
 IF dir% = 1 THEN
  t% = n%
 ELSE
  t% = 50 - n%
 END IF
 correct% = t%
END FUNCTION

 
 Respond to this message   
 Copyright © 1999-2014 Network54. All rights reserved.   Terms of Use   Privacy Statement  

Newbies usually go to www.qbasic.com and click on The QBasic Forum
Forum regulars have their own ways, which include The QBasic Community Forums