Pascal ratlos bei erstellung eines Menüs

Rockzz

Cadet 4th Year
Registriert
Mai 2008
Beiträge
104
Hallo zusammen,

ich arbeite seit einem halben Jahr 2 Stunden die Woche mit Pascal, Informatik in der Schule ^^ eigentlich finde ich es voll unsinnig und langeweilig, kenne ich schon alles von COMAL aber naja, unser Lehrer sagt bevor wir das nicht können macht er kein Java mit uns =(

Nun zu meiner eigentlichen Frage, wir haben ein kleines Spiel programmiert, welches ich nun am bearbeiten bin, damit es einen Sinn ergibt. Weiss net wieso ich sowas mache, aber nun reizt es mich das Spiel zu ende zu bringen.

Nach dem Start soll Text angezeigt werden. fertig
Dann soll ein "Menü" erscheinen, welches ruhig ganz simpel sein kann, Beispiel:

Press:
-------

1 for easy mode
2 for mid mode
3 for hard mode

4 for credits
5 for exit

Also man soll die möglichkeit haben das Spiel in 3 Schwierigkeitsstufen zu spielen, bei der eingabe einer 1 soll der das Spiel starten im leichten Spielmodus usw.

Wie kann ich das umsetzen? Momentan sieht dies bei mir wie folgt aus (habe den Spielnamen noch weggelassen, das ist ja eine Kleinigkeit) :

PROGRAM Spiel1;
VAR
auswahl,credits:INTEGER;
BEGIN
WRITELN('Spielmodi');
WRITELN('----------');
WRITELN('Drücke 1 für Anfänger');
WRITELN('Drücke 2 für Fortgeschritten');
WRITELN('Drücke 3 für Profi');
WRITELN('');
WRITELN('Drücke 4 für Mitwirkende');
WRITELN('Drücke 5 für Beenden');
READLN(auswahl);
IF auswahl=1
THEN
BEGIN
hier die Prozeduren Reihenfolge für den Anfänger Modus
END;
IF auswahl=2
THEN
BEGIN
hier die Prozeduren Reihenfolge für den Fortgeschrittenen Modus
END;
IF auswahl=3
THEN
BEGIN
hier die Prozeduren Reihenfolge für den Profi Modus
END;
IF auswahl=4
THEN
WRITELN('Special thanks to...');
WRITELN('HIER ALLE NAMEN');
WRITELN('');
WRITELN('Drücke 0 um zum Menü zurück zu kehren.');
READLN(credits);
IF credits=0
THEN
IF auswahl=5
THEN
END.

Eigentlich unterscheiden sich in diesen Spielmodis nur eine einzige Prozedur, die ich in 3 Varianten umgeschrieben habe.

Ich weiss nicht wie beispielsweise bei Eingabe der 4 die Credits kommen, und ich es so machen kann, das man zum vorherigen "Menü" kommen kann.

Zum beenden stellt sich meine Frage, muss ich einfach schreiben:

(...)
IF auswahl=5
THEN END;
END.


Bitte sehr um Hilfe =)

Achja, bevor ich es vergesse, ich kann dich jederzeit in Prozeduren nochmal schreiben beisielsweise IF blabla THEN BEGIN blabla END; muss dann doch nur das Begin und End auch wieder mit einem ; hinter dem End schliessen oder?
 
TurboPascal?

Hatte ich auch im letzen Jahr damit zu tun.

Dann müsste es ziemlich sicher procedure, für die Menü Punkte, statt Program, heißen.

MfG

tmkoeln
 
Wie soll ich erklären, zu erst, es ist kein Turbo Pascal, sondern "normal" Pascal.

Also es soll 1 Hauptprogramm geben, da drinne sind dann noch Proceduren, und je nachdem was man in diesem "Menü" auswählt, also welchen Modi, schreibe ich dann

IF auswahl=1
THEN
BEGIN
prozedur1
prozedur2
prozedur3
prozedur4
prozedur5
END;

usw. also ich schreibe die Prozeduren ja, und starte sie, indem ich ihren Prozedur namen ins Hauptprogramm schreibe. Kanns grad besser net beschreiben ^^

