Lazarus Programm schreiben: Böse Sechs!

Rund um die LCL und andere Komponenten
Antworten
Coolend
Beiträge: 3
Registriert: Sa 16. Dez 2017, 17:25

Lazarus Programm schreiben: Böse Sechs!

Beitrag von Coolend »

Hey Leute
ich bin neu hier und habe ne frage zu einem Programm.
Bin ein kompletter Anfänger in Lazarus und muss folgendes Programm schreiben.

2 Spieler
Würfeln bis man 100 Punkte erreicht (Würfel zahl wird addiert)
Sobald man eine 6 würfelt werden die Punkte zurückgesetzt und der andere Spieler hat seine Chance.

Ich weiß leider garnicht wie ich anfangen soll. Für ein paar Tipps wäre ich sehr dankbar.

Schönes Wochenende noch :)
LG Coolend

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Warf »

Es gibt die Funktion Random. Link
Das beispiel auf der Seite enthält alles was du wissen musst

Coolend
Beiträge: 3
Registriert: Sa 16. Dez 2017, 17:25

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Coolend »

Habe jetzt den Random befehl eingebaut aber komme immernoch nicht vorran.
Kann mir da eventuell noch jemand helfen?

Quellcode:
program boese_sechs;
var i,wurf,spielstand : integer;
var e,j,n: string;
begin
writeln('Spielregeln: Es wird solange gewuerfelt bis der Spieler eine 6 Wuerfelt oder man den Zug beendet.');
writeln('Sobald die Zahl 6 gewuerfelt wird ist der Zug vorbei und die Punkte werden auf 0 gesetzt.');
writeln('Die Punktezahl ergibt sich aus der Augenzahl des Wuerfels');
writeln('Ziel ist es die Hoehere Punktzahl zu erreichen. Die Obergrenze liegt bei 100');
writeln('Druecke Enter um das Spiel zu starten!');
readln();
randomize();

for i:=1 to 100 do
wurf:=random(6)+1;
if (wurf<5) then
spielstand:=spielstand+wurf else
writeln('Du hast eine 6 gewuerfelt und Verloren! :(');

writeln('Dein Spielstand ist: ',spielstand);

writeln('Willst du weiter spielen? Dann druecke "Enter"');
readln();

end.

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Epcop »

Im Prinzip schon richtig. Was mir aufgefallen ist, begin und end müssen hier rein, sonst wird der Wurf nicht überprüft
, mal ganz grob ergänzt, ungetest:

Coolend hat geschrieben:Quellcode:
program boese_sechs;
var i,wurf,spielstand : integer;
var e,j,n: string;
begin
writeln('Spielregeln: Es wird solange gewuerfelt bis der Spieler eine 6 Wuerfelt oder man den Zug beendet.');
writeln('Sobald die Zahl 6 gewuerfelt wird ist der Zug vorbei und die Punkte werden auf 0 gesetzt.');
writeln('Die Punktezahl ergibt sich aus der Augenzahl des Wuerfels');
writeln('Ziel ist es die Hoehere Punktzahl zu erreichen. Die Obergrenze liegt bei 100');
writeln('Druecke Enter um das Spiel zu starten!');
readln();
randomize();
spielstand := 0;
// begin und end nicht vergessen!!
for i:=1 to 100 do begin // Würfel wird 100 mal gewürfelt
wurf:=random(5)+1; //!? =1-6

if (wurf<=5) then begin // .. jetzt wird auch jeder wurf überprüft
spielstand:=spielstand+wurf
// if spielstand > 100,...
end else begin
writeln('Du hast eine 6 gewuerfelt und Verloren! :('); exit; end;
end;

writeln('Dein Spielstand ist: ',spielstand);

writeln('Willst du weiter spielen? Dann druecke "Enter"');
readln();

end.



Unklar sind mir noch die Spielregeln bzw. der Ablauf. Das ist für den Programmablauf dann wichtig.
Soll jeder abwechselnd würfeln? Verliert die 6 sofort oder wird auf 0 zurückgesetzt und der erste mit 100 punkte hat gewonnen? usw.
Zuletzt geändert von Epcop am So 17. Dez 2017, 18:45, insgesamt 1-mal geändert.

Coolend
Beiträge: 3
Registriert: Sa 16. Dez 2017, 17:25

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Coolend »

