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/)
-   -   Delphi Kleines Problem mit Grundlagen // Minigame (https://www.delphipraxis.net/160913-kleines-problem-mit-grundlagen-minigame.html)

shillok 7. Jun 2011 15:55

Kleines Problem mit Grundlagen // Minigame
 
Hallöchen zusammen,

ich bin neu in Delphi und bin gerade dabei ein kleinen Spiel zu basteln. Auf viele meiner vorrausgehenden Fragen konnte ich in euerm super Forum schon antworten finden, jetzt aber leider nicht.
Und zwar geht es darum:
Ich habe oben 6 Panels auf denen jeweils eine Zufallszahl ausgegeben wird. Jetzt brauche ich irgendwie eine procedure die mir bei der auswertung hilft. und zwar soll für jede angezeigte Eins 100Punkte, für jede angezeigte Fünf 50 Punkte, für jeden Dreierpasch die hundertfach Punktzahl der gewürfelten Zahl (also bei 3x4=400 Punkte, 3x6=600Punkte) und bei einer Straße 2000Punkte zum Punktestand dazugezählt werden.
den Punktestand habe ich als globale variable. aber ich bekomme einfach keine abfrage hin, bei der die punkte korrekt dazuaddiert werden..

Ich hoffe ihr könnt mit meinen mageren Infos etwas anfangen. Wie gesagt bin erst in den Kinderschuhen mit Delphi, ahbe aber unglaublich Spaß daran.

Für jede Hilfe schonmal danke!

MfG

Shillok

hans ditter 7. Jun 2011 16:08

AW: Kleines Problem mit Grundlagen // Minigame
 
hi und herlich willkommen in der DP! :hi: :dp:

du musst dir überlegen, was genau du machen willst. Du willst ja wissen, welche Zahlen auf den Panels liegen. Ich würde jetzt anfangen, dass mit if-Abfragen zu lösen.

Also z.B.
Delphi-Quellcode:
if Panel1.Caption = 1 AND
           Panel2.Caption = 2 AND
           // usw.
Am Ende baust du dann noch ein Break rein, dass nicht alles doppelt und dreifach dazuaddiert wird und schon sollte es funktionieren. Dürfte jetzt allerdings erstmal ein wenig Tipparbeit werden.

Alternativ könnte man sich natürlich auch einen mathematischen Ansatz suchen, allerdings dürfte das Finden dafür wesentlich schwieriger werden...

LG; hans ditter

shmia 7. Jun 2011 16:19

AW: Kleines Problem mit Grundlagen // Minigame
 
Grundlage von eigentlich allen Spielen ist, dass das Programm ein internes Modell des Spiels hat.
Dieses interne Model wird dann am Bildschirm angezeigt (Visualisierung).

In dem Fall wäre das Model bzw. ein Teil davon der "Wurf".
Delphi-Quellcode:
type
  TWuerfelwert = 0..6;
  TWurf = array[1..6] of TWuerfelwert;
var
  wurf : TWurf;
Beim Würfelwert habe ich 0 zugelassen als Kennung, dass noch nicht gewürfelt wurde.
Und so würde man würfeln:
Delphi-Quellcode:
procedure ZufaelligWuerfeln;
var
  i : integer;
begin
  for i := low(wurf) to high(wurf) do
     wurf[i] := 1 + Trunc(random(6));
end;
Und so würde man suchen, wieviele "Einser", "Zweier", "Sechser" in dem Wurf sind:
Delphi-Quellcode:
function AnzahlGleicherZahl(zahl : integer);
var
  i : integer;
begin
  Result := 0;
  for i := low(wurf) to high(wurf) do
     if wurf[i] = zahl then
        Inc(Result);
end;

if AnzahlGleicherZahl(5) = 2 then
   ShowMessage('Fünfer Pasch!');

blackfin 7. Jun 2011 16:26

AW: Kleines Problem mit Grundlagen // Minigame
 
Du kannst dir für das Zählen der Zahlenwerte erstmal ein array von 1-6 anlegen, z.B.

