Lazarus Programm schreiben: Böse Sechs!

Rund um die LCL und andere Komponenten

Lazarus Programm schreiben: Böse Sechs!

Beitragvon Coolend » 16. Dez 2017, 17:30 Lazarus Programm schreiben: Böse Sechs!

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
Coolend
 
Beiträge: 3
Registriert: 16. Dez 2017, 17:25

Beitragvon Warf » 16. Dez 2017, 17:45 Re: Lazarus Programm schreiben: Böse Sechs!

Es gibt die Funktion Random. Link
Das beispiel auf der Seite enthält alles was du wissen musst
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Coolend » 17. Dez 2017, 17:29 Re: Lazarus Programm schreiben: Böse Sechs!

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.
Coolend
 
Beiträge: 3
Registriert: 16. Dez 2017, 17:25

Beitragvon Epcop » 17. Dez 2017, 18:39 Re: Lazarus Programm schreiben: Böse Sechs!

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 17. Dez 2017, 18:45, insgesamt 1-mal geändert.
Epcop
 
Beiträge: 81
Registriert: 29. Mai 2012, 08:36

Beitragvon Coolend » 17. Dez 2017, 18:45 Re: Lazarus Programm schreiben: Böse Sechs!

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
Coolend
 
Beiträge: 3
Registriert: 16. Dez 2017, 17:25

Beitragvon Epcop » 17. Dez 2017, 19:05 Re: Lazarus Programm schreiben: Böse Sechs!

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.
Epcop
 
Beiträge: 81
Registriert: 29. Mai 2012, 08:36

Beitragvon Mathias » 17. Dez 2017, 20:07 Re: Lazarus Programm schreiben: Böse Sechs!

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Epcop » 17. Dez 2017, 20:52 Re: Lazarus Programm schreiben: Böse Sechs!

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
Epcop
 
Beiträge: 81
Registriert: 29. Mai 2012, 08:36

Beitragvon AndreasMR » 17. Dez 2017, 23:47 Re: Lazarus Programm schreiben: Böse Sechs!

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
AndreasMR
 
Beiträge: 86
Registriert: 4. Aug 2015, 14:29
OS, Lazarus, FPC: Linux, Raspbian, Windows | 
CPU-Target: 64/32 Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried