Merge branch 'coding-horror:main' into main

This commit is contained in:
Paul Holt
2022-01-30 00:25:47 +11:00
committed by GitHub
4 changed files with 654 additions and 162 deletions

380
00_Utilities/bas2perl.pl Executable file
View File

@@ -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 = <FH>) {
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(<STDIN>))$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.="= <DATA>; 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;
}

View File

@@ -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();

View File

@@ -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

113
69_Pizza/perl/pizza.pl Executable file
View File

@@ -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(<STDIN>)); 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]= <DATA>; chomp($S[$I]);;
}
for ($I=1; $I<=4; $I++) {
$M[$I]= <DATA>; 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(<STDIN>));
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(<STDIN>));
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(<STDIN>)); ($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(<STDIN>));
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