Sons schrebt doch mal einfach, wie ihr ein obriges "Menü" schreiben würdet =)

MfG
 
Hab mal in den dunkelsten Tiefen meiner grauen Zellen gewühlt, dazu noch fix Turbo Pascal mit DosBox zum Laufen gebracht und ein funktionierendes Menü zusammengebastelt. :freak:

PHP:
PROGRAM spiel;
USES crt;

VAR
  auswahl : CHAR;

PROCEDURE modus_leicht;
BEGIN
  writeln('Anfaenger gewaehlt.');
END;

PROCEDURE modus_mittel;
BEGIN
  writeln('Fortgeschritten gewaehlt');
END;

PROCEDURE modus_schwer;
BEGIN
  writeln('Profi gewaehlt');
END;

PROCEDURE credits;
BEGIN
  writeln('(*** Credits ***)');
END;

BEGIN
  REPEAT
    clrscr;
    writeln('Spielmodi');
    writeln('-------------------');
    writeln('(1) Anfaenger');
    writeln('(2) Fortgeschritten');
    writeln('(3) Profi');
    writeln;
    writeln('(4) Mitwirkende');
    writeln('(5) Credits');
    writeln('<ESC> Beenden');
    writeln;
    auswahl:= readkey;

    CASE auswahl OF
      '1': modus_leicht;
      '2': modus_mittel;
      '3': modus_schwer;
      '5': credits;
      #27: exit;
    END;

    writeln;
    writeln('Druecke <ESC> zum Beenden oder <ENTER>, um das Menue wieder anzuzeigen!');
    REPEAT
      auswahl:= readkey;
    UNTIL (auswahl = #13) OR (auswahl = #27);
  UNTIL auswahl = #27;
END.

Die Zeilen "USES crt;" und "clrscr;" sind nicht wirklich nötig, machen das ganze aber etwas hübscher - clrscr löscht den Bildschirminhalt.
Anstat für jede Eingabe IF...THEN... zu schreiben habs ich's etwas übersichtlicher als CASE-Anweisung gemacht.
Um mit Sondertasten zu arbeiten, gibt man dann wie ich einfach die ASCII-Codes (#13 = ENTER, #27 = ESC) anstatt '1', '2', usw. an.
 
Zuletzt bearbeitet:
Rockzz schrieb:
Wie soll ich erklären, zu erst, es ist kein Turbo Pascal, sondern "normal" Pascal.

Turbo Pascal ist nur der Compiler. Damit ist Turbo Pascal auch nur "normales" Pascal. Genauso, wie Free Pascal. Nur werden halt einige Dinge etwas anders interpretiert.

Wie ich es verstanden habe, willst du quasi das komplette Spiel drei Mal im Code reinschreiben. Aus Redundanzgründen äußerst schwachsinnig.

Vielmehr solltest du mit Parametern für die Proceduren arbeiten.
Also z.B.

Code:
type
  TModus : (easy, normal, hard);

[...]

procedure Spiel(Modus:TModus);
begin
  [...]
end;

So macht es viel mehr sinn.
 
Am Anfang würde ich zum Lernen aber persönlich die reduntante Variante ohne Parameter bevorzugen, da der Programmablauf für einen Einteiger so leichter nachverfolgbar ist und man erstmal nicht mit zusätzliche Verzweigungen hantieren muss.
 
Vielen vielen Dank, teste beides direkt mal aus. Ich würd auch sagen, ich machs erstmal wie der resusseleman, da schon sind Sachen wovon ich kein Plan habe ^^ CHAR, clrscr, CASE und so :p

Ich habe dazu grad mal 2 Fragen, wieso macht man folgendes?

auswahl:= readkey;

Und wenn jetzt beispielsweise ein Spielmodi aus 8 prozeduren besteht, schreibe ich doch
für > modus_leicht < eine Prozedur

PROCEDURE modus_leicht;
BEGIN
name der prozedur1;
name der prozedur2;
name der prozedur3;
name der prozedur4;
name der prozedur5;
name der prozedur6;
name der prozedur7;
END;

oder?
 
Zuletzt bearbeitet:
CHAR ist einfach der Variablen-Typ für ein einzelnes Zeichen (genauer ist er 1 Byte groß und fasst genau ein ASCII-Zeichen)
und readkey habe ich benutzt, weil es die gedrückte Taste als CHAR liefert, ohne dass diese angezeigt wird und man diese auch nicht mit Enter bestätigen muss.
(benötigt aber auch "USES crt;")

Hier mal ein paar Links dazu:
Variablen
CASE
USES

Und wenn jetzt beispielsweise ein Spielmodi aus 8 prozeduren besteht, schreibe ich doch

im CASE-Abschnitt wird nur auf die 3 Modi aufgeteilt. Alles was dann im jeweiligen Modi abläuft wird dann alles hier reingeschrieben:
PHP:
PROCEDURE modus_leicht;
BEGIN
  // Alles was bei "Anfänger" passiert z.B.:
  [...]
  prozedur1;
  prozedur2;
  [...]
END;

PROCEDURE modus_mittel;
BEGIN
  [...]
  // Alles was bei "Fortgeschritten" passiert
  [...]
END;

PROCEDURE modus_schwer;
BEGIN
  [...]
  // Alles was bei "Profi" passiert
  [...]
END;


edit: ach mist, da warst mit editieren wohl schneller, als ich mit schreiben. Und du musst es auch nicht unbedingt weiter in Prozeduren verpacken, sondern kannst auch ganz normal den kompletten Code da rein schreiben.
 
Zuletzt bearbeitet:
Also hier mal das momentane Spiel:

PHP:
PROGRAM spiel;
USES crt;

VAR
  auswahl : CHAR;
  x,y: INTEGER;
  spielfeld: ARRAY [1..60,1..20] OF STRING;

(*=======================================PROCEDURES=======================================*)

PROCEDURE willkommen;
BEGIN
WRITELN('Viel Spass beim spielen!');
END;

PROCEDURE warten;
VAR
  zaehlen:LONGINT;
BEGIN
zaehlen:=0;
REPEAT
  zaehlen:=zaehlen+1;
UNTIL zaehlen=900000000;
END;

PROCEDURE initialisieren;
VAR
  xpos,ypos:INTEGER;
BEGIN
ypos:=1;
REPEAT
  xpos:=1;
  REPEAT
    spielfeld[xpos,ypos]:='-';
    xpos:=xpos+1;
  UNTIL xpos=61;
  ypos:=ypos+1;
UNTIL ypos=21;
END;

PROCEDURE leeres_spielfeld_anzeigen;
VAR
  zeilen:INTEGER;
BEGIN
gotoxy(1,1);
WRITELN('I------------------------------------------------------------I');
zeilen:=0;
REPEAT
  WRITELN('I                                                            I');
  zeilen:=zeilen+1;
UNTIL zeilen=20;
WRITELN('I------------------------------------------------------------I');
END;

PROCEDURE eingeben_von_x_und_y_easymode;
BEGIN
WRITELN('Bitte X eingeben:');
READLN(x);
WRITELN('Bitte Y eingeben:');
READLN(y);
END;

PROCEDURE warten;
VAR
  zaehlen:LONGINT;
BEGIN
zaehlen:=0;
REPEAT
  zaehlen:=zaehlen+1;
UNTIL zaehlen=500000000;
END;

PROCEDURE ges_spielfeld_anzeigen;
VAR
  xpos,ypos:INTEGER;
BEGIN
ypos:=1;
REPEAT
  xpos:=1;
  REPEAT
    gotoxy(xpos+1,ypos+1);
    write(spielfeld[xpos,ypos]);
    xpos:=xpos+1;
  UNTIL xpos=61;
  ypos:=ypos+1;
UNTIL ypos=21;
END;

PROCEDURE modus_leicht;
VAR
 ende:INTEGER;
BEGIN
initialisieren;
 REPEAT
  bildschirm_putzen;
  leeres_spielfeld_anzeigen;
  eingeben_von_x_und_y;
 IF spielfeld[x,y]='X' THEN ende:=1 ELSE ende:=0;
  eintragen_des_Punktes;
  warten;
  ges_spielfeld_anzeigen;
  warten;
 UNTIL ende=1;
END;

PROCEDURE modus_mittel;
BEGIN
  writeln('Fortgeschritten gewaehlt');
END;

PROCEDURE modus_schwer;
BEGIN
  writeln('Profi gewaehlt');
END;

PROCEDURE hilfe;
BEGIN
WRITELN('Hilfe');
WRITELN('-----');
WRITELN('');
WRITELN('Waehrend des spielens kann das Spiel wie folgt beendet werden:');
WRITELN('- fuer X 0 angeben');
WRITELN('');
WRITELN('Ziel des Spiels');
WRITELN('---------------');
WRITELN('Alle 1200 Felder zu kreuzen, ohne ein Feld doppelt gekreuzt zu haben.');
END;

PROCEDURE credits;
BEGIN
WRITELN('Credits');
WRITELN('-------');
WRITELN('');
WRITELN('HIER ALLE CREDITS');
END;

(*=======================================PROCEDURES=======================================*)

BEGIN
  REPEAT
    clrscr;
    writeln('Spielmodi');
    writeln('-------------------');
    writeln('(1) Anfaenger');
    writeln('(2) Fortgeschritten');
    writeln('(3) Profi');
    writeln;
    writeln('(4) Hilfe');
    writeln('(5) Credits');
    writeln('<ESC> Beenden');
    writeln;
    auswahl:= readkey;

    CASE auswahl OF
      '1': modus_leicht;
      '2': modus_mittel;
      '3': modus_schwer;
      '4': hilfe;
      '5': credits;
      #27: exit;
    END;

    writeln;
    writeln('Druecke <ESC> zum Beenden oder <ENTER>, um das Menue wieder anzuzeigen!');
    REPEAT
      auswahl:= readkey;
    UNTIL (auswahl = #13) OR (auswahl = #27);
  UNTIL auswahl = #27;
END.

Er sagt mir beim compilen:



Achja, bei folgender Sache bin ich noch unsicher. In einer Prozedur steht:

PHP:
IF spielfeld[x,y]='X' THEN ende:=1 ELSE ende:=0;

bisher war alles ja nur 1 Programm, da stand oben in den "Hauptprogramm Variablen"

PHP:
  spielfeld: ARRAY [1..60,1..20] OF STRING;

muss ich dieses nun in die Prozedur schreiben, wie die VAR ende, die musste ich auch vom Hauptprogramm in die Prozedur schreiben.

Was habe ich wohl falsch gemacht? =( den mittel und profi modus muss ich noch schreiben, bei dem mittel Modus ist noch ein Fehler den ich auch noch am suchen bin.

Und nochmal vielen Dank, das ihr mir so hilft =)
 
Zuletzt bearbeitet:
Zum 1. Fehler im Screenshot: Die Procedure warten hast zu zweimal (ohne jegliche Parameter) im Code. Da muss eine raus.

2. - 4.: Die genannten identifier sind in deinem Code Procedure-Aufrufe. Die Procedures gibt's allerdings (noch) nicht.

5. und 6.: Bezieht sich auf die doppelte Procedure warten. Wenn du eine rausgenommen hast, verschwinden diese Fehler (siehe 1.).
 
Fehler 2-4: also einfach noch die Procedures schreiben, notfalls vorerst als leere Procedure
PHP:
PROCEDURE name;
BEGIN

END;

bisher war alles ja nur 1 Programm, da stand oben in den "Hauptprogramm Variablen"

PHP:
spielfeld: ARRAY [1..60,1..20] OF STRING;
muss ich dieses nun in die Prozedur schreiben, wie die VAR ende, die musste ich auch vom Hauptprogramm in die Prozedur schreiben.

Wo du jetzt welche Variable deklarierst hängt von folgendem Hintergrund ab:

a) Alles was direkt nach "PROGRAM foo;" bei VAR steht ist überall im Programm verfügbar und kannst auch überall und jederzeit Werte zuweisen oder auslesen. Dann musst du aber auch beachten, wenn du in einer Prozedur den Wert einer solchen Variable änderst, arbeitet der Rest des Programms mit dieser Änderung weiter.

b) Alles was unter "PROCEDURE bar; bei VAR steht kennt nur diese Prozedur. Der Rest des Programms bekommt davon nichts mit und kann auch nicht darauf zugreifen.


Und noch ein Tipp: Bei "warten" lässt du das Programm bis zu einer bestimmten Zahl zählen, was aber ja nach Leistung des PC's unterschiedlich schnell passiert. Da im Code ja schon USES crt; steht, kannst du auch einfach "delay(x);" benutzen. Für x trägst dann eine Zahl für die Anzahl der Millisekunden ein, die gewartet werden soll.
 
Bevor du aber Prozeduren und Funktionen benutzt, mach dich lieber erstmal Schlau, wie man sie richtig verwendet.
Anfänger hin- oder her. Du machst dir das Leben einfacher, wenn du erstmal anfängst, dir Gedanken zu machen, wie das Programm intern ablaufen soll.
Vorallem vermeide Globale Variablen! Man sollte so lokal, wie möglich arbeiten.

Du hast ganz oben die Variablen
Code:
VAR 
  auswahl : CHAR; 
  x,y: INTEGER; 
  spielfeld: ARRAY [1..60,1..20] OF STRING;
deklariert. Diese Variablen sind nun in jeder Prozedur/Funktion verfügbar. Wenn du nicht höllisch aufpasst, baust du da eine große Scheiße, die später nicht mehr nachvollziehbar ist. Wer Globale Variablen braucht, hat eh was falsch gemacht.
Wenn du diese Variablen nur für das Hauptprogramm benötigst, dann schreibe auch bitte diese Variablen direkt über das "Begin" des Hauptprogrammes. Ansonsten übergebe sie als Parameter in die jeweiligen Prozeduren/Funktionen.
 
Code:
x,y ; INTEGER;
spielfeld: ARRAY [1..60,1..20] OF STRING;
gehört z.B: zum VAR am Anfang von PROCEDURE modus_leicht, weils nur da gebraucht wird.

Den ganzen Menücode könnte man dann noch auch aus dem Hauptteil rausnehmen und folgendes draus machen:

Code:
FUNCTION menue : CHAR;
VAR
  auswahl : CHAR;
BEGIN
  clrscr;
  writeln('Spielmodi');
  writeln('-------------------');
  writeln('(1) Anfaenger');
  writeln('(2) Fortgeschritten');
  writeln('(3) Profi');
  writeln;
  writeln('(4) Hilfe');
  writeln('(5) Credits');
  writeln('<ESC> Beenden');
  writeln;
  auswahl:= readkey;
   CASE auswahl OF
    '1': modus_leicht;
    '2': modus_mittel;
    '3': modus_schwer;
    '4': hilfe;
    '5': credits;
    #27: exit;
  END;

  writeln;
  writeln('Druecke <ESC> zum Beenden oder <ENTER>, um das Menue wieder anzuzeigen!');
  REPEAT
    auswahl:= readkey;
  UNTIL (auswahl = #13) OR (auswahl = #27);
  menue:= auswahl;
END;

BEGIN
  repeat
  until menue = #27;
END.

Schon sind alle globalen Variablen verschwunden. Weiß aber nicht, obs so auch 100%ig läuft, habs selbst grad nicht durch den Compiler geschickt.

Aber ich merk schon, ich bin etwas aus der Übung.
 
Ich danke dir =) soweit geht alles =)

