Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hänge bei units und umsetzung fest (https://www.delphipraxis.net/107790-haenge-bei-units-und-umsetzung-fest.html)

finalmaster2k 2. Feb 2008 08:30


Hänge bei units und umsetzung fest
 
Liste der Anhänge anzeigen (Anzahl: 1)
hey,

ich bin am das Spiel Böse eins am Programieren und habe einige Probleme

Das Spiel

Man würfelt so lange, bis man die Zahl eins erreicht hat oder vorher die summierten würfeln Zahlen gespeichert hat. Wer ne eins Würfelt bekommt seinen Aktuellen Spielstand gelöscht, sofern er sie nicht vorher gespeichert hat.

Problem

Ich versuche grade die Spiele zum laufen zu bringen, habe einen Unit würfel und einen unit gamer.
ICh weiß aber nicht wie ich den Spielstand auf dem Hauptfenster ändern soll ?.

Für euer hilfe wäre ich dankbar.

Corpsman 2. Feb 2008 10:32

Re: Hänge bei units und umsetzung fest
 
Ui Ui du hast noch nicht viel programmiert, was.

Also
Delphi-Quellcode:
Procedure dice();
Begin
  randomize;
  Zahl := trunc(random(6)) + 1;
  Case Zahl Of
    1: fenster_frm.Image1.Picture.LoadFromFile('one.bmp');
    2: fenster_frm.Image1.Picture.LoadFromFile('two.bmp');
    3: fenster_frm.Image1.Picture.LoadFromFile('tree.bmp');
    4: fenster_frm.Image1.Picture.LoadFromFile('four.bmp');
    5: fenster_frm.Image1.Picture.LoadFromFile('five.bmp');
    6: fenster_frm.Image1.Picture.LoadFromFile('six.bmp');
  End;

End;
ist man ganz Böse

Du greifst auf eine Andere Unit und deren Objekte und überhaupt und böse zu.

Delphi-Quellcode:
function dice():integer;
Begin

  result := random(6) + 1;
End;
und in unit1

Delphi-Quellcode:
Procedure Tfenster_frm.dice_btnClick(Sender: TObject);
Begin

  Case  dice Of
    1: Image1.Picture.LoadFromFile('one.bmp');
    2: Image1.Picture.LoadFromFile('two.bmp');
    3: Image1.Picture.LoadFromFile('tree.bmp');
    4: Image1.Picture.LoadFromFile('four.bmp');
    5: Image1.Picture.LoadFromFile('five.bmp');
    6: Image1.Picture.LoadFromFile('six.bmp');
  End;

End;
Wenn du das schon unbedingt so kompliziert machen willst.

Allerdings gäbe es da noch ettliche Verbesserungen ..

Mir scheint das sind 4 Spieler also baust du dir eine Spieler Klasse und machst 4 instanzen davon, KEINE globalen Variablen und dann eine Vernünftige Spielsteuerung von Unit1 aus.

Ich hoffe ich habe dir nicht all zu viele Fremdwörter um die Ohren gehaun.

[Edit]

Ach ja Randomize wird nur 1 mal aufgerufen, und nicht jedesmal in Dice.

finalmaster2k 3. Feb 2008 09:38

Re: Hänge bei units und umsetzung fest
 
Liste der Anhänge anzeigen (Anzahl: 2)
danke für den tipp mit dem würfeln ^^..

Habe jetzt mal weiter gebastelt und habe ein Problem

Jedesmal wenn ich würfle zählt es die summen nicht richtig zusammen !? ..
Laut bilder würfel zeigt es ne 3 und dann ne 5 an ! aber als SUmme kommt da zb 7 raus oder so ...



Anhang habe ich hochgeladen

Corpsman 3. Feb 2008 10:14

Re: Hänge bei units und umsetzung fest
 
Lol,

Du rufst dice auf, jeder Aufruf erzeugt einen neuen Zufallswert, willst du mit dem Wert noch mehr machen, so must du ihn zwischenspeichern.

In etwa so :
Delphi-Quellcode:
Procedure Tfenster_frm.dice_btnClick(Sender: TObject);
Var
  Dice_result: Integer;
Begin
  Dice_result := dice;
  Case Dice_result Of
    1: Image1.Picture.LoadFromFile('one.bmp');
    2: Image1.Picture.LoadFromFile('two.bmp');
    3: Image1.Picture.LoadFromFile('tree.bmp');
    4: Image1.Picture.LoadFromFile('four.bmp');
    5: Image1.Picture.LoadFromFile('five.bmp');
    6: Image1.Picture.LoadFromFile('six.bmp');
  End;
  If Dice_result = 1 Then Begin
    If spieler = 1 Then Begin
      punkte_1 := 0;
      summe_edt.Text := floattostr(punkte_1);
      spieler := 2;
      gamer_label.Caption := 'Spieler 2 ist am Zug'
    End
    Else Begin
      punkte_2 := 0;
      summe_edt.text := floattostr(punkte_2);
      spieler := 1;
      gamer_label.Caption := 'Spieler 1 ist am Zug'
    End;
  End
  Else Begin
    If spieler = 1 Then Begin
      punkte_1 := punkte_1 + Dice_result;
      summe_edt.text := floattostr(punkte_1);
    End
    Else Begin
      punkte_2 := punkte_2 + Dice_result;
      summe_edt.Text := floattostr(punkte_2);
    End;
  End;
End;

finalmaster2k 5. Feb 2008 10:02

Re: Hänge bei units und umsetzung fest
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dankee für die hilfe jetzt hänge ich an einem weiteren problem xD !!..


Ich habe versucht im Spiel einen Limit berreich zu erstellen das ich zb bei eingabe im edit fel 500 Punkte dann die MSG kommt das Spiele XYZ gewonnnen hat..

es kommt aber folgende fehler meldeung :( ..


[Warnung] ufenster.pas(126): Variable 'limit' ist möglicherweise nicht initialisiert worden
[Fehler] ufenster.pas(134): Deklaration erwartet, aber 'ELSE' gefunden
[Fehler] ufenster.pas(135): '.' erwartet, aber ';' gefunden
[Fataler Fehler] Badone.dpr(6): Verwendete Unit 'ufenster.pas' kann nicht compiliert werden

bitsetter 5. Feb 2008 10:35

Re: Hänge bei units und umsetzung fest
 
Hallo,

was machst du denn da?
Delphi-Quellcode:
procedure Tfenster_frm.limit_radiobtnClick(Sender: TObject);
var
   limit : integer;
begin
  IF limit_radiobtn.Checked = true   THEN
  limit := StrToInt(limit_edt.Text);{wenn der Code hier nicht ausgeführt wurde dann
  ist die Variable 'limit' möglicherweise nicht initialisiert worden} 

        IF limit = punkte_2  THEN
        ShowMessage('Winner ist (game2_edt.Text)')
        ELSE

            IF limit = punkte_1  THEN
            ShowMessage('Winner ist (game1_edt.Text)')
            ELSE
            END;//<-- hier ist die Prozedur schon zu Ende
  Else.//was soll denn der Punkt hier bringen?
  END;
  limit := 0;


end.

finalmaster2k 5. Feb 2008 11:06

Re: Hänge bei units und umsetzung fest
 
ich verusch halt die limit grenze zu bestimmen und , dejenige der sie erreicht hat, soll halt als gewinner angezeigt werden,


Delphi-Quellcode:


procedure Tfenster_frm.limit_radiobtnClick(Sender: TObject);
var
   limit : integer;
begin
  IF limit_radiobtn.Checked = true   THEN
  limit := StrToInt(limit_edt.Text);{hier habe ich versucht halt im limit edt von str in integer umzuwandeln}

        IF limit = punkte_2  THEN  
        ShowMessage('Winner ist (game2_edt.Text)')
        ELSE

            IF limit = punkte_1  THEN
            ShowMessage('Winner ist (game1_edt.Text)')
            ELSE
            END;//hier soll eigentlich nix passieren hmm mus noch mal ändern :(..
  Else//hier soll eigentlich nix passieren hmm mus noch mal ändern :(..
  END;
  limit := 0;


end.

stahli 5. Feb 2008 11:46

Re: Hänge bei units und umsetzung fest
 
wenn Du den Abschnitt nur behandeln willst wenn Limit gewählt ist:
Delphi-Quellcode:
procedure Tfenster_frm.limit_radiobtnClick(Sender: TObject);
var
   limit : integer;
begin
  IF limit_radiobtn.Checked THEN
  begin
    limit := StrToInt(limit_edt.Text);
    IF limit = punkte_2 THEN  
      ShowMessage('Winner ist (game2_edt.Text)')
    ELSE
    begin // hier muss kein begin+end, ist aber übersichtlicher nach dem else
      IF limit = punkte_1  THEN
        ShowMessage('Winner ist (game1_edt.Text)');
    end;
  END;
  limit := 0;
end;
Wenn der Abschnitt immer durchlaufen werden soll:
Delphi-Quellcode:
procedure Tfenster_frm.limit_radiobtnClick(Sender: TObject);
var
   limit : integer;
begin
  IF limit_radiobtn.Checked THEN
    limit := StrToInt(limit_edt.Text);
  else
    limit := 12345; // sonst inst unklar, welcher Wert in Limit steht!
   IF limit = punkte_2  THEN  
...

stahli

finalmaster2k 5. Feb 2008 14:46

Re: Hänge bei units und umsetzung fest
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe jetzt 2 würfeln und will das bei einer 1 den spieler wechselt !? ..

habe das mit

Delphi-Quellcode:
If (Dice_result = 1 or Dice2_result = 1) Then Begin
    If spieler = 1 Then Begin
      punkte_1 := 0;
      summe_edt.Text := floattostr(punkte_1);
      spieler := 2;
      gamer_label.Caption := game2_edt.Text
    End
    Else Begin
      punkte_2 := 0;
      summe_edt.text := floattostr(punkte_2);
      spieler := 1;
      gamer_label.Caption := game1_edt.Text
    End;
  End
  Else Begin
    If spieler = 1 Then Begin
      punkte_1 := punkte_1 + Dice_result;
      summe_edt.text := floattostr(punkte_1);
    End
    Else Begin
      punkte_2 := punkte_2 + Dice_result;
      summe_edt.Text := floattostr(punkte_2);
    End;
  End;
klappt aber irgendwie nicht

DeddyH 5. Feb 2008 14:52

Re: Hänge bei units und umsetzung fest
 
Was heißt "klappt nicht"? Ändere die erste Zeile erst einmal.
Delphi-Quellcode:
If (Dice_result = 1) or (Dice2_result = 1) Then Begin

finalmaster2k 5. Feb 2008 16:16

Re: Hänge bei units und umsetzung fest
 
Liste der Anhänge anzeigen (Anzahl: 1)
ah danke ^^.. sry ich programiere nicht sehr lange xD..

habe jetzt 2 weiter probelme..

und zwar einmal mit dem Limit, jedesmal wenn ich versuche es zu erreichen kommt da die Fehlermeldung Punkte1 ist kein integer wert oder so was..

zweites problem bei mir ist, das RadioGroup bei auswahl wenn ich auf neues Spiele gehe es nicht richtig anzeigt !?...

stahli 5. Feb 2008 16:51

Re: Hänge bei units und umsetzung fest
 
Zitat:

Zitat von finalmaster2k
ah danke ^^.. sry ich programiere nicht sehr lange xD..

Ist absolut kein Problem ;-)

Aber versuch mal, die Fragen genauer zu stellen und die Probleme genauer einzugrenzen.
Was klappt an welcher Stelle genau nicht?

Zeig dann lieber die Quelltextauszüge mit konkreter Fragestellung.
Es ist vielen sicher zu aufwändig, Dein ganzes Projekt auszupacken und auszutesten...

Und duch lesen und überlegen lernt man am meisten - kann ich aus eigener Erfahrung sagen ;-)


