Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   primitives mau mau spiel (https://www.delphipraxis.net/69547-primitives-mau-mau-spiel.html)

track 16. Mai 2006 21:15


primitives mau mau spiel
 
Liste der Anhänge anzeigen (Anzahl: 1)
moin moin

hab hier ein primitives mau mau spiel programmiert....das problem ist es hängt sich irgendwie auf wenn der stock am ende ist!
kann sich das jemand anschauen? ich debugge mich schon tod hier!
wäre nett wenn sich jemand findet der etwas zeit hat!

track 17. Mai 2006 09:50

Re: primitives mau mau spiel
 
keiner eine idee?
na hättet doich wenigstens schreiben können das der quelltext unübersichtlich ist! :wall:

NormanNG 17. Mai 2006 11:23

Re: primitives mau mau spiel
 
Hi,

wenn der Stapel leer ist, beibt er in uLogik.KarteGeben hängen...

track 17. Mai 2006 14:00

Re: primitives mau mau spiel
 
wie fang ich das denn ab?
so sollte das doch funktionieren oder nicht?

Delphi-Quellcode:
procedure KarteGeben(var KartenName : String;var KartenWert:byte);
begin
  if Stapel <>[] then begin
  repeat
    KartenWert := randomrange(Low(TKarten),High(TKarten));
  until KartenWert in Stapel;
  KartenName := cKartenName[KartenWert];
  Stapel := Stapel - [KartenWert];
  end;

end;

Klaus01 17. Mai 2006 15:10

Re: primitives mau mau spiel
 
kannst Du mal bitte schreiben, was für ein Typ stapel ist
Ich denke mal ein set of irgendwas
aber kann man von einem Set etwas subtrahieren?

Stapel := Stapel - [KartenWert];

Vielleicht ist das besser:

Zitat:

Removes an element from a set.
Unit

System

Category

set handling routines

procedure Exclude(var S: set of T;I:T);

Description

The Exclude procedure removes element I from set S.
S is a set type variable, and I is an expression of a type compatible with the base type of S.
The construct Exclude (S, I) corresponds to S := S - (I) but the Exclude procedure generates more efficient code.
Grüße
Klaus

NormanNG 17. Mai 2006 15:19

Re: primitives mau mau spiel
 
Hi,

Wenn du den Stapel bereits zufällig füllst, dann kannst du in KarteGeben völlig auf random verzichten und nimmst immer die oberste Karte. Das Berechnen einer Zufallszahl im Maximalbereich solange, bis der Wert (zufällig) im Stapel gefunden wird, ist sicher nicht optimal.

P.S.:
@Klaus01
Delphi-Quellcode:
Stapel := Stapel - [KartenWert];
das ist schon ok. hier wird KartenWert aus dem Set entfernt.

track 17. Mai 2006 15:56

Re: primitives mau mau spiel
 
NormanNG
stapel ist bei eine menge und in einer menge sind alle werte so weit ich mich richtig errinern kann geordnet!
desswegen ist ja auch der random!
die menge kann ich leider nicht rausnehemen da es in der aufgaben stellung steht!

Klaus01

Delphi-Quellcode:
TKarte = set of 0..KartenAnzahl-1;//32 karten
Stapel : TKarte;
und aus der menge kann man subtrahieren, ich ziehe damit eine karte aus der menge

NormanNG 17. Mai 2006 16:32

Re: primitives mau mau spiel
 
OK, du hast natürlich Recht.
Ich war gedanklich bei einem Array... und im Set ist die Reihenfolge festgelegt. Damit scheidet das "Mischen" beim Initialisieren aus.


Warum auch immer, das randomrange scheint den oberen Wert nie zu liefern, obwohl dies in den OH behauptet wird:
Zitat:

RandomRange gibt einen zufälligen Integer-Wert im Bereich von AFrom bis ATo zurück (inklusive).
Also damit klappt es:
Delphi-Quellcode:
KartenWert := randomrange( Low(tKarten), High(TKarten)+1 );
Aber es bleibt immer noch das Problem, wenn der Stapel leer ist und KarteGeben aufgerufen wird. Du kannst ja die Elemente im Set zählen und ggf. anders reagieren:

Delphi-Quellcode:
type
    TKarten = 0..KartenAnzahl-1;
    TKarte = set of tKarten;


  function AnzElemente(ASet: TKarte): Integer;
  var
    i: TKarten;
  begin
    Result := 0;
    for i := High(TKarten) downto Low(TKarten) do
      if i in ASet then Begin
        Inc(Result);
      end;
  end;

[edit]Schreibfehler korrigiert :stupid: [/edit]

track 18. Mai 2006 08:11

Re: primitives mau mau spiel
 
das komische daran ist wen der spieler dran ist und die karten fast alle sind...dann klappt es wunder bar, und beim pc hackt es

wenn wir das nun so machen
Zitat:

KartenWert := randomrange( Low(tKarten), High(TKarten)+1 );
dann kann man komischerweise mehr karten ziehen als es geht!

NormanNG 18. Mai 2006 08:42

Re: primitives mau mau spiel
 
Hi,

Delphi-Quellcode:
KartenWert := randomrange( Low(tKarten), High(TKarten)+1 );
Ich hab's nochmal getestet: diese Anweisung liefert (ziemlich gleichverteilt) zufällige Werte zwischen 0 und 15 (inklusive beider Grenzen).

Damit wird in "kartegeben" solange ein kartenwert erzeugt, bis auch die letzte Karte vom Stapel gezogen wurde. Soweit stimmt es.


Die beiden Funktionen SpielerGewonnen und PCGewonnen haben auch noch einen Fehler.
Delphi-Quellcode:
function SpielerGewonnen(computer : boolean) : Boolean;
begin
  if ((SpielerBlatt = []) or (Stapel = []) and (Computer)) then
      SpielerGewonnen := true;
end;

function PCGewonnen(computer : boolean) : Boolean;
begin
  if ((ComputerBlatt = []) or (Stapel = []) and (not Computer)) then
      PCGewonnen := true;
end;
im Else-Fall ist der Funktionswert nicht definiert!
Richtiger:
Delphi-Quellcode:
function SpielerGewonnen(computer : boolean) : Boolean;
begin
  SpielerGewonnen := ((SpielerBlatt = []) or (Stapel = []) and (Computer)) ;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz