Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sammlung von Problemen (https://www.delphipraxis.net/156745-sammlung-von-problemen.html)

Sertrain 13. Dez 2010 16:12

Delphi-Version: 5

Sammlung von Problemen
 
So, ich habe schon einige Zeit nach einem passenden Thema gesucht, aber keins gefunden.
Ich habe in Delphi ein kleines Projekt vor. Dabei sind aber einige Probleme Aufgetreten.

1) Ich habe rechts ein Highscore laufen, der sich während des Spiels immer wieder aktualisiert, ich will jedoch verhinden, dass wärend das Programm läuft und auch danach jemand etwas so eintippen kann. Gibt es dafür ein Befehl, oder eine Variante?

2) Ich brauche eine Art Stoppuhr. Hierbei will ich die Windows-Zeit auslesen lassen, beim Start und beim Ende und daraus die Differenz bilden. Jetzt weiß ich nicht, ob ich die Zeiten 2 mal auslesen kann und ein " - " dazwischen schreibe und die Differenz habe oder ob es doch anders und einfacher geht.

3) Der Highscore soll von einer Klasse insgesamt gebildet werden, also muss ich eine externe "Highscore-Datei" machen und dort immer wieder die Ergebnisse "hinschicken" und diese dann ordnen. Ist die Idee richtig und sinnvoll oder lieber doch anders?


Ich bin ganz ehrlich. Ich habe noch keinen großen Schimmer wie ich es letztendlich aufbaue. Aber ich hoffe ihr helft mir ein wenig. :D

Grüße Sertrain :)

Darkface 13. Dez 2010 16:52

AW: Sammlung von Problemen
 
Zitat:

Zitat von Sertrain (Beitrag 1068283)
1) Ich habe rechts ein Highscore laufen, der sich während des Spiels immer wieder aktualisiert, ich will jedoch verhinden, dass wärend das Programm läuft und auch danach jemand etwas so eintippen kann. Gibt es dafür ein Befehl, oder eine Variante?

Ich nehme mal an du willst dafür ein Edit Feld verwenden (erschließt sich mir so aus deiner Angst jemand könnte was ändern. Entweder nimmst du stattdessen ein Label Feld (auf den Text greifst du per Label.Caption zu) oder du setzt in den Eigenschaften des Edit Feldes die Eigenschaft Enabled auf False.

Zitat:

Zitat von Sertrain (Beitrag 1068283)
2) Ich brauche eine Art Stoppuhr. Hierbei will ich die Windows-Zeit auslesen lassen, beim Start und beim Ende und daraus die Differenz bilden. Jetzt weiß ich nicht, ob ich die Zeiten 2 mal auslesen kann und ein " - " dazwischen schreibe und die Differenz habe oder ob es doch anders und einfacher geht.

Klar kannst du jetzt die Uhrzeit zweimal auslesen und die vergangene Zeit berechnen, musst da jedoch auf Stundenumbrüche/Tagesumbrüche achten. Einfacher wenn auch unsauberer wäre einen Timer auf die Form zu schmeißen, das Intervall auf 1000ms (jede Sekunde) zu setzen, und innen eine Variable von 0 an hochzählen lassen. Mit Timer.Enabled True/False startest/stoppst du dann den Timer und der Inhalt der Variable sagt die wieviele Sekunden der Timer gelaufen ist.

Zitat:

Zitat von Sertrain (Beitrag 1068283)
3) Der Highscore soll von einer Klasse insgesamt gebildet werden, also muss ich eine externe "Highscore-Datei" machen und dort immer wieder die Ergebnisse "hinschicken" und diese dann ordnen. Ist die Idee richtig und sinnvoll oder lieber doch anders?

Zum speichern von Daten eignen sich Dateien ganz gut. Die sind recht einfach zu nutzen. Du kannst auch für jede Klasse eine eigene Datei anlegen und so noch die einzelnen Highscores abspeichern. Am Ende öffnest du dann Datei für Datei und berechnest die Summe der gespeicherten Highscores. Wenn du Namen dazuspeicherst kannst du dann auch den/die besten Spieler der jeweiligen Klassen mit ausgeben. Ordnen würde ich nicht unbedingt innerhalb der Datei, da ich die Rohdaten beim auslesen ordnen könnte und im Programm dann eine ordentliche Highscore Liste ausgeben könnte.

Jens Hartmann 13. Dez 2010 17:41