Nun mache ich noch einige kleine Anpassungen, wobei ich bei der Procedur zum Fortgeschrittenem sowie zum Profi Modus noch eine Frage habe.

Ich dachte eigentlich, den "hardmode" mache ich, dass sofort am Anfang 200 X per Zufall gesetzt werden:

PHP:
PROCEDURE eingeben_von_x_und_y_hardmode;
VAR
 counter:INTEGER;
BEGIN
counter:=0;
REPEAT
 x:=RANDOM(60);
 y:=RANDOM(20);
 counter:=counter+1;
UNTIL counter=200;
WRITELN('Bitte X eingeben:');
READLN(x);
WRITELN('Bitte Y eingeben:');
READLN(y);
END;

aber irgendwie geht das nicht -.- hat jemand ne Idee was ich ändern muss?

Hier nochmal das momentane aktuelle Program, welches auch soweit funktioniert. Das einzige, manchmal verrutscht irgendwie alles, also dann schreibt der was an eine falsche Stelle, aber denke, dass kann man nachher ändern ^^

PHP:
PROGRAM forum;
USES crt;

VAR
  auswahl : CHAR;
  x,y: INTEGER;
  spielfeld: ARRAY [1..60,1..20] OF STRING;

(*=======================================PROCEDURES=======================================*)