Delphi-Quellcode:
var
NumberCount : array[1..6] of Byte;
Dann gehst du in deiner Routine die 6 Panels durch und schaust über eine case-Anweisung, welche Zahl das ist und zählst den entsprechenden Index im Array hoch, zusätzlich zählst du bei einer 1 oder 5 die 100 / 50 Punkte dem TotalWert hinzu.

Dann, wenn du alle Werte hast, gehst du das "NumberCount"-Array am Schluss in einer Schleife durch und berechnest den zusätzlichen Punktewert für den Dreierpasch folgendermaßen:

((Wert des Array-Index div 3) * Augenzahl) * 100
und zählst diesen Wert pro Array-Index wieder dem Totalwert hinzu.

Für die Strasse(n) kannst du folgendermaßen vorgehen:
Vor dem Durchgehen des "Numbercount"-Arrays setzt du einen Zählerwert auf 0.
Während du das Array dann in einer Schleife durchgehst, addierst du für jeden Wert des Arrays, der ungleich 0 ist, eine 1 hinzu, bei 0 setzt du den Zählerwert wieder auf 0, da ja die "Strasse" unterbrochen wurde.

Wenn dann eine Strasse gewürfelt wurde, steht der Zähler am Schluss entweder auf 4 (kleine strasse), 5 (grosse Stasse), 6 (alle augen) oder auf einer kleineren Zahl (keine Punkte).
Dann kannst du anhand dieses Werts die entsprechenden Punkte addieren (und kannst ggf. auch für 0-3 des Zählers noch Punkte hinzufügen, falls später nötig).

shillok 7. Jun 2011 16:31

AW: Kleines Problem mit Grundlagen // Minigame
 
Danke schonmal für eure beiden schnellen Antworten.
@shmia: da steige ich leider komplett aus :D sorry!
Ich habe jetzt folgendes:
Delphi-Quellcode:
procedure TForm1.PunkteZaehlenSp1;
var MomentPunkteSp1 : Integer;
begin
                MomentPunkteSp1:=PunkteSpieler1;
                                if Panel_Zahl1.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
                                if Panel_Zahl2.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
                                if Panel_Zahl3.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
                                if Panel_Zahl4.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
                                if Panel_Zahl5.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
                                if Panel_Zahl6.Caption=1
                                  then PunkteSpieler1:=Integer(MomentpunkteSp1+TrefferEinser);
Wobei TrefferEiner global als integer und bei FormCreat mit
Delphi-Quellcode:
        TrefferEinser:=100;
angegeben ist.
PunkteSpieler1 soll die Variable sein die dann das Spiel über die Punkte anzeigt...

blackfin 7. Jun 2011 17:04

AW: Kleines Problem mit Grundlagen // Minigame
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mal so hingeworfen, analog zu meinem vorherigen Post....
Wenn jemand einen (Denk)-Fehler sieht, schreien:

Delphi-Quellcode:

var
  TotalPoints : Integer = 0 ;
  Wuerfel : array[1..6] of Byte ;

procedure WuerfelnUndAuswerten();
var
  FPanel : TPanel ;
  FValue : Integer ;
  FPaschCount : Integer ;
  FStrassenCount : Integer ;
  FStrassenString : string ;
  i: Integer ;
