---------- Forwarded message ----------
Date: Thu, 15 Apr 2004 17:01:36 +0100
From: Ben A L Jemmett <[EMAIL PROTECTED]>
Reply-To: LifeRaft <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED],
[EMAIL PROTECTED]
Subject: Re: +[SurvPC] QBasic ascii Animation?
[I'm not subscribed to the PC-ASK or DOS-DISCUSS lists, only SurvPC; if this
message gets through to those lists please cc: me any comments :)]
> I found this task immpossible recently using QBasic
QBasic should actually make it easier than bog-standard BASICs; subroutines
with local variables make life a lot simpler if you wanted to do it
recursively, but you can always iterate within a FOR loop using a GOSUB
subroutine if you really want traditional BASIC.
> little did I realize that everytime PRINT is invoked it prints
> to/on a new/next line...
By default, PRINT <expression> will output the value of <expression> and a
newline. PRINT <expression>; will suppress the newline. LOCATE <row>,
<column> will move the cursor.
One solution to your problem, in QBasic, would be:
DECLARE SUB DrawRect(size%)
CONST SCRWIDTH = 80
CONST SCRHEIGHT = 25
CONST ASPECT = 3
CLS
DIM size%
FOR size% = 20 TO 4 STEP -4
DrawRect size%
NEXT
SUB DrawRect(size%)
DIM y%, xmin%, xmax%, ymin%, ymax%
IF size% < 2 THEN EXIT SUB
xmin% = (SCRWIDTH - ASPECT * size%) / 2
xmax% = xmin% + ASPECT * size% - 1
ymin% = (SCRHEIGHT - size%) / 2
ymax% = ymin% + size% - 1
LOCATE ymin%, xmin%
PRINT STRING$(ASPECT * size%, "*");
FOR y% = (ymin% + 1) TO (ymax% - 1)
LOCATE y%, xmin%
PRINT "*";
LOCATE y%, xmax%
PRINT "*";
NEXT
LOCATE ymax%, xmin%
PRINT STRING$(ASPECT * size%, "*");
END SUB
That's using QBasic's subroutines to make the code more readable than GOSUBs
and labels and so forth; since I'm mainly a C/Java programmer these days I
prefer not to use such constructs. A recursive version can be formed by
changing the three-line FOR loop to simply "DrawRect 40" and adding the line
"DrawRect size% - 4" to the end of the DrawRect routine. Add a SLEEP 1 or
similar delay before the call to make it 'animated'.
Oh, BTW, the code above has rounding errors in it; I'm used to having
fractions truncated and QBasic seems to round them off. Add INT() calls as
needed if memory serves, it's been a long time since I wrote any QuickBASIC
code in anger.
Regards,
Ben A L Jemmett.
(http://web.ukonline.co.uk/ben.jemmett/, http://www.deltasoft.com/)