• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Schleife in Perl- Wie zurück zum Programmanfang?

scoopy

Newbie
Hallo!

Muss mal die Spezi´s hier fragen. Ich hab folgendes Problem bei der Programmierung eines Spiels in Perl:

Ich hab mehrere Subroutinen mit z. B.
if ($a eq $eigabe) {print "Knocked out";}

untereinander stehen.
Ich möchte aber nach der Ausgabe zurück an den Start des Programms.
return Zeile wie in Basic (was ich beherrsche) gibt es in Perl nicht und goto soll nicht verwendet werden.
Wenn ich aber redo eingebe, prüft er nur die jeweilige if-Zeile.
Der Spung soll aber an den Anfang des Programms gehen, wo zur Eingabe
aufgefordert wird.

Das Programms soll nach den ganzen if-Subroutinen
nicht einfach so enden, sondern es soll nachgefragt werden,
ob weiter gespielt wird.
Sofern mit ja geantwortet wird, soll an den Anfang des Programms zurück gesprungen werden.

Wie realisiere ich das oder wer kann mir dafür ne gescheite do- (oder while-Schleife) basteln?
Di e Lösung liegt vielleicht schon vor mit, nur komm ich nicht dahinter.

Danke!
 

TeXpert

Guru
sag doch einfach mal was Du machen willst.

Wenn Du immer wieder von vorne anfangen willst, dann mach eine Schleife um Deine hauptroutine...

also
Code:
my $continue = 1;
while ($continue) {
 dofirst;
 dosecond;
 dothird;
 checkifcontinue; # wenn nicht dann $continue=0;
}
 
OP
S

scoopy

Newbie
#!/usr/bin/perl

# ein Persönlichkeitstest (Ohrakel)
# Perlprogrammierung Teil 2

# Auswahl von Eigenschaften eines Menschen

print "Dieses ***Ohrakel*** verrät dir, wie du wirklich bist!\n";


print "***Triff eine Auswahl und wähle auf der Tastatur aus:***\n
Ich bin \n\n 1=lieb, 2=böse, 3=gutmütig,\n
4=geizig, 5=extrovertiert, 6=introvertiert,\n
7=schlau, 8=dumm, 9=schuechtern oder\n
10=verrueckt.\n
Das Ohrakel wird dir viel verraten! \n";


$auswahl=[1-10];
$eintrag= <STDIN>;
chomp $eintrag;

#Ausgaben Teil 1

if ($eintrag eq 1) {print "Das glaubst aber auch nur du!\n";}
if ($eintrag eq 2) {print "Da hast du aber verdammt Recht!\n";}
if ($eintrag eq 3) {print "Dann lass mal n paar Kroeten rueber wandern!\n";}
if ($eintrag eq 4) {print "Warte, bis das Finanzamt kommt!\n";}
if ($eintrag eq 5) {print "Du Memme!\n";}
if ($eintrag eq 6) {print "Du Egoist!\n";}


if ($eintrag eq 7) {print "Dann beantworte folgende Frage: Wie viele Kanten hat ein Wuerfel?\n Gib die Zahl ein!\n";}

$antwort=[0-9];
$antwort=12;
$eingabe=<STDIN>;
chomp $eingabe;
if ($eingabe eq $antwort) { print "Du hast wohl extra noch mal nachgezaehlt?\n";}
if ($eingabe != $antwort) {print " Und du meinst, du bist schlau? Dass ich nicht lache...\n";}

# Ausgabe Teil 2

if ($eintrag eq 8) {print "Behaupten das alle von dir?\n";}
if ($eintrag eq 9) {print "So findest du nie ne(n) Freund/in!\n";}
if ($eintrag eq 10){print "Du gehoerst fuer immer weg gesperrt!\n";}

# Nach Ausgabe des Ergebnisses von vorn beginnen
{
print "Willst du´s noch mal versuchen?\n";

print "1=Ja\n 2=Nein\n";

$anschlag=[1-2];
$ja=1;

$nachfrage=<STDIN>;

if ($nachfrage eq $ja) {WAS KOMMT DA REIN, UM AN DEN PROGRAMM-ANFANG ZU SPRINGEN?;};
if ($nachfrage != $ja) {print "\n\n *** Programmende ***\n\n\n";};
}


Alles klar?
 

taki

Advanced Hacker
Pack alles in eine Funktion und mach vorher eine Schleife, in der Du die Funktion aufrufst. Setze vor der Schleife einen Schalter, der in der Funktion verändert werden kann. Die Schleife endet, wenn der Schalter umgestellt wurde.

in etwa (Pseudopseudocode)


