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


Listing:
Code:
' PROGRAM Pong
' (c) 2023 by Zarsoft
' Written by Ze Oliveira
' 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>  ' number = VAL INPUT(12)
#include <screen.bas> ' SCREEN$ function
#include <attr.bas>   ' ATTR function

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

' CONSTant declarations
CONST Period TYPE INTEGER = 8

' VAR - Global variables
VAR ScorePlayer TYPE INTEGER = 0
VAR ScoreComputer TYPE INTEGER = 0
VAR PlayerFirst TYPE BOOLEAN = TRUE
VAR Handicap TYPE INTEGER = 14
VAR Goal TYPE BOOLEAN
VAR ComputerPos TYPE INTEGER = 15
VAR PlayerPos TYPE INTEGER = 15
VAR BallLin TYPE INTEGER = 19-1
VAR BallCol TYPE INTEGER = PlayerPos
VAR DL TYPE INTEGER = -1
VAR DC TYPE INTEGER = -1 + INT (RND*3)
VAR Clock,Clock0 TYPE INTEGER

PROCEDURE GetReady
LET Goal = FALSE
IF BallLin = 2 THEN LET ScorePlayer = ScorePlayer+1
IF BallLin = 19 THEN LET ScoreComputer = ScoreComputer+1
PRINT AT 0,7;ScoreComputer
PRINT AT 21,7;ScorePlayer
IF BallLin = 2
  LET PlayerFirst = TRUE
ELSEIF BallLin = 19
  LET PlayerFirst = FALSE
ENDIF
IF PlayerFirst
  LET BallLin = 19-1
  LET BallCol = PlayerPos
  LET DL = -1
  LET DC = -1 + INT (RND*3)
ELSE
  LET BallLin = 2+1
  LET BallCol = ComputerPos
  LET DL = 1
  LET DC = -1 + INT (RND*3)
ENDIF
PRINT AT 19,PlayerPos-2;INK 4;" \''\''\'' ";
PRINT AT 2,ComputerPos-2;INK 3;" \..\..\.. ";
PRINT AT BallLin,BallCol;"\A"
IF ScorePlayer-ScoreComputer >= 2 THEN IF Handicap < 15 THEN LET Handicap = 15
IF ScorePlayer-ScoreComputer >= 3 THEN IF Handicap < 16 THEN  LET Handicap = 16
IF ScorePlayer-ScoreComputer >= 4 THEN IF Handicap < 17 THEN  LET Handicap = 17
IF ScorePlayer-ScoreComputer >= 5 THEN IF Handicap < 18 THEN  LET Handicap = 18
IF ScorePlayer-ScoreComputer >= 6 THEN IF Handicap < 19 THEN  LET Handicap = 19
IF ScorePlayer-ScoreComputer >= 7 THEN IF Handicap < 20 THEN  LET Handicap = 20
END PROCEDURE

PROCEDURE DrawField
BORDER 0: PAPER 0: INK 7: CLS
LET Goal = FALSE
FOR N=1 TO 30: PRINT AT 1,N;"\..";AT 20,N;"\''";: NEXT N
FOR N=2 TO 19: PRINT AT N,0;"\ :";AT N,31;"\: ";: NEXT N
PRINT AT 1,0;"\ .";
PRINT AT 1,31;"\. ";
PRINT AT 20,0;"\ '";
PRINT AT 20,31;"\' ";
PRINT AT 0,25;INK 6;"PONG"
PRINT AT 0,0;"Score: ";0;
PRINT AT 21,0;"Score: ";0;
PRINT AT 19,PlayerPos-2;INK 4;" \''\''\'' ";
PRINT AT 21,11;INK 1;"Pascalated BASIC demo"
END PROCEDURE