AW: Sammlung von Problemen
 
Hallo und schönen guten Abend,

vieleicht hilft Dir das weiter...

http://www.delphipraxis.net/549628-post2.html

Gruß Jens

Sertrain 13. Dez 2010 18:21

AW: Sammlung von Problemen
 
Zitat:

Zitat von Darkface (Beitrag 1068289)
Ich nehme mal an du willst dafür ein Edit Feld verwenden (erschließt sich mir so aus deiner Angst jemand könnte was ändern. Entweder nimmst du stattdessen ein Label Feld (auf den Text greifst du per Label.Caption zu) oder du setzt in den Eigenschaften des Edit Feldes die Eigenschaft Enabled auf False.

Nein eigentlich will ich den Highscore im Memo anzeigen. Also die 10 Besten oder so, sieht schöner aus. :D

Danke Jens für den Link, ich probiere ihn später. :D

Ich habe im Moment nur ein Problem ... also zumindest komme ich nicht weiter.

Code:
{---------------------------------------- Prozeduren ----------------------------------------}
function Kontrolle(loesung,ergebnis:integer):boolean;
var richtig: boolean;
  begin
    If Loesung = Ergebnis then richtig:= true
                            else richtig:= false;
  end;

function KontrolleAddition(zahl1, zahl2: integer):boolean;
  var zahlgesadd: integer;
  begin
    zahlgesadd:= zahl1+zahl2;
    if zahlgesadd > 99 then loesbar:= false
                    else loesbar:= true;
  end;

procedure KontrolleSubtraktion;
var zahlgessub: integer;
  begin
    zahlgessub:= zahl1 - zahl2;
    if zahlgessub < 0 then loesbar:= false
                      else if zahlgessub > 99 then loesbar:= false
                                              else loesbar:= true;
  end;

procedure KontrolleDivision;
var zahlgesdiv: integer;
  begin
    zahlgesdiv:= zahl2*zahl1;
    if zahlgesdiv >15 then loesbar:= false
                      else if zahlgesdiv < 0 then loesbar:= false
                                              else loesbar:= true;
  end;

procedure KontrolleMultiplikation;
var zahlgesmult: integer;
  begin
  zahlgesmult:= Zahl1* zahl2;
  if zahlgesmult > 99 then loesbar:= false
                      else loesbar:= true;
  end;
{--------------------------------------- Aufgaben ---------------------------------------}
Procedure Aufgabe1;
var a:integer;
  begin
  randomize;
  a:= random(4)+1;
  case a of
  1: begin
        repeat
          begin
            zahl1:= random(99);
            zahl2:= random(99);
          end;
        until KontrolleAddition(zahl1, zahl2) = true;
      end;


  end;
  end;
Also zur Erklärung. Oben sind meine Kontrollen, ob es lösbar ist. Da weiß ich noch nicht ob sich ne Funktion oder ne Prozedur besser eignet. Deshalb nicht so genau drauf achten, was da steht, da sie nur kontrollieren ob die Lösung zwischen 0-99 liegt, da es nur die Buttons zur auswahl gibt.

Wie auch immer. Meine erste Aufgabe, soll Ausgang für alle sein, also:

zufallszahl von 1-4 ...
1= +
2= -
3= /
4= *

damit ich eine zufällige rechenoperation habe.

Danach will ich mit einer case of variante überprüfen, ob die ausgewürfelten zahlen für die operation lösbar sind, sonst nochmal neu würfeln bis es passt und dann die aufgabe in nem editfenster anzeigen.

Ist es einigermaßen verständlich was ich vor habe? ^^:roll:

Sertrain 13. Dez 2010 18:43

AW: Sammlung von Problemen
 
Code:
{---------------------------------------- Prozeduren ----------------------------------------}
function Kontrolle(loesung,ergebnis:integer):boolean;
  begin
    If Loesung = Ergebnis then richtig:= true
                            else richtig:= false;
  end;

function KontrolleAddition(zahl1, zahl2: integer):boolean;
var zahlgesadd: integer;
  begin
    zahlgesadd:= zahl1+zahl2;
    if zahlgesadd > 99 then loesbar:= false
                    else loesbar:= true;
  end;

function KontrolleSubtraktion(zahl1, zahl2: integer):boolean;
var zahlgessub: integer;
  begin
    zahlgessub:= zahl1 - zahl2;
    if zahlgessub < 0 then loesbar:= false
                      else if zahlgessub > 99 then loesbar:= false
                                              else loesbar:= true;
  end;

function KontrolleDivision(zahl1, zahl2: integer):boolean;
var zahlgesdiv: integer;
  begin
    zahlgesdiv:= Zahl1 mod zahl2;
    if zahlgesdiv = 0 then loesbar:= true
                      else loesbar:= false;
  end;

function KontrolleMultiplikation(zahl1, zahl2: integer):boolean;
var zahlgesmult: integer;
  begin
  zahlgesmult:= Zahl1* zahl2;
  if zahlgesmult > 99 then loesbar:= false
                      else loesbar:= true;
  end;
{--------------------------------------- Aufgaben ---------------------------------------}
Procedure Aufgabe1;
var a:integer;
  begin
  randomize;
  a:= random(4)+1;
  case a of
  1: begin
        repeat
          begin
            zahl1:= random(100);
            zahl2:= random(100);
          end;
        until KontrolleAddition(zahl1, zahl2) = true;
      end;
  2: begin
       repeat
          begin
            zahl1:= random(100);
            zahl2:= random(100);
          end;
        until KontrolleSubtraktion(zahl1, zahl2) = true;
      end;
  3: begin
       repeat
          begin
            zahl1:= random(15);
            zahl2:= random(15);
          end;
        until Kontrollemultiplikation(zahl1, zahl2) = true;
      end;
  4: begin
       repeat
          begin
            zahl1:= random(100);
            zahl2:= random(100);
          end;
        until KontrolleDivision(zahl1, zahl2) = true;
      end;


  end;
  end;
Wenn ich den Code aufrufe kommts zum Absturz ... also des Programms. ;)