Code:
#!/usr/bin/perl
# ein Persönlichkeitstest (Ohrakel) 
# Perlprogrammierung Teil 2 

# Auswahl von Eigenschaften eines Menschen 

print "Dieses ***Ohrakel*** verrät dir, wie du wirklich bist!\n"; 

my $weiter = 1;
while ($weiter)  {
    $weiter = DeineGenialeFunktion();
}

sub DeineGenialeFunktion  {
   #   ... hier so ziemlich all das, was Du oben geschrieben hast und hier noch nicht wiedergefunden hast ...

   #   ...

   # und zum Schluss:
   if ($nachfrage eq $ja) {
       return 1;
   }  else  {
       return 0;
   }; 
}
 

regexer

Advanced Hacker
scoopy schrieb:
if ($nachfrage eq $ja) {WAS KOMMT DA REIN, UM AN DEN PROGRAMM-ANFANG ZU SPRINGEN?;};
if ($nachfrage != $ja) {print "\n\n *** Programmende ***\n\n\n";};

Ganz einfach: Nimm den Vorschlag von TeXpert, baue eine while schleife um dein Script und verlasse diese Schleife mit einer Hilfsvarialbe oder mit last. Praktisch sieht das so aus:

Code:
while () {    # Dauerschleife

   ### Hier kommt dein Script bis zur Eingabe von $nachfrage ###

   if $nachfrage != $ja) {
     print "\n\n *** Programmende ***\n\n\n";
     last;
   }

}   # Ende der while Schleife
Das Kommando "last" verlässt dann die while-Schleife...

Natürlich ist das ganze Geschmacksache. Mir würde folgendes Konstrukt besser gefallen:
Code:
#!/usr/bin/perl
use strict;

my $nachfrage;
do {
  $nachfrage=<STDIN>;
  chomp $nachfrage;
} while ($nachfrage ne "2");
 
OP
S

scoopy

Newbie
print "Dieses ***Ohrakel*** verrät dir, wie du wirklich bist!\n";


print "***Triff eine Auswahl und wähle auf der Tastatur aus:***\n
Ich bin \n\n 1=lieb, 2=böse, 3=gutmütig,\n
4=geizig, 5=extrovertiert, 6=introvertiert,\n
7=schlau, 8=dumm, 9=schuechtern oder\n
10=verrueckt.\n
Das Ohrakel wird dir viel verraten! \n";


$auswahl=[1-10];
$eintrag= <STDIN>;
chomp $eintrag;

my $continiue = 1;
while ($continiue) {
$continue = Wiederholung();
}

sub Wiederholung {

if ($eintrag eq 1) {print "Das glaubst aber auch nur du!\n";}
if ($eintrag eq 2) {print "Da hast du aber verdammt Recht!\n";}
if ($eintrag eq 3) {print "Dann lass mal n paar Kroeten rueber wandern!\n";}
if ($eintrag eq 4) {print "Warte, bis das Finanzamt kommt!\n";}
if ($eintrag eq 5) {print "Du Memme!\n";}
if ($eintrag eq 6) {print "Du Egoist!\n";}



if ($eintrag eq 7) {print "Dann beantworte folgende Frage: Wie viele Kanten hat ein Wuerfel?\n Gib die Zahl ein!\n";

$antwort=[0-9];
$antwort=12;
$eingabe=<STDIN>;
chomp $eingabe;
if ($eingabe eq $antwort) { print "Du hast wohl extra noch mal nachgezaehlt?\n";}
if ($eingabe != $antwort) {print " Und du meinst, du bist schlau? Dass ich nicht lache...\n";}
}

if ($eintrag eq 8) {print "Behaupten das alle von dir?\n";}
if ($eintrag eq 9) {print "So findest du nie ne(n) Freund/in!\n";}
if ($eintrag eq 10){print "Du gehoerst fuer immer weg gesperrt!\n";}


print "Willst du´s noch mal versuchen?\n";
print "1=Ja\n 2=Nein\n";

$anschlag=[1-2];
$ja=1;

$nachfrage=<STDIN>;

if ($nachfrage != $ja) {print "\n\n *** Programmende ***\n\n\n";};


if ($nachfrage == $ja) {
return 0;
} else {
return 1;
};
}

Er druckt jetzt zwar Programmende aus, schiebt dann aber die Ausgabe von dem nach, als wenn ich die Taste 1 bei der Auswahl meiner Eigenschaft gedrückt hätte .
Muss irgendwo noch ne break-Anweisung hin?
 

abgdf

Guru
Lustiges Spiel. Bin schon seit etwa 20 Jahren nicht mehr von einem Nur-Text-Programm beschimpft worden.

Nur, muß das nicht "Orakel" heißen ?

Gruß
 
Oben