10 REM	PINGPONG
20 REM	SPIELT EINEN BALL ZWISCHEN ZWEI SCHLAEGERN HIN UND HER, DIE
30 REM	MIT DEN JOYSTICKS A (LINKS) UND B (RECHTS) BEWEGT WERDEN KOENNEN.
40 REM
80 REM	IDEE UND PROGRAMIERUNG	A.HERRMANN	27.12.83
90 REM
91 DEF FNR1%     = FIX(RND*2)*2-1
92 DEF FNR2%(R%) = FIX(RND*2)+R%
94 DEF FNR3%     = FIX(RND*3)-1
99 REM
100 FF$=CHR$(&H0C)				:REM FORM FEED
102 CR$=CHR$(&H0D)				:REM CARRIAGE RETURN
104 ESC%=&H1B					:REM ESCAPE
110 XMIN%=0 : YMIN%=0 : XMAX%=159 : YMAX%=90	:REM SPIELFELD
111 XHALB%=(XMAX%-XMIN%)/2 : YHALB%=(YMAX%-YMIN%)/2
114 B%=2 : H%=10				:REM SCHLAEGER-BREITE UND HOEHE
120 PON%=1 : POF%=0
122 DIM BALL%(100)				:REM FORM FUER BALL
124 DIM SCHL%(50)				:REM DTO. FUER SCHLAEGER
130 ZERO%=0
140 MSEC%=0					:REM TIME DELAY IN MSEC
142 SEK%=1000					:REM 1 SEKUNDE
160 I%=0					:REM JOY PORT INPUT
190 REM
200 PRINT FF$;"PING-PONG"
202 RAD%=3
204 INPUT "Delay in msec (-1=ENDE) = ";MSEC% : IF MSEC%<0 GOTO 500
205 XM%=RAD%+1 : YM%=RAD%+1
206 XWIDTH%=2*RAD%+2 : YHEIGHT%=2*RAD%+2
207 ACNT%=0 : BCNT%=0				:REM PUNKTE-ZAEHLER
208 REM
210 CALL WINDOW(XMIN%,YMIN%,XMAX%,YMAX%)	:REM SPIELFELD PLOTTEN
212 REM CALL FRAME
214 CALL INIJOY					:REM INIT.JOYSTICKS
218 REM
220 PRINT FF$;TAB(20);ACNT%;TAB(60);BCNT%;CR$;	:REM HEAD LINE
222 X%=XHALB%-RAD% : Y%=YMAX%*RND+1		:REM ZUFAELLIGE BALL-POS.
224 XX%=X%+XWIDTH% : YY%=Y%+YHEIGHT%		:REM AUF DER MITTELLINIE
226 IF YY%>=YMAX% GOTO 222
230 CALL WINDOW(X%,Y%,XX%,YY%)			:REM BALL INIT.
232 CALL CIRCLE(XM%,YM%,RAD%,PON%)
234 CALL RDWIN(BALL%(1))
236 DX%=FNR1% : DY%=FNR1%			:REM ZUFAELLIGE ANF'RICHTUNG
237 IF DX%=0 AND DY%=0 GOTO 236
239 REM
240 XA%=XMIN%+10 : YA%=YHALB%			:REM SCHLAEGER INIT.
242 XXA%=XA%+B% : YYA%=YA%+H%
244 XB%=XMAX%-10 : YB%=YHALB%
246 XXB%=XB%+B% : YYB%=YB%+H%
250 CALL WINDOW(XA%,YA%,XXA%,YYA%)
252 CALL FRAME
254 CALL RDWIN(SCHL%(1))
260 CALL WINDOW(XB%,YB%,XXB%,YYB%)
262 CALL WRWIN(SCHL%(1))
263 CALL WAITMS(SEK%)				:REM 1 SEKUNDEN WARTEN
264 DXA%=0 : DYA%=0 				:REM BEWEGUNGSRICHTUNG
266 DXB%=0 : DYB%=0				:REM DER SCHLAEGER
270 LL%=LCNT% : L%=LL%
280 REM
300 IF INP(05)=ESC% GOTO 200			:REM ABBRUCH?
310 CALL WINDOW(X%,Y%,XX%,YY%)
312 X%=X%+DX% : Y%=Y%+DY%			:REM BALL BEWEGEN
314 XX%=X%+XWIDTH% : YY%=Y%+YHEIGHT%
320 IF X%<=XMIN% GOTO 370
321 IF XX%>=XMAX% GOTO 372
322 IF X%>XXA% OR XX%<XA% OR DX%=1 GOTO 326	:REM SCHLAEGER A GETROFFEN?
324 IF Y%+YHEIGHT%>=YA% AND Y%<=YYA% GOTO 380
326 IF XX%<XB% OR X%>XXB% OR DX%=-1 GOTO 330	:REM SCHLAEGER B GETROFFEN?
328 IF Y%+YHEIGHT%>=YB% AND Y%<=YYB% GOTO 382
330 IF Y%<=YMIN% OR YY%>=YMAX% GOTO 390
340 CALL CLWIN
342 CALL WINDOW(X%,Y%,XX%,YY%)
350 CALL WRWIN(BALL%(1))
352 CALL WAITMS(MSEC%)
354 GOSUB 600					:REM SCHLAEGER A BEWEGEN
356 GOSUB 700					:REM SCHLAEGER B BEWEGEN
360 GOTO 300
370 BCNT%=BCNT%+1 : GOTO 220
372 ACNT%=ACNT%+1 : GOTO 220
380 IF DXA%=1 THEN DX%=DX%+DX% 
381 IF DXA%=-1 AND DX%<-1 THEN DX%=DX%/2 : GOTO 384
382 IF DXB%=-1 THEN DX%=DX%+DX% 
383 IF DXB%=1 AND DX%>1 THEN DX%=DX%/2 : GOTO 384
384 DX%=-DX% : X%=X%+DX% : GOTO 330
390 DY%=-DY% : Y%=Y%+DY% : GOTO 340
400 REM
500 PRINT FF$					:REM *** ENDE ***
510 END
590 REM =======================================================================
600 CALL JOYA(I%)				:REM SCHLAEGER A BEWEGEN
610 ON I%+1 GOTO 640,621,622,623,624,640,626,640,628,629,640,640,632,640,640,640
621 DYA%=1  : DXA%=0  : GOTO 650
622 DYA%=0  : DXA%=1  : GOTO 650
623 DYA%=1  : DXA%=1  : GOTO 650
624 DYA%=-1 : DXA%=0  : GOTO 650
626 DYA%=-1 : DXA%=1  : GOTO 650
628 DYA%=0  : DXA%=-1 : GOTO 650
629 DYA%=1  : DXA%=-1 : GOTO 650
632 DYA%=-1 : DXA%=-1 : GOTO 650
640 DYA%=0  : DXA%=0  : GOTO 650
650 CALL WINDOW(XA%,YA%,XXA%,YYA%)
652 XA%=XA%+DXA% : XXA%=XA%+B%
654 YA%=YA%+DYA% : YYA%=YA%+H%
656 IF XA%<=XMIN% OR XXA%>=XHALB% GOTO 680
658 IF YA%<=YMIN% OR YYA%>=YMAX% GOTO 690
660 CALL CLWIN
662 CALL WINDOW(XA%,YA%,XXA%,YYA%)
663 REM CALL FRAME
664 CALL WRWIN(SCHL%(1))
670 RETURN
680 DXA%=-DXA% : XA%=XA%+DXA% : XXA%=XA%+B% : GOTO 658
690 DYA%=-DYA% : YA%=YA%+DYA% : YYA%=YA%+H% : GOTO 660
698 REM
700 CALL JOYB(I%)				:REM SCHLAEGER B BEWEGEN
710 ON I%+1 GOTO 740,721,722,723,724,740,726,740,728,729,740,740,732,740,740,740
721 DYB%=1  : DXB%=0  : GOTO 750
722 DYB%=0  : DXB%=1  : GOTO 750
723 DYB%=1  : DXB%=1  : GOTO 750
724 DYB%=-1 : DXB%=0  : GOTO 750
726 DYB%=-1 : DXB%=1  : GOTO 750
728 DYB%=0  : DXB%=-1 : GOTO 750
729 DYB%=1  : DXB%=-1 : GOTO 750
732 DYB%=-1 : DXB%=-1 : GOTO 750
740 DYB%=0  : DXB%=0  : GOTO 750
750 CALL WINDOW(XB%,YB%,XXB%,YYB%)
752 XB%=XB%+DXB% : XXB%=XB%+B%
754 YB%=YB%+DYB% : YYB%=YB%+H%
756 IF XB%<=XHALB% OR XXB%>=XMAX% GOTO 780
758 IF YB%<=YMIN% OR YYB%>=YMAX% GOTO 790
760 CALL CLWIN
762 CALL WINDOW(XB%,YB%,XXB%,YYB%)
763 REM CALL FRAME
764 CALL WRWIN(SCHL%(1))
770 RETURN
780 DXB%=-DXB% : XB%=XB%+DXB% : XXB%=XB%+B% : GOTO 758
790 DYB%=-DYB% : YB%=YB%+DYB% : YYB%=YB%+H% : GOTO 760