stahli

finalmaster2k 5. Feb 2008 20:34

Re: Hänge bei units und umsetzung fest
 
ahh okey ^^..

also bei Limit .. kommt immer der fehler Punkte1 ist kein gültiger integer wert !?

Delphi-Quellcode:
procedure Tfenster_frm.store_btnClick(Sender: TObject);
begin
    if spieler=1  then

          if strtoint(store1_edt.Text) >= strtoint (limit_edt.Text)   then
            begin
              showmessage('Spieler 1 hat gewonnen!');
            end
          else

                begin
                    gesamt_1:=gesamt_1+punkte_1;
                    store1_edt.text:=floattostr(gesamt_1);
                    punkte_1:=0;
                    summe_edt.Text:=floattostr(punkte_1);
                    spieler:=2;
                    gamer_label.Caption:=game2_edt.Text;
                end

    else
          if strtoint(store2_edt.Text) >= strtoint (limit_edt.Text)   then
            begin
              showmessage('Spieler 2 hat gewonnen!');
            end
          else

                begin
                    gesamt_2:=gesamt_2+punkte_2;
                    store2_edt.text:=floattostr(gesamt_2);
                    punkte_2:=0;
                    summe_edt.Text:=floattostr(punkte_2);
                    spieler:=1;
                    gamer_label.Caption:=game1_edt.Text;
                end;

    end;