PROCEDURE willkommen;
BEGIN
WRITELN('Viel Spass beim spielen!');
END;

PROCEDURE bildschirm_putzen;
VAR
  leerzeilen:INTEGER;
BEGIN
leerzeilen:=0;
REPEAT
  WRITELN (' ');
  leerzeilen:=leerzeilen+1;
UNTIL
leerzeilen=25;
END;

PROCEDURE warten;
VAR
  zaehlen:LONGINT;
BEGIN
zaehlen:=0;
REPEAT
  zaehlen:=zaehlen+1;
UNTIL zaehlen=900000000;
END;

PROCEDURE warten_hardmode;
VAR
  zaehlen:LONGINT;
BEGIN
zaehlen:=0;
REPEAT
  zaehlen:=zaehlen+1;
UNTIL zaehlen=500000000;
END;

PROCEDURE initialisieren;
VAR
  xpos,ypos:INTEGER;
BEGIN
ypos:=1;
REPEAT
  xpos:=1;
  REPEAT
    spielfeld[xpos,ypos]:='-';
    xpos:=xpos+1;
  UNTIL xpos=61;
  ypos:=ypos+1;
UNTIL ypos=21;
END;

PROCEDURE leeres_spielfeld_anzeigen;
VAR
  zeilen:INTEGER;