FUNCTION GetKey$ TYPE CHAR
VAR result$ TYPE CHAR = ""
VAR key$ TYPE CHAR
VAR elapsed TYPE INTEGER
REPEAT
  key$ = INKEY$
  IF key$ = "5" OR key$ = "8" THEN LET result$ = key$
  LET Clock = PEEK 23672
  LET elapsed = Clock-Clock0: IF elapsed<0 THEN LET elapsed = elapsed+256
UNTIL elapsed >= Period
LET Clock0 = Clock0 + Period: IF Clock0>255 THEN LET Clock0 = Clock0-256
RETURN result$
END FUNCTION

PROCEDURE WaitForUser
REPEAT
  PAUSE 1
  LET k$ = INKEY$
UNTIL k$ = ""
PAUSE 0
BEEP .05,20
LET k$ = INKEY$
REM this give advantage; canceled
REM IF k$ = "5" THEN LET DC = -1
REM IF k$ = "8" THEN LET DC = 1
END PROCEDURE

'----------------- game -------------------

PROCEDURE ProcessPlayer
  LET k$ = GetKey$
  IF k$="5" THEN IF PlayerPos>3 THEN LET PlayerPos = PlayerPos-1
  IF k$="8" THEN IF PlayerPos<28 THEN LET PlayerPos = PlayerPos+1
  PRINT AT 19,PlayerPos-2;INK 4;" \''\''\'' ";
END PROCEDURE

PROCEDURE ProcessComputer
  IF BallLin < Handicap THEN LET ComputerPos = ComputerPos + SGN(BallCol-ComputerPos)
  IF ComputerPos < 3 THEN LET ComputerPos = 3
  IF ComputerPos > 28 THEN LET ComputerPos = 28
  PRINT AT 2,ComputerPos-2;INK 3;" \..\..\.. ";
END PROCEDURE

PROCEDURE ProcessBall
  PRINT AT BallLin,BallCol;INK 6;" "
  LET BallCol = BallCol + DC
  LET BallLin = BallLin + DL
  PRINT AT BallLin,BallCol;INK 6;"\A"
  IF BallCol = 1 OR BallCol = 30 THEN LET DC = -DC: BEEP .05,10
END PROCEDURE

PROCEDURE TestGameStatus
  IF BallLin = 2 OR BallLin = 19 THEN LET Goal = TRUE: BEEP .1,0
  IF BallLin = 3 THEN IF ABS(BallCol-ComputerPos)<=1 THEN LET DL = -DL: LET DC = SGN(RND*10-5): BEEP .05,20
  IF BallLin = 18 THEN IF ABS(BallCol-PlayerPos)<=1 THEN LET DL = -DL: BEEP .05,20
END PROCEDURE

'----------------- end game -------------------

PROCEDURE InitVariables
POKE 23609,50
LET Goal = FALSE
LET ComputerPos = 15
LET PlayerPos = 15
LET BallLin = 19-1
LET BallCol = PlayerPos
LET DL = -1
LET DC = -1 + INT (RND*3)
END PROCEDURE

PROCEDURE InitGraphics
REM \A
POKE USR "A"+0,BIN 00111100
POKE USR "A"+1,BIN 01111110
POKE USR "A"+2,BIN 11111111
POKE USR "A"+3,BIN 11111111
POKE USR "A"+4,BIN 11111111
POKE USR "A"+5,BIN 11111111
POKE USR "A"+6,BIN 01111110
POKE USR "A"+7,BIN 00111100
END PROCEDURE

PROCEDURE Game
LET Clock0 = PEEK 23672
REPEAT
  ProcessPlayer
  ProcessComputer
  ProcessBall
  TestGameStatus
UNTIL Goal
END PROCEDURE

PROCEDURE MainRoutine
InitGraphics
InitVariables
DrawField
REPEAT
  GetReady
  IF PlayerFirst THEN WaitForUser
  Game
UNTIL FALSE
END PROCEDURE

PROGRAM Pong
MainRoutine
' last 2 lines are going to be deleted
PRINT AT 23,0;
END PROGRAM
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)