und mein RadioGroup im andenren unit funktioniert nicht richtig :/...

Delphi-Quellcode:
begin
     fenster_frm.game1_edt.Text := name1_lbl.Text;
     fenster_frm.game2_edt.Text := name2_lbl.Text;
     fenster_frm.limit_edt.Text := limit_edt.Text;
     fenster_frm.store_btn.Enabled := true;
     if dice_rg.ItemIndex = 1 then
      begin
        fenster_frm.dice_btn.Enabled := true ;
        fenster_frm.dice_btn.Visible := true ;
        fenster_frm.dice2_btn.Enabled := true ;
        fenster_frm.dice2_btn.Visible := true ;
      end
     else
     begin //LAME
        fenster_frm.dice_btn.Enabled := true ;
        fenster_frm.dice_btn.Visible := true ;
        fenster_frm.dice2_btn.Enabled := false ;
        fenster_frm.dice2_btn.Visible := false ;
        close
     end
end;

stahli 5. Feb 2008 20:53

Re: Hänge bei units und umsetzung fest
 
Da kann ich nur raten:

In einer Edit-Komponente steht sicher kein gültiger Integerwert bzw. z.B. gar nix.

Edits sind sicher nicht gut geeignet, um Zahlenwerte zu speichern. Wenn Du´s so machen willst, dann schau Dir mal StrToIntDef an. dann kannst Du als "Notfallwert" einfach 0 vorgeben.
Du kannst ja einen Haltepunkt setzen und dann zur Debugzeit nachsehen, was für Werte in den Edits stehen.

Vielleicht ist auch eine TTrackBar oder TSpinEdit sinnvoller einzusetzen.

Und was geht mit der RadioGroup nicht?
Vielleicht beachtest Du ja nur nicht, dass der erste Eintrag ItemIndex = 0 !!! entspricht!?

Da hilft es auch, das Programm schrittweise zu durchlaufen und alle Werte genau einzusehen....

Übrigens ist es auch üblich, die Komponenten "EditGame1" usw. zu benennen. Dann ist es auch für andere Programmierer offensichtlich, dass hier eine Edit-Komponente angespochen wird.

stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.

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