BEGIN
gotoxy(1,1);
WRITELN('I------------------------------------------------------------I');
zeilen:=0;
REPEAT
  WRITELN('I                                                            I');
  zeilen:=zeilen+1;
UNTIL zeilen=20;
WRITELN('I------------------------------------------------------------I');
END;

PROCEDURE eingeben_von_x_und_y_easymode;
BEGIN
WRITELN('Bitte X eingeben:');
READLN(x);
WRITELN('Bitte Y eingeben:');
READLN(y);
END;

PROCEDURE eingeben_von_x_und_y_hardmode;
VAR
 counter:INTEGER;
BEGIN
counter:=0;
REPEAT
 x:=RANDOM(60);
 y:=RANDOM(20);
 counter:=counter+1;
UNTIL counter=200;
WRITELN('Bitte X eingeben:');
READLN(x);
WRITELN('Bitte Y eingeben:');
READLN(y);
END;

PROCEDURE eintragen_des_Punktes;
BEGIN
gotoxy(x+1,y+1);
WRITE('X');
IF x<>0
  THEN spielfeld[x,y]:='X';
END;

PROCEDURE ges_spielfeld_anzeigen;
VAR
  xpos,ypos:INTEGER;
BEGIN
ypos:=1;
REPEAT
  xpos:=1;
  REPEAT
    gotoxy(xpos+1,ypos+1);
    write(spielfeld[xpos,ypos]);
    xpos:=xpos+1;
  UNTIL xpos=61;
  ypos:=ypos+1;
