Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pascalated ZX BASIC Demo #4 - Cannonball
#1
To run online, click here: RUN ONLINE


Code:
' PROGRAM Cannonball
' Demo for the Pascalated language
' Pascalated Sinclair BASIC (c) 1987 by ZarSoft
' Pascalated BASIC Converter (c) 2021 by Zarsoft
' Pascalated Boriel (c) 2023 by ZarSoft
' ZX BASIC Compiler (c) 2008 by Boriel

#include <input.bas>

'--- Pascalated Boriel ---
'#define CONST     CONST
#define VAR       DIM
#define INTEGER   LONG
#define REAL      FLOAT
#define BOOLEAN   LONG
#define TYPE      AS
#define REPEAT    DO
#define UNTIL     LOOP UNTIL
#define PROCEDURE SUB
#define PROGRAM   REM
VAR     TRUE      TYPE INTEGER = 1
VAR     FALSE     TYPE INTEGER = 0

' Variable Declarations
CONST gravity TYPE REAL = 9.8
CONST power TYPE REAL = 10.0
CONST k TYPE REAL = 0.04
VAR near TYPE BOOLEAN

' Variable Declarations
VAR enemies TYPE INTEGER
VAR angle TYPE REAL
VAR G,H TYPE REAL ' target coordinates

PROCEDURE GameOver
INK 1
PRINT AT 21,0;" Well done!"
PRINT AT 21,17;" Goodbye!"
END PROCEDURE

PROCEDURE Boom
LET enemies=enemies-1
INK 0
PRINT PAPER 6;AT 0,15;" Enemies: ";enemies;"  "
INK 3
OVER 1
CIRCLE G,H,4
REM +
PLOT G+5,H: DRAW 5,0
PLOT G,H+5: DRAW 0,5
PLOT G-5,H: DRAW -5,0
PLOT G,H-5: DRAW 0,-5
REM X
PLOT G+5,H+5: DRAW 5,5
PLOT G-5,H+5: DRAW -5,5
PLOT G-5,H-5: DRAW -5,-5
PLOT G+5,H-5: DRAW 5,-5
OVER 0
:FOR q=5 TO 1 STEP -.4: BEEP .01,q: NEXT q
PAUSE 88
END PROCEDURE

PROCEDURE DrawShot
VAR X,Y TYPE REAL
VAR X0,Y0 TYPE REAL
VAR X1,Y1 TYPE REAL
VAR DX,DY TYPE REAL
'
LET X=0.0 : LET DX=power*COS(angle)
LET Y=88.0 : LET DY=power*SIN(angle)
LET X1=X : LET Y1 = Y
LET X0=X1 : LET Y0 = Y1
INK 3
PLOT X1,Y1
REPEAT
  DRAW X1-X0,Y1-Y0
  LET X0=X1 : LET Y0 = Y1
  LET DY=DY-k*gravity : REM gravity
  LET X=X+DX : REM differential increment
  LET Y=Y+DY : REM differential increment
  LET X1=INT(X+0.5)
  LET Y1=INT(Y+0.5)
  IF Y1>175 THEN LET Y1=175
  LET dist = SQR( (Y-H)*(Y-H) + (X-G)*(X-G) )
  LET near = dist < 0.5*(ABS(DY)+ABS(DX))
UNTIL X>255 OR Y<0 OR near
END PROCEDURE

PROCEDURE InputAngle
REPEAT
  PRINT AT 21,0;"Angle = ";
  angle = VAL INPUT(9)
UNTIL angle>-90 AND angle<90
PRINT angle
LET angle = angle*PI/180 : REM degrees to radians
RANDOMIZE
END PROCEDURE

PROCEDURE SetTarget
LET G=INT (RND*120+60)
LET H=INT (RND*110+35)
INK 1
CIRCLE G,H,4
END PROCEDURE

PROCEDURE DrawScreen
CLS
PRINT INVERSE 1;" CANNONBALL ";
PRINT AT 23,1;INK 6;"Pascalated BASIC Contest demo";
INK 0
PRINT PAPER 6;AT 0,15;" Enemies: ";enemies;"  "
PLOT 0,0: DRAW 0,175: PLOT 0,88: DRAW 255,0
END PROCEDURE

PROCEDURE Shot
DrawScreen
SetTarget
InputAngle
DrawShot
IF near THEN Boom
END PROCEDURE

PROCEDURE InitVariables
LET enemies = 10
RANDOMIZE
END PROCEDURE

PROCEDURE PlayGame
InitVariables
REPEAT
  Shot
UNTIL enemies = 0
GameOver
END PROCEDURE

PROGRAM CANNONBALL
REM BALA 5 - differential version
REM (c) 2023 by Zarsoft
PlayGame
' last 2 lines are going to be deleted
PRINT AT 23,0;
END PROGRAM
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)