Wo liegt der Fehler?

patti 13. Dez 2010 18:47

AW: Sammlung von Problemen
 
In deinen Funktionen fehlt der Rückgabetyp. Diesen kannst du mit

Delphi-Quellcode:
result := WasAuchImmer;
setzen (eigentlich sollte der Compiler das melden :gruebel: ).

mfg

Sertrain 13. Dez 2010 19:26

AW: Sammlung von Problemen
 
Och ... na gucke mal einer schau :D Es funktioniert :D

Also der Anfang zumindest. ^^ Danke Patti.

Delphi-Quellcode:
   
function Kontrolle(loesung,ergebnis:integer):boolean;
  begin
    If Loesung = Ergebnis then richtig:= true
                            else richtig:= false;
    result:= richtig;
  end;

function KontrolleAddition(zahl1, zahl2: integer):boolean;
var zahlgesadd: integer;
  begin
    zahlgesadd:= zahl1+zahl2;
    if zahlgesadd > 99 then loesbar:= false
                    else loesbar:= true;
    result:= loesbar;
  end;

function KontrolleSubtraktion(zahl1, zahl2: integer):boolean;
var zahlgessub: integer;
  begin
    zahlgessub:= zahl1 - zahl2;
    if zahlgessub < 0 then loesbar:= false
                      else if zahlgessub > 99 then loesbar:= false
                                              else loesbar:= true;
    result:= loesbar;
  end;

function KontrolleDivision(zahl1, zahl2: integer):boolean;
var zahlgesdiv: integer;
  begin
    zahlgesdiv:= Zahl1 mod zahl2;
    if zahlgesdiv = 0 then loesbar:= true
                      else loesbar:= false;
    result:= loesbar;
  end;

function KontrolleMultiplikation(zahl1, zahl2: integer):boolean;
var zahlgesmult: integer;
  begin
  zahlgesmult:= Zahl1* zahl2;
  if zahlgesmult > 99 then loesbar:= false
                      else loesbar:= true;
  result := loesbar;
  end;
Die Kontrollen klappen nicht. Die zu errechnende Zahl darf nie größer 99 oder kleiner 0 sein ... das sollen sie absichern, hab ich was vergessen?

Luckie 13. Dez 2010 19:47

AW: Sammlung von Problemen
 
Nicht umsonst steht in den Forenrichtlinien, die du auch gelesen haben solltest, dass man nur ein Thema pro Thread eröffnen soll. Dann kann man auch einen sinnvollen Beitragstitel erstellen und es geht auch nicht alles durcheinander im Thread. Deswegen mache ich hier zu und du erstellst bitte für jede Frage einen neuen Thread.


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