From e6e42dde64af3d9f114ba76c69210800c3db71d4 Mon Sep 17 00:00:00 2001 From: Alex Gomez Date: Mon, 24 Jan 2022 18:19:36 -0600 Subject: [PATCH 1/6] Initial commit --- 00_Utilities/bas2perl.pl | 329 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100755 00_Utilities/bas2perl.pl diff --git a/00_Utilities/bas2perl.pl b/00_Utilities/bas2perl.pl new file mode 100755 index 00000000..2df1b5dc --- /dev/null +++ b/00_Utilities/bas2perl.pl @@ -0,0 +1,329 @@ +#!/usr/bin/perl +use strict; + + +my $Mode= lc($ARGV[0]); #trace #convert +my $File= $ARGV[1]; +my $LN= "Line"; + +my %Vars; +my @Data; +my %Code; +open(FH, $File); +while (my $Line = ) { + chomp $Line; + my $Space= index($Line, " "); + my $Key= substr($Line, 0, $Space); + my $Code= substr($Line, $Space+1); + $Code{$Key}=$Code; + } +close(FH); + + +foreach my $Lin (sort {$a<=>$b} keys %Code) { + if ($Mode eq "trace") { print "==> $Lin $Code{$Lin}\n"; } + my $Ret= &PROCLINE($Code{$Lin}); + if ($Mode eq "trace") { print " $Ret\n"; } + $Code{$Lin}= $Ret; + } + + +if ($Mode eq "convert") { + $Code{'0.1'}= "#!/usr/bin/perl"; + $Code{'0.2'}= "#use strict;"; + $Code{'0.3'}= "# Automatic converted by bas2perl.pl"; + $Code{'0.4'}= ""; + foreach my $Lin (sort {$a<=>$b} keys %Code) { + print "$Code{$Lin}\n"; + } + } + + if (@Data) { &DATAIL(); } + print "\n\n\n"; + + +exit; + + + +#print @Lines; + +sub PROCLINE { + my ($Line)= @_; + #my @Sente= split(/:/, $Line); + #my @Sente= split(/\:(?=([^"]*"[^"]*")*[^"]*$)/g, $Line); + my @Sente= split(/:(?=(?:[^"]*"[^"]*")*[^"]*$)/g, $Line); + + my $Perl; + foreach my $Sen (@Sente) { + #if ($Sen eq "") { next; } # Somehow the regex gives empty items between. + my $Flag=0; + $Sen= &TRIM($Sen); + if ($Sen>0) { $Sen= "GOTO $Sen"; } #The birth of spaguetti code! + if ($Sen=~ /^DATA\b/) { $Sen= &DATA($Sen); $Flag=1; } + if ($Sen=~ /^DIM\b/) { $Sen= &DIM($Sen); $Flag=1; } + if ($Sen=~ /^END\b/) { $Sen= &ENDD($Sen); $Flag=1; } + if ($Sen=~ /^FOR\b/) { $Sen= &FOR($Sen); $Flag=1; } + if ($Sen=~ /^GOTO\b/) { $Sen= &GOTO($Sen); $Flag=1; } + if ($Sen=~ /^GOSUB\b/) { $Sen= &GOSUB($Sen); $Flag=1; } + if ($Sen=~ /^IF\b/) { $Sen= &IF($Sen); $Flag=1; } + if ($Sen=~ /^INPUT\b/) { $Sen= &INPUT($Sen); $Flag=1; } + if ($Sen=~ /^NEXT\b/) { $Sen= &NEXT($Sen); $Flag=1; } + if ($Sen=~ /^ON\b/ && $Sen=~ / GOTO /) { $Sen= &ONGOTO($Sen); $Flag=1; } + if ($Sen=~ /^PRINT\b/) { $Sen= &PRINT($Sen); $Flag=1; } + if ($Sen=~ /^READ\b/) { $Sen= &READ($Sen); $Flag=1; } + if ($Sen=~ /^REM\b/) { $Sen= &REM($Sen); $Flag=1; } + if ($Sen=~ /^RETURN\b/) { $Sen= &RETURN($Sen); $Flag=1; } + if ($Sen=~ /^STOP\b/) { $Sen= &ENDD($Sen); $Flag=1; } + if ($Flag==0) { $Sen= &FORMULA($Sen); } + $Sen.=";"; + $Sen=~ s/\{;$/\{/g; + $Sen=~ s/\};$/\}/g; + $Perl.= "$Sen "; + } + $Perl= &TRIM($Perl); + return $Perl; + } + + + +#################### +# BASIC STATEMENTS # +#################### + +sub DATA { + my ($Str)= @_; + $Str=~ s/DATA //; + push @Data, $Str; + return "# TO DATA SEGMENT"; + } + +sub DIM { + my ($Str)= @_; + $Str=~ s/DIM //; + my @Parts= split(/\,(?![^\(]*\))/, $Str); + my $Out; + foreach my $Par (@Parts) { + $Par=~ s/\$//; + $Par=~ s/\(.*\)//; + $Out.= "my \@$Par; "; + $Vars{$Par}= "array"; + } + chop $Out; + chop $Out; + return $Out; + } + + +sub ENDD { + return "exit"; + } + + +sub FOR { + my ($Str)= @_; + $Str=~ s/= /=/g; + my @Parts= split(" ", $Str); + $Parts[1]= &FORMULA($Parts[1]); + my $Var=substr($Parts[1],0,index($Parts[1],"=")); + $Parts[3]= "$Var<=".&FORMULA($Parts[3]); + if ($Parts[5]<0) { $Parts[3]=~ s//; } + $Parts[5]= $Parts[5] eq "" ? "$Var++" : "$Var+=".&FORMULA($Parts[5]); + $Str= "for ($Parts[1]; $Parts[3]; $Parts[5]) {"; + return $Str; + } + + +sub GOTO { + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Label= "$LN$Parts[1]"; + $Str= lc($Parts[0])." $Label"; + $Code{($Parts[1]-.2)}=""; + $Code{($Parts[1]-.1)}="$Label:"; + return $Str; + } + + +sub GOSUB { + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Label= "$LN$Parts[1]"; + $Str= "\&$Label()"; + $Code{($Parts[1]-.2)}=""; + $Code{($Parts[1]-.1)}="sub $Label {"; + return $Str; + } + + +sub IF { + my ($Str)= @_; + $Str=~ s/^IF //g; + my @Parts= split(" THEN ", $Str); + $Parts[0]= &FORMULA($Parts[0], 1); + $Parts[1]= &PROCLINE($Parts[1]); + my $Str= "if ($Parts[0]) { $Parts[1] }"; + return $Str; + } + + +sub INPUT { + my ($Str)= @_; + $Str=~ s/INPUT //; + $Str=~ s/(".*")//g; + my $Ques; + if ($1) { + $Ques= $1; + $Ques=~ s/"//g; + } + + $Str=~ s/\$//g; + $Str=~ s/;//g; + $Str=~ s/\(/\[/g; + $Str=~ s/\)/\]/g; + my $Inp; + if ($Str=~ /,/) { + $Str= "\$$Str"; + $Str=~ s/,/,\$/g; + $Inp= "; ($Str)= split(/,/, \$Inp)"; + $Str= "Inp"; + } + $Str= "print \"$Ques? \"; chomp(\$$Str = uc())"; + return $Str.$Inp; + } + + +sub NEXT { + return "}"; + } + + +sub ONGOTO { + # Base 1, if not match it will be skipped. + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Var= $Parts[1]; + my @Lines= split(",", $Parts[3]); + my $Count=0; + my $Text; + foreach my $Lin (@Lines) { + $Count++; + my $This= "\telsif (\$$Var==$Count) "; + if ($Count==1) { $This= "if (\$$Var==1) "; } + + my $Goto= &GOTO("GOTO $Lin"); + $This.="{ $Goto; }\n"; + $Text.= $This; + } + return $Text; + } + + +sub PRINT { + my ($Str)= @_; + if ($Str eq "PRINT") { return 'print "\n"' }; + $Str=~ s/^PRINT //; + + my $Enter= 1; + if ($Str=~ /;$/) { $Enter= 0; } + + my $Out; + #my @Parts= split(/;/, $Str); + my @Parts= split(/;(?=(?;[^"]*"[^"]*")*[^"]*$)/g, $Str); + + foreach my $Par (@Parts) { + if ($Par=~ / TAB\((.*?)\);/) { + my $Num= &FORMULA($1); + $Par=~ s/ TAB\(.*\);/' 'x$Num . /; + } + if ($Par=~ /^[A-Z]/) { + $Par= &FIXVAR($Par); + } + $Out.= $Par.". "; + } + chop $Out; + chop $Out; + #$Str=~ s/"$/\\n"/; + #$Str=~ s/;$//; + #$Str=~ s/;/\./g; + #$Str=~ s/"$/\\n"/g; + #$Str=~ s/\.$//g; + if ($Enter) { $Out.= qq|. "\\n"|; } + return "print ".$Out; + } + + +sub READ { + my ($Str)= @_; + $Str=~ s/READ //; + $Str.="= "; + return $Str; + } + + +sub REM { + my ($Str)= @_; + return "#".$Str; + } + + +sub RETURN { + return "return; }"; + } + + +########### +# HELPERS # +########### + +sub TRIM { + my ($Str)= @_; + #$Str=~ s/\s+/ /g; + $Str=~ s/^\s+//; + $Str=~ s/\s+$//; + return $Str; + } + + +sub DATAIL { + print "\n\n\n"; + print "__DATA__\n"; + foreach my $Dat (@Data) { + $Dat=~ s/"//g; + $Dat=~ s/,/\n/g; + print "$Dat\n"; + } + } + + +sub FORMULA { + my ($Str, $Cond)= @_; + $Str=~ s/\$//g; + $Str=~ s/ABS\(/abs\(/; + $Str=~ s/COS\(/cos\(/; + $Str=~ s/LEN\(/length\(/; + $Str=~ s/INT\(/int\(/; + $Str=~ s/MID\$?\(/substr\(/; + $Str=~ s/RND\(/rand\(/; + $Str=~ s/SIN\(/sin\(/; + $Str=~ s/(\b[A-Z][0-9]?\b)/\$$&/g; + if ($Cond==1) { + $Str=~ s/<>/ ne /g; + $Str=~ s/=/ eq /g; + } + return $Str; + } + + +sub FIXVAR { + my ($Str)= @_; + $Str=~ s/\$//g; + $Str=~ s/(\w+)/\$$1/g; + $Str=~ s/\(/\[/g; + $Str=~ s/\)/\]/g; + $Str=~ s/,/\]\[/g; + return $Str; + } + + + From 6738ef25e1bbdf4d4edd49da138e025b67368208 Mon Sep 17 00:00:00 2001 From: Alex Gomez Date: Wed, 26 Jan 2022 18:44:56 -0600 Subject: [PATCH 2/6] Automatic converted with bas2perl.pl --- 69_Pizza/perl/pizza.pl | 113 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100755 69_Pizza/perl/pizza.pl diff --git a/69_Pizza/perl/pizza.pl b/69_Pizza/perl/pizza.pl new file mode 100755 index 00000000..7147ad49 --- /dev/null +++ b/69_Pizza/perl/pizza.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl +#use strict; +# Automatic converted by bas2perl.pl + +print ' 'x33 . "PIZZA". "\n"; +print ' 'x15 . "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY". "\n"; +print "\n"; print "\n"; print "\n"; +my @S; my @M; +print "PIZZA DELIVERY GAME". "\n"; print "\n"; +print "WHAT IS YOUR FIRST NAME? "; chomp($N = uc()); print "\n"; +print "HI, ". $N. ". IN THIS GAME YOU ARE TO TAKE ORDERS". "\n"; +print "FOR PIZZAS. THEN YOU ARE TO TELL A DELIVERY BOY". "\n"; +print "WHERE TO DELIVER THE ORDERED PIZZAS.". "\n"; print "\n"; print "\n"; +for ($I=1; $I<=16; $I++) { +$S[$I]= ; chomp($S[$I]);; +} +for ($I=1; $I<=4; $I++) { +$M[$I]= ; chomp($M[$I]);; +} +# TO DATA SEGMENT; +# TO DATA SEGMENT; +print "MAP OF THE CITY OF HYATTSVILLE". "\n"; print "\n"; +print " -----1-----2-----3-----4-----". "\n"; +$K=4; +for ($I=1; $I<=4; $I++) { +print "-". "\n"; print "-". "\n"; print "-". "\n"; print "-". "\n"; +print $M[$K]; +$S1=16-4*$I+1; +print " ". $S[$S1]. " ". $S[$S1+1]. " ". $S[$S1+2]. " "; +print $S[$S1+3]. " ". $M[$K]. "\n"; +$K=$K-1; +} +print "-". "\n"; print "-". "\n"; print "-". "\n"; print "-". "\n"; +print " -----1-----2-----3-----4-----". "\n"; print "\n"; +print "THE OUTPUT IS A MAP OF THE HOMES WHERE". "\n"; +print "YOU ARE TO SEND PIZZAS.". "\n"; print "\n"; +print "YOUR JOB IS TO GIVE A TRUCK DRIVER". "\n"; +print "THE LOCATION OR COORDINATES OF THE". "\n"; +print "HOME ORDERING THE PIZZA.". "\n"; print "\n"; + +Line520: +print "DO YOU NEED MORE DIRECTIONS? "; chomp($A = uc()); +if ($A eq "YES") { goto Line590; } +if ($A eq "NO") { goto Line750; } +print "'YES' OR 'NO' PLEASE, NOW THEN,". "\n"; goto Line520; + +Line590: +print "\n"; print "SOMEBODY WILL ASK FOR A PIZZA TO BE". "\n"; +print "DELIVERED. THEN A DELIVERY BOY WILL". "\n"; +print "ASK YOU FOR THE LOCATION.". "\n"; print " EXAMPLE:". "\n"; +print "THIS IS J. PLEASE SEND A PIZZA.". "\n"; +print "DRIVER TO ". $N. ". WHERE DOES J LIVE?". "\n"; +print "YOUR ANSWER WOULD BE 2,3". "\n"; print "\n"; +print "UNDERSTAND? "; chomp($A = uc()); +if ($A eq "YES") { goto Line690; } +print "THIS JOB IS DEFINITELY TOO DIFFICULT FOR YOU. THANKS ANYWAY". "\n"; +goto Line999; + +Line690: +print "GOOD. YOU ARE NOW READY TO START TAKING ORDERS.". "\n"; print "\n"; +print "GOOD LUCK!!". "\n"; print "\n"; + +Line750: +for ($I=1; $I<=5; $I++) { +$S=int(rand(1)*16+1); print "\n"; +print "HELLO ". $N. "'S PIZZA. THIS IS ". $S[$S]. "."; +print " PLEASE SEND A PIZZA.". "\n"; + +Line780: +print " DRIVER TO ". $N. ": WHERE DOES ". $S[$S]. " LIVE"; +print "? "; chomp($Inp_ = uc()); ($A[1],$A[2])= split(/,/, $Inp_); +$T=$A[1]+($A[2]-1)*4; +if ($T eq $S) { goto Line920; } +print "THIS IS ". $S[$T]. ". I DID NOT ORDER A PIZZA.". "\n"; +print "I LIVE AT ". $A[1]. ",". $A[2]. "\n"; +goto Line780; + +Line920: +print "HELLO ". $N. ". THIS IS ". $S[$S]. ", THANKS FOR THE PIZZA.". "\n"; +} +print "\n"; print "DO YOU WANT TO DELIVER MORE PIZZAS? "; chomp($A = uc()); +if ($A eq "YES") { goto Line750; } +print "\n"; print "O.K. ". $N. ", SEE YOU LATER!". "\n"; print "\n"; + +Line999: +exit; + + + +__DATA__ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +1 +2 +3 +4 + + + From 24a9655b24af86c6d70d9b4db016cc59c33820b6 Mon Sep 17 00:00:00 2001 From: Alex Gomez Date: Wed, 26 Jan 2022 18:48:28 -0600 Subject: [PATCH 3/6] Simple tool to convert BASIC file to Perl code. --- 00_Utilities/bas2perl.pl | 330 +-------------------------------------- 1 file changed, 1 insertion(+), 329 deletions(-) mode change 100755 => 120000 00_Utilities/bas2perl.pl diff --git a/00_Utilities/bas2perl.pl b/00_Utilities/bas2perl.pl deleted file mode 100755 index 2df1b5dc..00000000 --- a/00_Utilities/bas2perl.pl +++ /dev/null @@ -1,329 +0,0 @@ -#!/usr/bin/perl -use strict; - - -my $Mode= lc($ARGV[0]); #trace #convert -my $File= $ARGV[1]; -my $LN= "Line"; - -my %Vars; -my @Data; -my %Code; -open(FH, $File); -while (my $Line = ) { - chomp $Line; - my $Space= index($Line, " "); - my $Key= substr($Line, 0, $Space); - my $Code= substr($Line, $Space+1); - $Code{$Key}=$Code; - } -close(FH); - - -foreach my $Lin (sort {$a<=>$b} keys %Code) { - if ($Mode eq "trace") { print "==> $Lin $Code{$Lin}\n"; } - my $Ret= &PROCLINE($Code{$Lin}); - if ($Mode eq "trace") { print " $Ret\n"; } - $Code{$Lin}= $Ret; - } - - -if ($Mode eq "convert") { - $Code{'0.1'}= "#!/usr/bin/perl"; - $Code{'0.2'}= "#use strict;"; - $Code{'0.3'}= "# Automatic converted by bas2perl.pl"; - $Code{'0.4'}= ""; - foreach my $Lin (sort {$a<=>$b} keys %Code) { - print "$Code{$Lin}\n"; - } - } - - if (@Data) { &DATAIL(); } - print "\n\n\n"; - - -exit; - - - -#print @Lines; - -sub PROCLINE { - my ($Line)= @_; - #my @Sente= split(/:/, $Line); - #my @Sente= split(/\:(?=([^"]*"[^"]*")*[^"]*$)/g, $Line); - my @Sente= split(/:(?=(?:[^"]*"[^"]*")*[^"]*$)/g, $Line); - - my $Perl; - foreach my $Sen (@Sente) { - #if ($Sen eq "") { next; } # Somehow the regex gives empty items between. - my $Flag=0; - $Sen= &TRIM($Sen); - if ($Sen>0) { $Sen= "GOTO $Sen"; } #The birth of spaguetti code! - if ($Sen=~ /^DATA\b/) { $Sen= &DATA($Sen); $Flag=1; } - if ($Sen=~ /^DIM\b/) { $Sen= &DIM($Sen); $Flag=1; } - if ($Sen=~ /^END\b/) { $Sen= &ENDD($Sen); $Flag=1; } - if ($Sen=~ /^FOR\b/) { $Sen= &FOR($Sen); $Flag=1; } - if ($Sen=~ /^GOTO\b/) { $Sen= &GOTO($Sen); $Flag=1; } - if ($Sen=~ /^GOSUB\b/) { $Sen= &GOSUB($Sen); $Flag=1; } - if ($Sen=~ /^IF\b/) { $Sen= &IF($Sen); $Flag=1; } - if ($Sen=~ /^INPUT\b/) { $Sen= &INPUT($Sen); $Flag=1; } - if ($Sen=~ /^NEXT\b/) { $Sen= &NEXT($Sen); $Flag=1; } - if ($Sen=~ /^ON\b/ && $Sen=~ / GOTO /) { $Sen= &ONGOTO($Sen); $Flag=1; } - if ($Sen=~ /^PRINT\b/) { $Sen= &PRINT($Sen); $Flag=1; } - if ($Sen=~ /^READ\b/) { $Sen= &READ($Sen); $Flag=1; } - if ($Sen=~ /^REM\b/) { $Sen= &REM($Sen); $Flag=1; } - if ($Sen=~ /^RETURN\b/) { $Sen= &RETURN($Sen); $Flag=1; } - if ($Sen=~ /^STOP\b/) { $Sen= &ENDD($Sen); $Flag=1; } - if ($Flag==0) { $Sen= &FORMULA($Sen); } - $Sen.=";"; - $Sen=~ s/\{;$/\{/g; - $Sen=~ s/\};$/\}/g; - $Perl.= "$Sen "; - } - $Perl= &TRIM($Perl); - return $Perl; - } - - - -#################### -# BASIC STATEMENTS # -#################### - -sub DATA { - my ($Str)= @_; - $Str=~ s/DATA //; - push @Data, $Str; - return "# TO DATA SEGMENT"; - } - -sub DIM { - my ($Str)= @_; - $Str=~ s/DIM //; - my @Parts= split(/\,(?![^\(]*\))/, $Str); - my $Out; - foreach my $Par (@Parts) { - $Par=~ s/\$//; - $Par=~ s/\(.*\)//; - $Out.= "my \@$Par; "; - $Vars{$Par}= "array"; - } - chop $Out; - chop $Out; - return $Out; - } - - -sub ENDD { - return "exit"; - } - - -sub FOR { - my ($Str)= @_; - $Str=~ s/= /=/g; - my @Parts= split(" ", $Str); - $Parts[1]= &FORMULA($Parts[1]); - my $Var=substr($Parts[1],0,index($Parts[1],"=")); - $Parts[3]= "$Var<=".&FORMULA($Parts[3]); - if ($Parts[5]<0) { $Parts[3]=~ s//; } - $Parts[5]= $Parts[5] eq "" ? "$Var++" : "$Var+=".&FORMULA($Parts[5]); - $Str= "for ($Parts[1]; $Parts[3]; $Parts[5]) {"; - return $Str; - } - - -sub GOTO { - my ($Str)= @_; - my @Parts= split(" ", $Str); - my $Label= "$LN$Parts[1]"; - $Str= lc($Parts[0])." $Label"; - $Code{($Parts[1]-.2)}=""; - $Code{($Parts[1]-.1)}="$Label:"; - return $Str; - } - - -sub GOSUB { - my ($Str)= @_; - my @Parts= split(" ", $Str); - my $Label= "$LN$Parts[1]"; - $Str= "\&$Label()"; - $Code{($Parts[1]-.2)}=""; - $Code{($Parts[1]-.1)}="sub $Label {"; - return $Str; - } - - -sub IF { - my ($Str)= @_; - $Str=~ s/^IF //g; - my @Parts= split(" THEN ", $Str); - $Parts[0]= &FORMULA($Parts[0], 1); - $Parts[1]= &PROCLINE($Parts[1]); - my $Str= "if ($Parts[0]) { $Parts[1] }"; - return $Str; - } - - -sub INPUT { - my ($Str)= @_; - $Str=~ s/INPUT //; - $Str=~ s/(".*")//g; - my $Ques; - if ($1) { - $Ques= $1; - $Ques=~ s/"//g; - } - - $Str=~ s/\$//g; - $Str=~ s/;//g; - $Str=~ s/\(/\[/g; - $Str=~ s/\)/\]/g; - my $Inp; - if ($Str=~ /,/) { - $Str= "\$$Str"; - $Str=~ s/,/,\$/g; - $Inp= "; ($Str)= split(/,/, \$Inp)"; - $Str= "Inp"; - } - $Str= "print \"$Ques? \"; chomp(\$$Str = uc())"; - return $Str.$Inp; - } - - -sub NEXT { - return "}"; - } - - -sub ONGOTO { - # Base 1, if not match it will be skipped. - my ($Str)= @_; - my @Parts= split(" ", $Str); - my $Var= $Parts[1]; - my @Lines= split(",", $Parts[3]); - my $Count=0; - my $Text; - foreach my $Lin (@Lines) { - $Count++; - my $This= "\telsif (\$$Var==$Count) "; - if ($Count==1) { $This= "if (\$$Var==1) "; } - - my $Goto= &GOTO("GOTO $Lin"); - $This.="{ $Goto; }\n"; - $Text.= $This; - } - return $Text; - } - - -sub PRINT { - my ($Str)= @_; - if ($Str eq "PRINT") { return 'print "\n"' }; - $Str=~ s/^PRINT //; - - my $Enter= 1; - if ($Str=~ /;$/) { $Enter= 0; } - - my $Out; - #my @Parts= split(/;/, $Str); - my @Parts= split(/;(?=(?;[^"]*"[^"]*")*[^"]*$)/g, $Str); - - foreach my $Par (@Parts) { - if ($Par=~ / TAB\((.*?)\);/) { - my $Num= &FORMULA($1); - $Par=~ s/ TAB\(.*\);/' 'x$Num . /; - } - if ($Par=~ /^[A-Z]/) { - $Par= &FIXVAR($Par); - } - $Out.= $Par.". "; - } - chop $Out; - chop $Out; - #$Str=~ s/"$/\\n"/; - #$Str=~ s/;$//; - #$Str=~ s/;/\./g; - #$Str=~ s/"$/\\n"/g; - #$Str=~ s/\.$//g; - if ($Enter) { $Out.= qq|. "\\n"|; } - return "print ".$Out; - } - - -sub READ { - my ($Str)= @_; - $Str=~ s/READ //; - $Str.="= "; - return $Str; - } - - -sub REM { - my ($Str)= @_; - return "#".$Str; - } - - -sub RETURN { - return "return; }"; - } - - -########### -# HELPERS # -########### - -sub TRIM { - my ($Str)= @_; - #$Str=~ s/\s+/ /g; - $Str=~ s/^\s+//; - $Str=~ s/\s+$//; - return $Str; - } - - -sub DATAIL { - print "\n\n\n"; - print "__DATA__\n"; - foreach my $Dat (@Data) { - $Dat=~ s/"//g; - $Dat=~ s/,/\n/g; - print "$Dat\n"; - } - } - - -sub FORMULA { - my ($Str, $Cond)= @_; - $Str=~ s/\$//g; - $Str=~ s/ABS\(/abs\(/; - $Str=~ s/COS\(/cos\(/; - $Str=~ s/LEN\(/length\(/; - $Str=~ s/INT\(/int\(/; - $Str=~ s/MID\$?\(/substr\(/; - $Str=~ s/RND\(/rand\(/; - $Str=~ s/SIN\(/sin\(/; - $Str=~ s/(\b[A-Z][0-9]?\b)/\$$&/g; - if ($Cond==1) { - $Str=~ s/<>/ ne /g; - $Str=~ s/=/ eq /g; - } - return $Str; - } - - -sub FIXVAR { - my ($Str)= @_; - $Str=~ s/\$//g; - $Str=~ s/(\w+)/\$$1/g; - $Str=~ s/\(/\[/g; - $Str=~ s/\)/\]/g; - $Str=~ s/,/\]\[/g; - return $Str; - } - - - diff --git a/00_Utilities/bas2perl.pl b/00_Utilities/bas2perl.pl new file mode 120000 index 00000000..5f21f3db --- /dev/null +++ b/00_Utilities/bas2perl.pl @@ -0,0 +1 @@ +/home/nezumi/bin/bas2perl.pl \ No newline at end of file From 069c00bc47bd59256b9e7220356f629f0609db8c Mon Sep 17 00:00:00 2001 From: Alex Gomez Date: Thu, 27 Jan 2022 12:25:38 -0600 Subject: [PATCH 4/6] The real file. --- 00_Utilities/bas2perl.pl | 381 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 380 insertions(+), 1 deletion(-) mode change 120000 => 100755 00_Utilities/bas2perl.pl diff --git a/00_Utilities/bas2perl.pl b/00_Utilities/bas2perl.pl deleted file mode 120000 index 5f21f3db..00000000 --- a/00_Utilities/bas2perl.pl +++ /dev/null @@ -1 +0,0 @@ -/home/nezumi/bin/bas2perl.pl \ No newline at end of file diff --git a/00_Utilities/bas2perl.pl b/00_Utilities/bas2perl.pl new file mode 100755 index 00000000..791d1b34 --- /dev/null +++ b/00_Utilities/bas2perl.pl @@ -0,0 +1,380 @@ +#!/usr/bin/perl +use strict; + + +my $Mode= lc($ARGV[0]); #trace #convert +my $File= $ARGV[1]; +my $LN= "Line"; +my $Pedantic= 0; +my $Indent= 0; + +my %Vars; # num | str | anm | ast +my @Data; +my %Code; +open(FH, $File); +while (my $Line = ) { + chomp $Line; + my $Space= index($Line, " "); + my $Key= substr($Line, 0, $Space); + my $Code= substr($Line, $Space+1); + $Code{$Key}=$Code; + } +close(FH); + + +foreach my $Lin (sort {$a<=>$b} keys %Code) { + if ($Mode eq "trace") { print "==> $Lin $Code{$Lin}\n"; } + my $Ret= &PROCLINE($Code{$Lin}); + if ($Mode eq "trace") { print " $Ret\n"; } + $Code{$Lin}= $Ret; + } + + +if ($Mode eq "convert") { + $Code{'0.1'}= "#!/usr/bin/perl"; + $Code{'0.2'}= "#use strict;"; + $Code{'0.3'}= "# Automatic converted by bas2perl.pl"; + $Code{'0.4'}= ""; + foreach my $Lin (sort {$a<=>$b} keys %Code) { + print "$Code{$Lin}\n"; + } + } + + if (@Data) { &DATAIL(); } + print "\n\n\n"; + + +exit; + + +sub PROCLINE { + my ($Line)= @_; + my @Sente= &SMARPLIT($Line, ":", "\""); + + my $Perl; + foreach my $Sen (@Sente) { + my $Flag=0; + if ($Pedantic==0) { + #REM: Resolves some ugly syntaxis... + $Sen=~ s/\bPRINT"/PRINT "/g; # PRINT"Hello" + $Sen=~ s/"([A-Z])\$/"; $1\$/g; # PRINT "Hello "N$ + } + $Sen= &TRIM($Sen); + if ($Sen>0) { $Sen= "GOTO $Sen"; } + if ($Sen=~ /^DATA\b/) { $Sen= &DATA($Sen); $Flag=1; } + if ($Sen=~ /^DIM\b/) { $Sen= &DIM($Sen); $Flag=1; } + if ($Sen=~ /^END\b/) { $Sen= &ENDD($Sen); $Flag=1; } + if ($Sen=~ /^FOR\b/) { $Sen= &FOR($Sen); $Flag=1; } + if ($Sen=~ /^GOTO\b/) { $Sen= &GOTO($Sen); $Flag=1; } + if ($Sen=~ /^GOSUB\b/) { $Sen= &GOSUB($Sen); $Flag=1; } + if ($Sen=~ /^IF\b/) { $Sen= &IF($Sen); $Flag=1; } + if ($Sen=~ /^INPUT\b/) { $Sen= &INPUT($Sen); $Flag=1; } + if ($Sen=~ /^NEXT\b/) { $Sen= &NEXT($Sen); $Flag=1; } + if ($Sen=~ /^ON\b/ && $Sen=~ / GOTO /) { $Sen= &ONGOTO($Sen); $Flag=1; } + if ($Sen=~ /^PRINT\b/) { $Sen= &PRINT($Sen); $Flag=1; } + if ($Sen=~ /^READ\b/) { $Sen= &READ($Sen); $Flag=1; } + if ($Sen=~ /^REM\b/) { $Sen= &REM($Sen); $Flag=1; } + if ($Sen=~ /^RETURN\b/) { $Sen= &RETURN($Sen); $Flag=1; } + if ($Sen=~ /^STOP\b/) { $Sen= &ENDD($Sen); $Flag=1; } + if ($Flag==0) { $Sen= &FORMULA($Sen); } # LET + $Sen.=";"; + $Sen=~ s/\{;$/\{/g; + $Sen=~ s/\};$/\}/g; + $Perl.= "$Sen "; + } + $Perl= &TRIM($Perl); + my $Adj= 0; + if ($Perl=~ /^for\b/) { $Adj--; } + if ($Perl eq "}") { $Adj++; } + $Perl= "\t"x ($Indent+$Adj) . $Perl; + return $Perl; + } + + + +#################### +# BASIC STATEMENTS # +#################### + +sub DATA { + my ($Str)= @_; + $Str=~ s/DATA //; + push @Data, $Str; + return "# TO DATA SEGMENT"; + } + + +sub DIM { + my ($Str)= @_; + $Str=~ s/DIM //; + my @Parts= split(/\,(?![^\(]*\))/, $Str); + my $Out; + foreach my $Par (@Parts) { + my $Type= $Par=~ /\$/ ? "ast" : "anm"; + $Par=~ s/\$//g; + $Par=~ s/\(.*\)//; + $Vars{$Par}= "anm"; + $Out.= "my \@$Par; "; + } + chop $Out; + chop $Out; + return $Out; + } + + +sub ENDD { + return "exit"; + } + + +sub FOR { + my ($Str)= @_; + $Str=~ s/= /=/g; + my @Parts= split(" ", $Str); + $Parts[1]= &FORMULA($Parts[1]); + my $Var=substr($Parts[1],0,index($Parts[1],"=")); + $Parts[3]= "$Var<=".&FORMULA($Parts[3]); + if ($Parts[5]<0) { $Parts[3]=~ s//; } + $Parts[5]= $Parts[5] eq "" ? "$Var++" : "$Var+=".&FORMULA($Parts[5]); + $Str= "for ($Parts[1]; $Parts[3]; $Parts[5]) {"; + $Indent++; + return $Str; + } + + +sub GOTO { + # The birth of spaguetti code! + # Dijkstra would not like this... + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Label= "$LN$Parts[1]"; + $Str= lc($Parts[0])." $Label"; + $Code{($Parts[1]-.2)}=""; + $Code{($Parts[1]-.1)}="$Label:"; + return $Str; + } + + +sub GOSUB { + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Label= "$LN$Parts[1]"; + $Str= "\&$Label()"; + $Code{($Parts[1]-.2)}=""; + $Code{($Parts[1]-.1)}="sub $Label {"; + return $Str; + } + + +sub IF { + my ($Str)= @_; + $Str=~ s/^IF //g; + my @Parts= split(" THEN ", $Str); + $Parts[0]= &FORMULA($Parts[0], 1); + $Parts[1]= &PROCLINE($Parts[1]); + my $Str= "if ($Parts[0]) { $Parts[1] }"; + return $Str; + } + + +sub INPUT { + my ($Str)= @_; + $Str=~ s/INPUT //; + $Str=~ s/"(.*)"//g; + + my $Txt= qq|print "$1\? "; |; + + my @Parts= split(/,/, $Str); + my @Multi; + foreach my $Par (@Parts) { + my $Type= "num"; + if ($Par=~ /\$/) { + $Type= "str"; + $Par=~ s/\$//g; + } + if ($Par=~ /\(/) { + if ($Type eq "num") { $Type= "anm"; } + if ($Type eq "str") { $Type= "ast"; } + $Par=~ s/\(/\[/g; + $Par=~ s/\)/\]/g; + } + $Par=~ s/\;//g; + push @Multi, "\$$Par"; + + my $Name= $Par; + $Name=~ s/\[.*\]//; + $Vars{$Name}= $Type; + } + + $Str= join(",", @Multi); + + my $Spl= ""; + if (scalar @Parts>1) { + $Spl= "; ($Str)= split(/,/, \$Inp_)"; + $Str= "\$Inp_"; + } + my $Inp= qq|chomp($Str = uc())$Spl|; + + + if ($Str=~ /,/) { + $Str= "\$$Str"; + $Str=~ s/,/,\$/g; + $Str= "Inp"; + } + return $Txt.$Inp; + } + + +sub NEXT { + $Indent--; + return "}"; + } + + +sub ONGOTO { + # Base 1, if not match it will be skipped. + my ($Str)= @_; + my @Parts= split(" ", $Str); + my $Var= $Parts[1]; + my @Lines= split(",", $Parts[3]); + my $Count=0; + my $Text; + foreach my $Lin (@Lines) { + $Count++; + my $This= "\telsif (\$$Var==$Count) "; + if ($Count==1) { $This= "if (\$$Var==1) "; } + + my $Goto= &GOTO("GOTO $Lin"); + $This.="{ $Goto; }\n"; + $Text.= $This; + } + return $Text; + } + + +sub PRINT { + my ($Str)= @_; + if ($Str eq "PRINT") { return 'print "\n"' }; + $Str=~ s/^PRINT //; + + my $Enter= 1; + if ($Str=~ /;$/) { $Enter= 0; } + + my @Parts= &SMARPLIT($Str, ";", "\""); + + my @Out; + foreach my $Par (@Parts) { + if ($Par=~ /"/) { + push @Out, $Par; + next; + } + + if ($Par=~ /TAB\((.*?)\)/) { + push @Out, "' 'x".&FORMULA($1)." "; + next; + } + + $Par= &FORMULA($Par); + push @Out, $Par; + } + + my $Out= join(". ", @Out); + if ($Enter) { $Out.= qq|. "\\n"|; } + return "print ".$Out; + } + + +sub READ { + my ($Str)= @_; + $Str=~ s/READ //; + $Str= &FORMULA($Str); + $Str.="= ; chomp($Str)"; + return $Str; + } + + +sub REM { + my ($Str)= @_; + return "#".$Str; + } + + +sub RETURN { + return "return; }"; + } + + + +########### +# HELPERS # +########### + +sub TRIM { + my ($Str)= @_; + #$Str=~ s/\s+/ /g; + $Str=~ s/^\s+//; + $Str=~ s/\s+$//; + return $Str; + } + + +sub DATAIL { + print "\n\n\n"; + print "__DATA__\n"; + foreach my $Dat (@Data) { + $Dat=~ s/"//g; + $Dat=~ s/,/\n/g; + print "$Dat\n"; + } + } + + +sub FORMULA { + my ($Str, $Cond)= @_; + $Str=~ s/\$//g; + $Str=~ s/ABS\(/abs\(/g; + $Str=~ s/COS\(/cos\(/g; + $Str=~ s/LEN\(/length\(/g; + $Str=~ s/INT\(/int\(/g; + $Str=~ s/MID\$?\(/substr\(/g; + $Str=~ s/RND\(/rand\(/g; + $Str=~ s/SIN\(/sin\(/g; + $Str=~ s/SQR\(/sqr\(/g; + $Str=~ s/(\b[A-Z][0-9]?\b)/\$$&/g; + + #==> Check for arrays... + foreach my $Key (keys %Vars) { + if ($Vars{$Key}!~ /^a/) { next; } + $Str=~ s/\$$Key\((.*?)\)/\$$Key\[$1\]/g; + } + + if ($Cond==1) { + $Str=~ s/<>/ ne /g; + $Str=~ s/=/ eq /g; + } + return $Str; + } + + +sub SMARPLIT { + my ($Str, $Sep, $Nin)= @_; + my @Parts; + my $Text= ""; + my $Flag= 0; + my $Prev; + foreach my $Char (split('', $Str)) { + if ($Char eq $Nin) { $Flag= !$Flag; } + if ($Char eq $Sep && $Flag==0) { + push @Parts, &TRIM($Text); + $Text= ""; + next; + } + $Prev= $Char; + $Text.= $Char; + } + if ($Text) { push @Parts, &TRIM($Text); } + return @Parts; + } + + + From 5750aca580380505be0039e42cdebc6116010e77 Mon Sep 17 00:00:00 2001 From: Alex Gomez Date: Thu, 27 Jan 2022 17:38:32 -0600 Subject: [PATCH 5/6] Most probable a bad OCR mismatch --- 59_Lunar_LEM_Rocket/lunar.bas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/59_Lunar_LEM_Rocket/lunar.bas b/59_Lunar_LEM_Rocket/lunar.bas index db07b0a5..87cb430f 100644 --- a/59_Lunar_LEM_Rocket/lunar.bas +++ b/59_Lunar_LEM_Rocket/lunar.bas @@ -1,5 +1,5 @@ 10 PRINT TAB(33);"LUNAR" -20 PRINT TAB(l5);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 25 PRINT:PRINT:PRINT 30 PRINT "THIS IS A COMPUTER SIMULATION OF AN APOLLO LUNAR" 40 PRINT "LANDING CAPSULE.": PRINT: PRINT From 8ba115287ef6939a87333f0f37fb54eb03325bc5 Mon Sep 17 00:00:00 2001 From: Steve Bosman Date: Fri, 28 Jan 2022 23:10:25 +0000 Subject: [PATCH 6/6] Improve and modernise javascript for 16 Bug Introduce some named variables Case insensitive inputs Fix delay so that it happens correctly and ensure the page scrolls when it gets too long. --- 16_Bug/javascript/bug.js | 321 +++++++++++++++++++-------------------- 1 file changed, 160 insertions(+), 161 deletions(-) diff --git a/16_Bug/javascript/bug.js b/16_Bug/javascript/bug.js index 2d99d90c..e222e03d 100644 --- a/16_Bug/javascript/bug.js +++ b/16_Bug/javascript/bug.js @@ -10,38 +10,43 @@ function print(str) function input() { - var input_element; - var input_str; - return new Promise(function (resolve) { - input_element = document.createElement("INPUT"); + const input_element = document.createElement("INPUT"); print("? "); input_element.setAttribute("type", "text"); input_element.setAttribute("length", "50"); document.getElementById("output").appendChild(input_element); input_element.focus(); - input_str = undefined; - input_element.addEventListener("keydown", function (event) { - if (event.keyCode == 13) { - input_str = input_element.value; - document.getElementById("output").removeChild(input_element); - print(input_str); - print("\n"); - resolve(input_str); - } - }); + input_element.addEventListener("keydown", + function (event) { + if (event.keyCode === 13) { + const input_str = input_element.value; + document.getElementById("output").removeChild(input_element); + print(input_str); + print("\n"); + resolve(input_str); + } + }); }); } function tab(space) { - var str = ""; + let str = ""; while (space-- > 0) str += " "; return str; } +function waitNSeconds(n) { + return new Promise(resolve => setTimeout(resolve, n*1000)); +} + +function scrollToBottom() { + window.scrollTo(0, document.body.scrollHeight); +} + function draw_head() { print(" HHHHHHH\n"); @@ -52,6 +57,58 @@ function draw_head() print(" HHHHHHH\n"); } +function drawFeelers(feelerCount, character) { + for (let z = 1; z <= 4; z++) { + print(tab(10)); + for (let x = 1; x <= feelerCount; x++) { + print(character + " "); + } + print("\n"); + } +} + +function drawNeck() { + for (let z = 1; z <= 2; z++) + print(" N N\n"); +} + +function drawBody(computerTailCount) { + print(" BBBBBBBBBBBB\n"); + for (let z = 1; z <= 2; z++) + print(" B B\n"); + if (computerTailCount === 1) + print("TTTTTB B\n"); + print(" BBBBBBBBBBBB\n"); +} + +function drawFeet(computerFeetCount) { + for (let z = 1; z <= 2; z++) { + print(tab(5)); + for (let x = 1; x <= computerFeetCount; x++) + print(" L"); + print("\n"); + } +} + +function drawBug(playerFeelerCount, playerHeadCount, playerNeckCount, playerBodyCount, playerTailCount, playerFeetCount, feelerCharacter) { + if (playerFeelerCount !== 0) { + drawFeelers(playerFeelerCount, feelerCharacter); + } + if (playerHeadCount !== 0) + draw_head(); + if (playerNeckCount !== 0) { + drawNeck(); + } + if (playerBodyCount !== 0) { + drawBody(playerTailCount) + } + if (playerFeetCount !== 0) { + drawFeet(playerFeetCount); + } + for (let z = 1; z <= 4; z++) + print("\n"); +} + // Main program async function main() { @@ -60,25 +117,26 @@ async function main() print("\n"); print("\n"); print("\n"); - a = 0; - b = 0; - h = 0; - l = 0; - n = 0; - p = 0; - q = 0; - r = 0; - s = 0; - t = 0; - u = 0; - v = 0; - y = 0; + let playerFeelerCount = 0; + let playerHeadCount = 0; + let playerNeckCount = 0; + let playerBodyCount = 0; + let playerFeetCount = 0; + let playerTailCount = 0; + + let computerFeelerCount = 0; + let computerHeadCount = 0; + let computerNeckCount = 0; + let computerBodyCount = 0; + let computerTailCount = 0; + let computerFeetCount = 0; + print("THE GAME BUG\n"); print("I HOPE YOU ENJOY THIS GAME.\n"); print("\n"); print("DO YOU WANT INSTRUCTIONS"); - str = await input(); - if (str != "NO") { + const instructionsRequired = await input(); + if (instructionsRequired.toUpperCase() !== "NO") { print("THE OBJECT OF BUG IS TO FINISH YOUR BUG BEFORE I FINISH\n"); print("MINE. EACH NUMBER STANDS FOR A PART OF THE BUG BODY.\n"); print("I WILL ROLL THE DIE FOR YOU, TELL YOU WHAT I ROLLED FOR YOU\n"); @@ -98,30 +156,32 @@ async function main() print("\n"); print("\n"); } - while (y == 0) { - z = Math.floor(6 * Math.random() + 1); - c = 1; - print("YOU ROLLED A " + z + "\n"); - switch (z) { + + let gameInProgress = true; + while (gameInProgress) { + let dieRoll = Math.floor(6 * Math.random() + 1); + let partFound = false; + print("YOU ROLLED A " + dieRoll + "\n"); + switch (dieRoll) { case 1: print("1=BODY\n"); - if (b == 0) { + if (playerBodyCount === 0) { print("YOU NOW HAVE A BODY.\n"); - b = 1; - c = 0; + playerBodyCount = 1; + partFound = true; } else { print("YOU DO NOT NEED A BODY.\n"); } break; case 2: print("2=NECK\n"); - if (n == 0) { - if (b == 0) { + if (playerNeckCount === 0) { + if (playerBodyCount === 0) { print("YOU DO NOT HAVE A BODY.\n"); } else { print("YOU NOW HAVE A NECK.\n"); - n = 1; - c = 0; + playerNeckCount = 1; + partFound = true; } } else { print("YOU DO NOT NEED A NECK.\n"); @@ -129,219 +189,158 @@ async function main() break; case 3: print("3=HEAD\n"); - if (n == 0) { + if (playerNeckCount === 0) { print("YOU DO NOT HAVE A NECK.\n"); - } else if (h == 0) { + } else if (playerHeadCount === 0) { print("YOU NEEDED A HEAD.\n"); - h = 1; - c = 0; + playerHeadCount = 1; + partFound = true; } else { print("YOU HAVE A HEAD.\n"); } break; case 4: print("4=FEELERS\n"); - if (h == 0) { + if (playerHeadCount === 0) { print("YOU DO NOT HAVE A HEAD.\n"); - } else if (a == 2) { + } else if (playerFeelerCount === 2) { print("YOU HAVE TWO FEELERS ALREADY.\n"); } else { print("I NOW GIVE YOU A FEELER.\n"); - a++; - c = 0; + playerFeelerCount ++; + partFound = true; } break; case 5: print("5=TAIL\n"); - if (b == 0) { + if (playerBodyCount === 0) { print("YOU DO NOT HAVE A BODY.\n"); - } else if (t == 1) { + } else if (playerTailCount === 1) { print("YOU ALREADY HAVE A TAIL.\n"); } else { print("I NOW GIVE YOU A TAIL.\n"); - t++; - c = 0; + playerTailCount++; + partFound = true; } break; case 6: print("6=LEG\n"); - if (l == 6) { + if (playerFeetCount === 6) { print("YOU HAVE 6 FEET ALREADY.\n"); - } else if (b == 0) { + } else if (playerBodyCount === 0) { print("YOU DO NOT HAVE A BODY.\n"); } else { - l++; - c = 0; - print("YOU NOW HAVE " + l + " LEGS.\n"); + playerFeetCount++; + partFound = true; + print("YOU NOW HAVE " + playerFeetCount + " LEGS.\n"); } break; } - x = Math.floor(6 * Math.random() + 1) ; + dieRoll = Math.floor(6 * Math.random() + 1) ; print("\n"); - date = new Date().valueOf; - while (date - new Date().valueOf < 1000000) ; - print("I ROLLED A " + x + "\n"); - switch (x) { + scrollToBottom(); + await waitNSeconds(1); + + print("I ROLLED A " + dieRoll + "\n"); + switch (dieRoll) { case 1: print("1=BODY\n"); - if (p == 1) { + if (computerBodyCount === 1) { print("I DO NOT NEED A BODY.\n"); } else { print("I NOW HAVE A BODY.\n"); - c = 0; - p = 1; + partFound = true; + computerBodyCount = 1; } break; case 2: print("2=NECK\n"); - if (q == 1) { + if (computerNeckCount === 1) { print("I DO NOT NEED A NECK.\n"); - } else if (p == 0) { + } else if (computerBodyCount === 0) { print("I DO NOT HAVE A BODY.\n"); } else { print("I NOW HAVE A NECK.\n"); - q = 1; - c = 0; + computerNeckCount = 1; + partFound = true; } break; case 3: print("3=HEAD\n"); - if (q == 0) { + if (computerNeckCount === 0) { print("I DO NOT HAVE A NECK.\n"); - } else if (r == 1) { + } else if (computerHeadCount === 1) { print("I DO NOT NEED A HEAD.\n"); } else { print("I NEEDED A HEAD.\n"); - r = 1; - c = 0; + computerHeadCount = 1; + partFound = true; } break; case 4: print("4=FEELERS\n"); - if (r == 0) { + if (computerHeadCount === 0) { print("I DO NOT HAVE A HEAD.\n"); - } else if (s == 2) { + } else if (computerFeelerCount === 2) { print("I HAVE 2 FEELERS ALREADY.\n"); } else { print("I GET A FEELER.\n"); - s++; - c = 0; + computerFeelerCount++; + partFound = true; } break; case 5: print("5=TAIL\n"); - if (p == 0) { + if (computerBodyCount === 0) { print("I DO NOT HAVE A BODY.\n"); - } else if (u == 1) { + } else if (computerTailCount === 1) { print("I DO NOT NEED A TAIL.\n"); } else { print("I NOW HAVE A TAIL.\n"); - u = 1; - c = 0; + computerTailCount = 1; + partFound = true; } break; case 6: print("6=LEGS\n"); - if (v == 6) { + if (computerFeetCount === 6) { print("I HAVE 6 FEET.\n"); - } else if (p == 0) { + } else if (computerBodyCount === 0) { print("I DO NOT HAVE A BODY.\n"); } else { - v++; - c = 0; - print("I NOW HAVE " + v + " LEGS.\n"); + computerFeetCount++; + partFound = true; + print("I NOW HAVE " + computerFeetCount + " LEGS.\n"); } break; } - if (a == 2 && t == 1 && l == 6) { + if (playerFeelerCount === 2 && playerTailCount === 1 && playerFeetCount === 6) { print("YOUR BUG IS FINISHED.\n"); - y++; + gameInProgress = false; } - if (s == 2 && p == 1 && v == 6) { + if (computerFeelerCount === 2 && computerBodyCount === 1 && computerFeetCount === 6) { print("MY BUG IS FINISHED.\n"); - y += 2; + gameInProgress = false; } - if (c == 1) + if (!partFound) continue; print("DO YOU WANT THE PICTURES"); - str = await input(); - if (str == "NO") + const showPictures = await input(); + if (showPictures.toUpperCase() === "NO") continue; print("*****YOUR BUG*****\n"); print("\n"); print("\n"); - if (a != 0) { - for (z = 1; z <= 4; z++) { - print(tab(10)); - for (x = 1; x <= a; x++) { - print("A "); - } - print("\n"); - } - } - if (h != 0) - draw_head(); - if (n != 0) { - for (z = 1; z <= 2; z++) - print(" N N\n"); - } - if (b != 0) { - print(" BBBBBBBBBBBB\n"); - for (z = 1; z <= 2; z++) - print(" B B\n"); - if (t == 1) - print("TTTTTB B\n"); - print(" BBBBBBBBBBBB\n"); - } - if (l != 0) { - for (z = 1; z <= 2; z++) { - print(tab(5)); - for (x = 1; x <= l; x++) - print(" L"); - print("\n"); - } - } - for (z = 1; z <= 4; z++) - print("\n"); + drawBug(playerFeelerCount, playerHeadCount, playerNeckCount, playerBodyCount, playerTailCount, playerFeetCount, "A"); print("*****MY BUG*****\n"); print("\n"); print("\n"); - print("\n"); - if (s != 0) { - for (z = 1; z <= 4; z++) { - print(tab(10)); - for (x = 1; x <= s; x++) { - print("F "); - } - print("\n"); - } - } - if (r != 0) - draw_head(); - if (q != 0) { - for (z = 1; z <= 2; z++) - print(" N N\n"); - } - if (p != 0) { - print(" BBBBBBBBBBBB\n"); - for (z = 1; z <= 2; z++) - print(" B B\n"); - if (u == 1) - print("TTTTTB B\n"); - print(" BBBBBBBBBBBB\n"); - } - if (v != 0) { - for (z = 1; z <= 2; z++) { - print(tab(5)); - for (x = 1; x <= v; x++) - print(" L"); - print("\n"); - } - } - for (z = 1; z <= 4; z++) + drawBug(computerFeelerCount, computerHeadCount, computerNeckCount, computerBodyCount, computerTailCount, computerFeetCount, "F"); + for (let z = 1; z <= 4; z++) print("\n"); } print("I HOPE YOU ENJOYED THE GAME, PLAY IT AGAIN SOON!!\n"); + scrollToBottom(); } main();