10 REM * THE OLD MAN AND THE SEA - ADVANCED VERSION * 20 REM * POSITION VARIABLES, LINE TENSION, AND MARLIN'S STATUS * 30 LET bx = 10: LET by = 10 : REM Boat position 40 LET mx = 30: LET my = 15 : REM Marlin position 50 LET tension = 0 : REM Line tension 60 LET maxTension = 150 : REM Maximum tension before the line breaks 70 LET distance = 0 : REM Distance between the boat and the marlin 80 LET angle = 0 : REM Relative angle between the boat and the marlin 90 LET marlinEnergy = 100 : REM Marlin's energy (100 = full of energy) 100 LET marlinPain = 0 : REM Accumulated pain of the marlin 110 LET marlinResistance = 0 : REM Marlin's resistance based on energy and pain 120 LET speed = 5 : REM Marlin's base movement speed 130 LET escape = 0 : REM Marlin's state (0 = on the line, 1 = escapes) 140 CLS 150 PRINT "THE OLD MAN AND THE SEA - PRESS ANY KEY TO START" 160 PAUSE 0 170 CLS 180 PRINT AT 1, 5;"BOAT CONTROL: W (UP) S (DOWN) A (LEFT) D (RIGHT)" 190 PRINT AT 2, 5;"LINE CONTROL: L (LOOSEN) K (REEL IN)" 200 PRINT AT 3, 5;"MAINTAIN TENSION AND FOLLOW THE MARLIN" 210 REM * MAIN LOOP * 220 LET distance = SQR((mx-bx)*(mx-bx) + (my-by)*(my-by)) : REM Calculate the distance 230 LET angle = ATN(ABS(my-by)/ABS(mx-bx)) * 180/PI : REM Calculate the angle 240 LET tension = distance * 2 + ABS(90-angle) : REM Calculate the tension 250 LET marlinResistance = marlinEnergy / 2 - (marlinPain / 50) : REM Less energy and more pain, less resistance 260 LET marlinPain = marlinPain + (tension / 20) : REM Pain increases with tension 270 LET marlinEnergy = marlinEnergy - (tension / 50) - (marlinPain / 100) : REM Energy decreases with tension and pain 280 REM * CHECK IF THE LINE BREAKS * 290 IF tension > maxTension THEN PRINT AT 10, 5;"THE LINE BROKE!": STOP 300 REM * DISPLAY CURRENT STATUS * 310 PRINT AT 5, 5;"TENSION: "; tension 320 PRINT AT 6, 5;"DISTANCE: "; distance 330 PRINT AT 7, 5;"MARLIN ENERGY: "; marlinEnergy 340 PRINT AT 8, 5;"MARLIN POSITION: "; mx; ","; my 350 PRINT AT 9, 5;"BOAT POSITION: "; bx; ","; by 360 REM MOVE THE BOAT 370 LET k$ = INKEY$ 380 IF k$ = "W" THEN LET by = by - 1 390 IF k$ = "S" THEN LET by = by + 1 400 IF k$ = "A" THEN LET bx = bx - 1 410 IF k$ = "D" THEN LET bx = bx + 1 420 REM * LINE HANDLING * 430 IF k$ = "L" THEN LET distance = distance + 5 : LET tension = tension - 10 440 IF k$ = "K" THEN LET distance = distance - 5 : LET tension = tension + 10 450 REM * MARLIN MOVEMENT BASED ON ENERGY, PAIN, AND RESISTANCE * 460 REM * Change direction based on energy and pain * 470 LET dx = INT(RND*speed - (speed / 2)) : REM Random X movement 480 LET dy = INT(RND*speed - (speed / 2)) : REM Random Y movement 500 IF marlinPain > 50 THEN LET dx = dx * 1.5 : REM Greater pain, more erratic movements 510 IF marlinEnergy < 30 THEN LET speed = speed / 2 : REM Low energy reduces speed 520 LET mx = mx + dx 530 LET my = my + dy 540 IF RND < 0.1 THEN LET mx = mx + INT(RND*20 - 10): LET my = my + INT(RND*20 - 10) 541 IF mx<0 THEN LET mx=0 542 IF mY<0 THEN LET my=0 543 IF mx>255 THEN LET mx=255 544 IF my>175 THEN LET my=175 580 REM * DRAW THE LINE BETWEEN THE BOAT AND THE MARLIN * 590 LET dx = mx - bx : REM Difference in X 600 LET dy = my - by : REM Difference in Y 610 CLS : REM Clear the screen before redrawing 620 PLOT bx, by : REM Position the cursor at the boat 630 DRAW mx-bx, my-by : REM Draw the line to the marlin 640 PRINT "Boat at ("; bx; ","; by; ")" 650 PRINT "Marlin at ("; mx; ","; my; ")" 660 REM * CHECK IF THE MARLIN ESCAPES OR IS CAUGHT * 670 IF distance > 200 THEN PRINT AT 10, 5;"THE MARLIN ESCAPED!": STOP 680 IF marlinEnergy < 10 AND distance < 5 THEN PRINT AT 10, 5;"YOU CAUGHT THE MARLIN!": STOP 690 GO TO 220
Teemu1.huusko