UNTIL ypos=21;
END;

PROCEDURE modus_leicht;
VAR
 ende:INTEGER;
BEGIN
initialisieren;
 REPEAT
  bildschirm_putzen;
  leeres_spielfeld_anzeigen;
  eingeben_von_x_und_y_easymode;
 IF spielfeld[x,y]='X' THEN ende:=1 ELSE ende:=0;
  eintragen_des_Punktes;
  warten;
  ges_spielfeld_anzeigen;
  warten;
 UNTIL ende=1;
END;

PROCEDURE modus_mittel;
BEGIN
  writeln('Fortgeschritten gewaehlt');
END;

PROCEDURE modus_schwer;
VAR
 ende:INTEGER;
BEGIN
initialisieren;
 REPEAT
  bildschirm_putzen;
  leeres_spielfeld_anzeigen;
  eingeben_von_x_und_y_hardmode;
 IF spielfeld[x,y]='X' THEN ende:=1 ELSE ende:=0;
  eintragen_des_Punktes;
  warten_hardmode;
  ges_spielfeld_anzeigen;
  warten_hardmode;
 UNTIL ende=1;
END;

PROCEDURE hilfe;
BEGIN
WRITELN('Hilfe');
WRITELN('-----');
WRITELN('');
WRITELN('Waehrend des spielens kann das Spiel wie folgt beendet werden:');
WRITELN('- fuer X 0 angeben');
WRITELN('');
WRITELN('Ziel des Spiels');
WRITELN('---------------');
WRITELN('Alle 1200 Felder zu kreuzen, ohne ein Feld doppelt gekreuzt zu haben.');
END;