Also ich habe es nochmal neu angefangen weil mit einer For schleife das nicht funktioniert hat.
Spielregeln lauten wie folgt:
Ein Spieler Würfelt eine Zahl bsp. 3, dann hat er die Möglichkeit entweder aufzuhören oder weiterzumachen.
Macht er weiter dann kommt eine neue Zahl hinzu bsp. 4. Jetzt ist der Punktestand bei 4
Jetzt kann er wieder entscheiden ob er aufhören will.
Und immer so weiter bis 100 Punkte
Aber sobald eine 6 kommt werden die Punkte auf 0 gesetzt und das Spiel ist vorbei und der andere spieler beginnt.

Mein Neuer Quellcode mit While schleife:
program boese_sechs;
var i,wurf,spielstand : integer;
var e,j,n: string;
begin
writeln('Spielregeln: Es wird solange gewuerfelt bis der Spieler eine 6 Wuerfelt');
writeln('Sobald die Zahl 6 gewuerfelt wird ist der Zug vorbei und die Punkte werden auf 0 gesetzt.');
writeln('Die Punktezahl ergibt sich aus der Augenzahl des Wuerfels');
writeln('Ziel ist es die Hoehere Punktzahl zu erreichen. Die Obergrenze liegt bei 100');
writeln('Druecke Enter um das Spiel zu starten!');
readln();
randomize();


while (wurf<>6) do
begin
wurf:=random(6)+1;
Writeln('Dein Wurf war: ',wurf);
spielstand:=spielstand+wurf;
writeln('Dein aktueller Spielstand lautet: ',spielstand,', Weitermachen? "J" oder "N"');
readln(e);
if e='N' then
writeln('Dein aktueller Punktestand lautet: ',spielstand);

if wurf=6 then
spielstand:=0;
writeln('Du hast verloren dein Spielstand lautet: ',spielstand);
end;
readln();
end.


Ich hoffe das hilft ^^
Bin echt am verzweifeln sitze da schon 3 stunden dran und bin langsam echt mit der Geduld am ende.
Auch wenn es nur die Basics sind ich bin nicht so fit in dem Thema :D
LG

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Epcop »

Du bist doch schon fast Fertig :-)

Ich habe mein vorherigen Beitrag nochmal bearbeitet, zeitgleich mit deinem neuen Beitrag.

Die For-Schleife war prinzipiell schon OK, nur musst du Wissen, wann du dort aussteigst.

Bei deinem letzten Code vermisse ich wieder begin...end . Auch wenn man das nicht immer braucht, empfehle ich das anzugewöhnen. Das ist fürs Auge einfach schöner und vermeidet einfach Fehler die man später ewig sucht. Ohne begin...end (bei if) wird nur der erste nachfolgende Befehle beachtete, je nach Bedingung. Der zweite wird dann immer ausgeführt - und das ist nicht immer gewollt und führt zu fragwürdigen resultaten. In deinen Beispielen ist das ein großes Problem (z.B. wird immer ausgeführt, auch wenn keine 6 gewürfelt wird: writeln('Du hast verloren dein Spielstand lautet: ',spielstand); )

Wenn das Spiel zuende ist..., hier fehlt bei dir irgendwo ein "exit" oder ähnliches.

Bei solchen Abläufen zeichne ich mir gerne eine Skizze auf ein Blatt Papier, was wann geschehen soll. Das hilft dann beim programmieren die Übersicht zu behalten.

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Mathias »

Code: Alles auswählen

var
  anzWurf, Punkte, wurf: integer;
 
begin
  Randomize;
  Punkte := 0;
  anzWurf := 0;
  repeat
    Inc(anzWurf);
    wurf := Random(6) + 1;
    if wurf = 6 then begin
      Punkte := 0;
    end else begin
      Inc(Punkte, wurf);
    end;
    WriteLn('Wurf:', wurf: 3, '  Punkte:', Punkte: 4);
  until Punkte >= 100;
  WriteLn('Du hast ', anzWurf, ' Würfe gebraucht');
end

Ups, ich habe fast 2'500 Würfe gebraucht, bis ich >100 erreicht hatte. :shock:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von Epcop »

Mathias hat geschrieben:Ups, ich habe fast 2'500 Würfe gebraucht, bis ich >100 erreicht hatte. :shock:


Sowas aber auch... kann man auch in 20 Würfen schaffen :-P

AndreasMR
Beiträge: 98
Registriert: Di 4. Aug 2015, 15:29
OS, Lazarus, FPC: Linux, Raspbian, Windows
CPU-Target: 64/32 Bit

Re: Lazarus Programm schreiben: Böse Sechs!

Beitrag von AndreasMR »

Hallo Epcop,

aber auch nur in einem von 6^20 = 3656158440062976 Fällen. Also sehr selten... :lol:


Beste Grüße

Andreas
Ubuntu 14.04 LTS / Raspbian / Windows: Lazarus ab 0.9 bis 3.0

Antworten