begin

   // Erstmal würfeln
   TotalPoints := 0 ;
   Randomize() ;
   for i := Low(Wuerfel) to High(Wuerfel) do
   begin
      Wuerfel[i] := 0 ;
      FPanel := TPanel(FindComponent('Panel'+IntToStr(i))) ;
      FPanel.Caption := IntToStr(Random(6)+1) ;
   end;

   // Einzelne Punkte für Augen auswerten und Anzahl gleicher Würfel erhöhen
   for i := Low(Wuerfel) to High(Wuerfel) do
   begin
      FPanel := TPanel(FindComponent('Panel'+IntToStr(i))) ;
      FValue := StrToInt(FPanel.Caption) ;

      // Würfel-Array-Index für den gewürfelten Wert erhöhen
      Inc(Wuerfel[FValue]) ;

      // Punkte für 1 und 5 hinzufügen
      case FValue of
         1: TotalPoints := TotalPoints + 100 ;
         5: TotalPoints := TotalPoints + 50 ;
      end;
   end;

   // Auswertung von 3er-Päschen und Strassen
   FStrassenCount := 0 ;
   FPaschCount := 0 ;
   for i := Low(Wuerfel) to High(Wuerfel) do
   begin

     // 3er-Päsche auswerten und Puntke hinzufügen
     // ((Anzahl Würfel div 3) * Augenzahl) * 100
     FValue := (((Wuerfel[i] div 3) * i) * 100) ;
     TotalPoints := TotalPoints + FValue ;
     if (FValue > 0) then FPaschCount := FPaschCount + (Wuerfel[i] div 3);

     // Wenn der Wert > 0 ist, den "Strassenzähler" eins hochsetzen, ansonsten annullieren
     if (Wuerfel[i] = 0) then
       FStrassenCount := 0
     else
       Inc(FStrassenCount) ;

   end;

   // Strassen / Kniffel auswerten
   case FStrassenCount of

     4:
     begin
       FStrassenString := 'kleine Strasse' ;
       TotalPoints := TotalPoints + 2000 ;
     end;

     5:
     begin
       FStrassenString := 'grosse Strasse' ;
       TotalPoints := TotalPoints + 2000 ;
     end;
     
     6:
     begin
       FStrassenString := 'Kniffel!' ;
     end;

     else
        FStrassenString := 'keine' ;

   end;

   Label1.Caption := 'Punkte: ' + IntToStr(TotalPoints) ;
   Label2.Caption := 'Anzahl 3er-Päsche: ' + IntToStr(FPaschCount) ;
   Label3.Caption := 'Strasse: ' + FStrassenString ;
end;
Natürlich kann man das im späteren Verlauf eleganter machen, ohne Panel-Caption-Umwandlungen, also dass du zuerst rein rechnerisch würfelst und dann erst am Schluss das ganze in die GUI jagst, aber das ist dir überlassen :D
Soll ja erstmal nur ein Denkanstoss sein und ich bin von deinem Ausgangspunkt ausgegangen: 6 Zahlen als Captions auf den Panels :-)


Edit: Projekt angehängt

shillok 7. Jun 2011 17:15

AW: Kleines Problem mit Grundlagen // Minigame
 
wow das ist der hammer!
mit deinen Kommentaren verstehe ichs auch! mega geil. Ich muss es etwas umschreiben aber ich glaube das ist es! Mega geil! Tausend Dank!
Ich melde mich dann wenns soweit ist.
:thumb:

shmia 7. Jun 2011 17:24

AW: Kleines Problem mit Grundlagen // Minigame
 
Hmm, man kann es richtig machen oder falsch.
Richtig wäre: das Array mit den 6 Zahlen ist "der Chef" und die Panels sind nur die Anzeige.
Ich mein' das kann doch nicht so schwer zu verstehen sein.
Falsch wäre, den Paneln die zufälligen Zahlen zuzuweisen und dann später wieder von dort auszulesen.

Hier nochmal das Kochbuch:
1.) array mit 6 zufälligen Zahlen befüllen
2.) die Werte in dem array auf die Panels kopieren (Visualisierung)
3.) arrays auswerten und schauen wieviele DreierPasch enthalten sind
4.) Prüfen ob eine Strasse in dem Array steckt
5.) Punktezahl errechnen und anzeigen

blackfin 7. Jun 2011 17:27

AW: Kleines Problem mit Grundlagen // Minigame
 
Self-Quote:
Zitat:

Natürlich kann man das im späteren Verlauf eleganter machen, ohne Panel-Caption-Umwandlungen, also dass du zuerst rein rechnerisch würfelst und dann erst am Schluss das ganze in die GUI jagst, aber das ist dir überlassen
Soll ja erstmal nur ein Denkanstoss sein und ich bin von deinem Ausgangspunkt ausgegangen: 6 Zahlen als Captions auf den Panels

shillok 7. Jun 2011 18:34

AW: Kleines Problem mit Grundlagen // Minigame
 
So, nächstes Problem:
Man darf 3mal werfen und man kann mit hilfe von checkboxen wählen welche zahlen man stehen lässt und welche man nochmal werfen möchte. wie könnte ich das einbinden?
der rest sieht bis jetzt sehr gut aus.
danke nochmal


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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