Archived
1
0
This repository has been archived on 2025-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
powerbasic/agen.bas
2013-07-15 23:19:32 +02:00

186 lines
5.4 KiB
QBasic
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

DECLARE SUB MakePat (Zw$, ZwF%, ZwB%)
DECLARE SUB MakeANSI (offen%)
DECLARE FUNCTION InsPat$ (Zahl%)
DECLARE FUNCTION PosOK% (Up%, Max%)
DECLARE SUB MakeSITS (eingabe$, laenge%)
CONST MaxEin = 70
CONST MaxAus = 80
DIM zeile AS STRING * MaxEin
DIM SHARED Result AS STRING * MaxAus
DIM SHARED ResultF(MaxAus + 1), ResultB(MaxAus + 1) AS INTEGER
DIM minpat AS INTEGER
DIM Patlen AS INTEGER
DIM veil AS INTEGER
RANDOMIZE TIMER
CONST maxpat = 10
CONST Zeichen = "°±²Û"
CONST Zeichenk = 4
CONST FColor = 16
CONST BColor = 8
CLS
PRINT " AGEN V111.111á"
PRINT " (c) Arndt Grass"
PRINT : PRINT
INPUT "Filename"; datei$
INPUT "Wie soll die ANSI-Ausgabedatei heiáen"; ausdatei$
nustart:
OPEN datei$ FOR INPUT AS #1
veil = FREEFILE
OPEN ausdatei$ FOR OUTPUT AS veil
minpat = 5
DO
PRINT "Wie lang soll das Pattern gew„hlt werden (min."; minpat; " max."; maxpat; ")";
INPUT Patlen
LOOP UNTIL (Patlen <= maxpat) AND (Patlen >= minpat)
WHILE NOT EOF(1)
LINE INPUT #1, zeile
Result = ""
FOR i = 1 TO MaxAus
ResultF(i) = 0
ResultB(i) = 0
NEXT i
CALL MakeSITS(zeile, Patlen)
CALL MakeANSI(veil)
WEND
CLOSE
COLOR 1, 0
PRINT
PRINT " (W)iederholen oder (S)peichern und Ende?"
repeat:
ink$ = ""
WHILE ink$ = ""
ink$ = INKEY$
WEND
IF UCASE$(ink$) = "S" THEN
CLS
END
ELSEIF UCASE$(ink$) = "W" THEN
GOTO nustart
ELSE
GOTO repeat
END IF
SUB delpat (pattern$, PatPosition%, Aktuell%, change%)
FOR i = 1 TO change%
IF PatPosition% = Aktuell% THEN
pattern$ = LEFT$(pattern$, Aktuell% - 1)
Aktuell% = Aktuell% - 1
PatPosition% = PosOK%(PatPosition%, Aktuell%)
ELSE
pattern$ = LEFT$(pattern$, PatPosition% - 1) + RIGHT$(pattern$, Aktuell% - PattPosition%)
Aktuell% = Aktuell% - 1
END IF
NEXT i
END SUB
FUNCTION InsPat$ (Zahl%)
Zw$ = ""
FOR i = 1 TO Zahl%
Zw$ = Zw$ + CHR$(Start + INT(Ende * RND))
NEXT i
InsPat$ = Zw$
END FUNCTION
SUB MakeANSI (offen%)
FOR i = 1 TO LEN(Result)
p$ = CHR$(27) + "[0;"
IF ResultF(i) > 7 THEN
p$ = p$ + "1;"
ResultF(i) = ResultF(i) - 8
END IF
p$ = p$ + "3" + CHR$(48 + ResultF(i)) + ";4" + CHR$(48 + ResultB(i)) + "m" + MID$(Result, i, 1)
COLOR ResultF(i), ResultB(i)
PRINT MID$(Result, i, 1);
PRINT #offen%, p$;
NEXT
PRINT #offen%, CHR$(13);
END SUB
SUB MakePat (Zw$, ZwF%, ZwB%)
Zw$ = MID$(Zeichen, INT(Zeichenk * RND) + 1, 1)
ZwB% = INT(RND * BColor)
DO
ZwF% = INT(RND * FColor)
LOOP UNTIL ZwF% <> ZwB%
END SUB
SUB MakeSITS (eingabe$, laenge%)
DIM Vore%(20), Back(20) AS INTEGER
DIM RanDot(20) AS STRING * 1
DIM PatPos AS INTEGER
'Pattern generieren
FOR ii = 1 TO laenge%
CALL MakePat(RanDot(ii), Vore%(ii), Back(ii))
NEXT ii
Aktuell% = laenge%
level% = 0
FOR i = 1 TO Aktuell% 'Leerpattern schreiben
MID$(Result, i) = RanDot(i)
ResultF(i) = Vore%(i)
ResultB(i) = Back(i)
NEXT i
PatPos = 1 'Erste Patternposition festlegen
FOR i = 1 TO LEN(eingabe$) 'Eingabe abarbeiten
a$ = MID$(eingabe$, i, 1)
IF a$ = " " THEN neuLevel% = 0 ELSE neuLevel% = VAL(a$)
IF neuLevel% <> level% THEN
IF level% > neuLevel% THEN
change% = level% - neuLevel%
FOR j = Aktuell% TO PatPos STEP -1
RanDot(j + change%) = RanDot(j)
Vore%(j + change%) = Vore%(j)
Back(j + change%) = Back(j)
NEXT
FOR j = 0 TO change% - 1
RanDot(j + PatPos) = MID$(Zeichen, INT(Zeichenk * RND) + 1, 1)
Back(j + PatPos) = INT(RND * BColor)
DO
Vore%(j + PatPos) = INT(RND * FColor)
LOOP UNTIL Back(j + PatPos) <> Vore%(j + PatPos)
NEXT
Aktuell% = Aktuell% + change%
ELSE 'neulevel kleiner level
change% = neuLevel% - level%
FOR k = 1 TO change%
FOR j = PatPos TO Aktuell% - 1
RanDot(j) = RanDot(j + 1)
Vore%(j) = Vore%(j + 1)
Back(j) = Back(j + 1)
NEXT
Aktuell% = Aktuell% - 1
PatPos = PosOK%(PatPos, Aktuell%)
NEXT k
END IF
level% = neuLevel%
END IF
MID$(Result, i + laenge%) = RanDot(PatPos)
ResultF(i + laenge%) = Vore%(PatPos)
ResultB(i + laenge%) = Back(PatPos)
PatPos = PatPos + 1
PatPos = PosOK%(PatPos, Aktuell%)
NEXT i
END SUB
FUNCTION PosOK% (Up%, Max%)
IF Up% > Max% THEN
PosOK% = 1
ELSE
PosOK% = Up%
END IF
END FUNCTION