PROCEDURE credits;
BEGIN
WRITELN('Credits');
WRITELN('-------');
WRITELN('');
WRITELN('HIER ALLE CREDITS');
END;

(*=======================================PROCEDURES=======================================*)

BEGIN
  REPEAT
    clrscr;
    writeln('Spielmodi');
    writeln('-------------------');
    writeln('(1) Anfaenger');
    writeln('(2) Fortgeschritten');
    writeln('(3) Profi');
    writeln;
    writeln('(4) Hilfe');
    writeln('(5) Credits');
    writeln('<ESC> Beenden');
    writeln;
    auswahl:= readkey;

    CASE auswahl OF
      '1': modus_leicht;
      '2': modus_mittel;
      '3': modus_schwer;
      '4': hilfe;
      '5': credits;
      #27: exit;
    END;

    writeln;
    writeln('Druecke <ESC> zum Beenden oder <ENTER>, um das Menue wieder anzuzeigen!');
    REPEAT
      auswahl:= readkey;
    UNTIL (auswahl = #13) OR (auswahl = #27);
  UNTIL auswahl = #27;
END.
 
An dieser Stelle wärs dann doch erstmal interessant, wie das Spielprinzip überhaupt aussieht bzw. ausehen soll.

Und eine REPEAT [...] UNTIL [...] nimmt man nicht, wenn man einfach nur einen Wert hochzählt und diesen dann als Abbruchbedingung hat.
Dafür nimmt man eine FOR-Schleife, die extra für sowas gedacht ist.
 
Zuletzt bearbeitet:
Rockzz schrieb:
Ich dachte eigentlich, den "hardmode" mache ich, dass sofort am Anfang 200 X per Zufall gesetzt werden:

PHP:
PROCEDURE eingeben_von_x_und_y_hardmode;
VAR
 counter:INTEGER;
BEGIN
counter:=0;
REPEAT
 x:=RANDOM(60);
 y:=RANDOM(20);
 counter:=counter+1;
UNTIL counter=200;
WRITELN('Bitte X eingeben:');
READLN(x);
WRITELN('Bitte Y eingeben:');
READLN(y);
END;

aber irgendwie geht das nicht -.- hat jemand ne Idee was ich ändern muss?

Du überschreibst nun 200 Mal die Variablen x und y und dann werden sie wieder überschrieben. Diesmal durch die Eingabe des Benutzers.
Für den Befehl "Random" muss auch einmal der Befehl "Randomize" aufgerufen werden.

Da ich auch nicht verstehe, was du überhaupt mit diesem Stück Code erreichen willst, kann ich dir auch nicht weiterhelfen. Oder willst du die Werte in einem Array gespeichert haben?

Anscheinend kennst du dich kein Stück mit der Programmierung aus. Darum bitte ich dich auch das nächste Mal vorsichtig zu sein, wenn du dich weit aus den Fenster lehnst und meinst, du kennst alles und es wäre für dich langweilig.
 
Am besten erstmal den ganzen Code komplett beiseite legen.
Dann nimmst dir Zettel und Stift und schreibst erstmal mit normalen Worten geordnet auf, was im Spiel an welcher Stelle passieren soll.
Danach kann man dann langsam anfangen das Aufgeschriebene in Code zu übersetzen.
 
resusseleman schrieb:
An dieser Stelle wärs dann doch erstmal interessant, wie das Spielprinzip überhaupt aussieht bzw. ausehen soll.

Das Spiel aehnelt dem Minesweaper von Windows, man setzt Kreuze in einem Feld (60x20), man darf kein X 2x auf 1 Feld gesetzt haben, und je nach Schwierigkeit, soll kein Feld vorher besetzt werden, per Zufall zwischendurch einfach ein X gesetzt werden, oder direkt von Anfang an 200 Stück. Dazu wird die Zeit wo die gesetzten Xe angezeigt werden bei der Stufe Profi kürzer.

Whiz-zarD schrieb:
Du überschreibst nun 200 Mal die Variablen x und y und dann werden sie wieder überschrieben.

Da ich auch nicht verstehe, was du überhaupt mit diesem Stück Code erreichen willst, kann ich dir auch nicht weiterhelfen. Oder willst du die Werte in einem Array gespeichert haben?

Ein Schulkamerad meinte zu mir, wenn ich möchte, das der mir per Zufall ein X setzt, muss ich schreiben x:=RANDOM(60) die 60 weil das Spielfeld 60x20 ist und x ist die Breite, und y:=RANDOM(20) weil es 20 hoch ist.

Eigentlich sollte der dann dafür Punkte auswählen und dort ein X setzen.

Whiz-zarD schrieb:
Anscheinend kennst du dich kein Stück mit der Programmierung aus. Darum bitte ich dich auch das nächste Mal vorsichtig zu sein, wenn du dich weit aus den Fenster lehnst und meinst, du kennst alles und es wäre für dich langweilig.

Ich meinte, das was wir in der Schule machen ist für mich langeweilig, das eigentliche Programm was wir dort hatten war verarsch dich selber...wir haben ein Feld und man soll Xe setzen, man darf keins zwei mal auf die selbe Stelle setzen, und da könnte man theoretisch nach System vorgehen und 1200 Xe setzten -.-

Das ich mich nicht auskenne stimmt, ich habe mich mit komplizierterem noch nicht auseinander gesetzt, frage daswegen bei diesen Dingen hier um Rat =(
 
Bevor du RANDON() sinnvoll nutzen kannst musst du einmal RANDOMIZE; aufrufen, um den Zufallsgenerator zu starten. Ansonsten kriegst du ständig die gleiche "Zufallszahl".
 
Ich kann dir nur sagen: Vergess das Spiel und lern erstmal die Basics, da du anscheinend auch nichts im Unterricht gelernt hast. Bis jetzt ist an diesem komischen Spiel nichts kompliziertes. Das sind die reinen Basics.
Random() macht nichts weiter, als dir eine Zahl zwischen 0 und 1 zu nennen. Der Parameter (Die Zahl in der Klammer) wird dann mit der Zahl multipliziert. Die Zahl ist auch keine richtige Zufallszahl. Sie wird durch die Systemuhrzeit berechnet. Allerdings fehlt bei dir der Befehl Randomize(). Randomize() initialisiert einen einen Zufallsgenerator, der zwar sich ebenfalls aus der Systemuhrzeit berechnet, allerdings verändert sich dieser Wert immer. Random() greift dann auf die Zahl von Ramdomize() zurück.

Es wird aber kein X oder sonstiges gesetzt. Es wird lediglich die Variable x mit dem Wert gefüllt.

Plane lieber ein einfacheres Spiel. Ich denke mal, dass du selbst an einem simplen Zahlenrate Spiel viel zu knabbern haben wirst, bei deinem Wissensstand. Das jetzige Spiel ist wohl eine Nummer zu groß. (was auch immer das für ein Spiel werden sollte)
 
Zurück
Oben