Autor Beitrag
BOSUP
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 06.12.09 17:26 
Hallo miteinander,
ich weiß nicht ob ich es hier richtig gepostet habe, wenn nicht dann verschiebt bitte den Thread.

Also: Wir haben im Informatikunterricht über die letzten Monate ein Billardprogramm in verschiedenen Stufen geschriebem. Bisher habe ich das auch relativ gut hingegriegt. Nur bei der 6. Stufe habe ich ein paar Probleme. Es wäre super wenn ihr mir helft diese kleinen Porbleme zu lösen.

1.Stufe : Auf dem Billardtisch erscheint ein Tisch und darauf eine Kugel(ohne Bewegung). Ende mit Mausklick.
2.Stufe : Die Kugel soll sich bewegen.
3.Stufe : Die Kugel soll an der Bande abprallen.
4.Stufe : Es sollen mehrere Kugeln in unterschiedlicher Farbe, aus versch. Ausgangspositionen über den Tisch rollen.
5.Stufe : Es sollen zwei Kugeln über den Tisch rollen und an der Bande abprallen! Aber die Tischgröße soll auch verändert werden können!

6.Stufe : Die Kugeln sollen durch Reibung bedingt langsamer gemacht werden




Stufe 6 AWP
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
program pStufe4;

uses mSum,
  mKugel,
  mTisch,
  mReibungskugel in 'mReibungskugel.pas';


var
  mBildschirm : Bildschirm;
  mMaus : Maus;
  Tisch1 : tisch;
  Kugel1 : Kugel;
  Kugel2 : Kugel;
  meinTisch :tisch;



begin

  mBildschirm := Bildschirm.init;
  mMaus := Maus.init;
 
  Tisch1:=tisch.init(300,150,600,400) ;
  Kugel1:=kugel.init(tisch1.giblinks + 10,tisch1.giboben + 10,6,weiss,0.1,60) ;
  kugel1.merkeTisch(Tisch1) ;
  kugel2:=kugel.init(tisch1.giblinks + 50,tisch1.giboben + 50,6,weiss,0.5,60) ;
  kugel2.merkeTisch(Tisch1) ;
  Tisch1.zeigeDich;
  Kugel1.zeigeDich;
  Kugel2.zeigeDich;
  Repeat
        Kugel1.bewegedich;
        Kugel2.bewegedich;

  Until mMaus.istgedrueckt;

  Tisch1.versteckeDich;
  Kugel1.versteckeDich;
  Kugel2.versteckeDich;
 
  Tisch1.gibFrei;
  Kugel1.gibFrei;
  Kugel2.gibFrei;
  

  mMaus.gibFrei;
  mBildschirm.gibFrei;

end.


Klasse Tisch
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
unit mTisch;

interface
USES mSum;
type tisch=class
     private
            zlaenge,zbreite,zx,zy : zahl;
            hstift : Buntstift;
     Public
           constructor init(px,py,plaenge,pbreite : zahl);
           procedure zeigeDich;
           procedure versteckeDich;
           function gibrechts : zahl;
           function giblinks : zahl;
           function giboben : zahl;
           function gibunten : zahl;
           destructor gibFrei;
     end;
implementation
     constructor tisch.init(px,py,plaenge,pbreite : zahl);
                 begin
                      hstift := buntstift.init;
                      zlaenge := plaenge;
                      zbreite := pbreite;
                      zx := px;
                      zy := py;
                      hstift.bewegebis(zx,zy);
                 end;
     procedure tisch.zeigeDich;
               begin
                    hstift.setzefarbe(grau);
                    hstift.setzefuellmuster(1);
                    hstift.zeichneRechteck(zlaenge,zbreite);
               end;
     procedure tisch.versteckeDich;
               begin
                    hstift.setzefarbe(gruen);
                    hstift.zeichnerechteck(zlaenge, zbreite);
               end;
     function tisch.gibrechts;
              begin
                   result := zx+zlaenge;
              end;
     function tisch.giblinks;
              begin
                   result := zx;
              end;
     function tisch.giboben;
              begin
                   result := zy;
              end;
     function tisch.gibunten;
              begin
                   result := zy + zbreite;
              end;
     Destructor tisch.gibFrei;
               begin
                    self.versteckeDich;
                    hStift.gibFrei;
               end;
end.


Klasse Kugel
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
unit mKugel;

interface

uses msum,mTisch;

Type Kugel = class
     private
            zradius,zfarbe: GanzeZahl;
            zgeschwindigkeit,zrichtung,zx,zy: Zahl;
            hstift:buntstift;
            ktisch:tisch;
     public
           constructor init(px, py:zahl ; pradius, pfarbe:ganzezahl;pgeschwindigkeit,prichtung:zahl);
           procedure zeigedich;
           procedure versteckedich;
           procedure bewegedich;
           procedure setzerichtung(prichtung : zahl);
           procedure merkeTisch(pTisch:tisch);
           function gibx : zahl;
           function giby : zahl;
           function gibrichtung : zahl;
           destructor gibFrei;
     end;
implementation
     constructor Kugel.init(px, py:zahl ; pradius, pfarbe:ganzezahl; pgeschwindigkeit,prichtung:zahl);
                 begin
                      hstift := buntstift.init;
                      zradius := pradius;
                      zx := px;
                      zy := py;
                      zfarbe := pfarbe;
                      zgeschwindigkeit := pgeschwindigkeit;
                      zrichtung := prichtung;
                      hstift.bewegebis(zx,zy);
                      hstift.dreheUm(zrichtung);
                 end;
     procedure Kugel.zeigeDich;
               begin
                    hstift.setzeFarbe (zfarbe);
                    hstift.setzefuellmuster(1);
                    hstift.zeichneKreis(zradius);
               end;
     procedure Kugel.versteckeDich ;
               begin
                    hstift.setzefarbe(gelb);
                    hstift.zeichneKreis(zradius);
                    hstift.setzeFarbe (zfarbe);
               end;
     procedure Kugel.bewegeDich ;
               begin
                    if self.gibx > ktisch.gibrechts
                       then self.setzerichtung(180 - self.gibrichtung*2);
                    if self.gibx < ktisch.giblinks
                       then self.setzerichtung(180 - self.gibrichtung*2);
                    if self.giby > ktisch.gibunten
                       then self.setzerichtung(- self.gibrichtung * 2);
                    if self.giby < ktisch.giboben    
                       then self.setzerichtung(- self.gibrichtung * 2);
                    self.versteckedich;
                    hstift.bewegeum(zgeschwindigkeit);
                    self.zeigedich;
               end;
     procedure Kugel.setzerichtung (prichtung : zahl);
               begin
                    hstift.dreheum(prichtung);
               end;
     procedure kugel.merkeTisch(pTisch:tisch);
               begin
                    kTisch:=pTisch
               end ;
     function kugel.gibx ;
               begin
                     result := hstift.hposition;
               end;
     function kugel.giby ;
               begin
                    result := hstift.vposition;
               end;
     function kugel.gibrichtung ;
              begin
                   result := hstift.winkel;
              end;
     destructor Kugel.gibFrei;
                begin
                     self.versteckeDich;
                     hstift.gibFrei;
                end;
end.



Klasse Reibungskugel
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
unit mReibungskugel;

interface
         uses mSum, mKugel;

              type Reibungskugel = class (Kugel)

              private
                         zGeschwindigkeit:Zahl;
                         zReibung:Zahl;

              public
                    constructor init(px,py,pRadius,pGeschwindigkeit,pRichtung:Zahl;pFarbe:Zahl);OVERRIDE;
                    procedure bewegeDich (pGeschwindigkeit:Zahl);OVERLOAD;
                    procedure setzeReibung (pReibung:Zahl)
              end;
implementation
                 constructor Reibungskugel.init (px,py,pRadius,pGeschwindigkeit,pRichtung:Zahl;pFarbe:Zahl);
                             begin
                                  INHERITED init (px,py,pRadius,pGeschwindigkeit,pRichtung,pFarbe);
                                  zReibung :=0.01;
                             end;

                 procedure Reibungskugel.setzeReibung (pReibung:Zahl);
                           begin
                                zReibung:=pReibung;
                           end;
                 procedure Reibungskugel.bewegeDich (pGeschwindigkeit:Zahl);
                           begin
                                zGeschwindigkeit:=zGeschwindigkeit-zReibung;
                                INHERITED bewegeDich(zGeschwindigkeit);
                           end;

                
end.



Bitte helft mir den Programmcode so zu verändern das es funktioniert und die Kugeln langsamer werden. Habe die letzten Tage schon lange probiert.
Danke für jede Antwort.


Schöne Grüße
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: So 06.12.09 17:58 
:welcome: im Delphi-Forum:

Zuerst die Frage:
Hast du den Code da oben selbst geschrieben, oder eher vom Lehrer abgetippt?

Ich hab mir jetzt nicht die Mühe gemacht, den durchzuschauen, aber vielleicht eine Idee, wie man das ganze verwirklichen könnte (programmieren musst du es schon selbst ;)):

- Timer mit einem Intervall von z.B. 10 nehmen
- OnTimer Event die Geschwindigkeit um einen Faktor verringern, bis die Geschwindigkeit 0 ist.

Wenn du es realistisch machen willst, kannst du den Faktor ja auch noch so berechnen, dass er nicht immer konstant ist. Musst du wissen, wie viel du machen willst.

Ich hoffe, dass ich dir weiter helfen konnte, sonst gibt es hier ja zum Glück noch schlauere Leute ;)

Bis dann
Sylvus
BOSUP Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 06.12.09 18:23 
Ja das Programm haben wir selbst schreiben müssen, sicherlich hat der Lehrer ein kleines bisschen geholfen.

Kannst du das mit dem Timer vielleicht mir mal zeigen anhand der Klasse Reibungskugel ?
kalmi01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 39



BeitragVerfasst: So 06.12.09 18:31 
Hallo

Timer ist wohl nicht so realistisch !

Man sollte die zurückgelegte Strecke mit einbeziehen, sowie die Kollisionen.
Bei jedem Anprall verliert die Kugel an Geschwindigkeit.
Beim Anprall an die Bande nur wenig, stösst sie gegen eine andere Kugel, teilen sich beide die (Bewegungs-)Energie entsprechend ihrer Masse.
Beim Anprall an der Bande hat der Differenzwinkel zwischen An- und Abprall noch eine variable Wirkung.
Je flacher, desto geringer der Energieverlust; je stumpfer, umso höher.
Gilt natürlich auch für Kugel-Kugel-Kollisionen.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: So 06.12.09 19:07 
Hi :)

Wahrscheinlich sollt ihr nicht mit einem Timer arbeiten, sondern wie du es schon gemacht hast die Geschwindigkeit in der Methode BewegeDich() reduzieren.

Das nächste Mal könntest du vielleicht kurz schildern, welche Fehlermeldungen kommen und, was passiert. So muss ich nämlich erstmal Fragen: Was ist denn im Moment noch falsch: Bekommst du eventuell eine Fehlermeldung, verändert sich die Geschwindigkeit nicht oder rollt die Kugel rückwärts?

Wenn sich nichts ändert, vergrößere mal den Reibungsfaktor. Rollt die Kugel rückwärts, könntest du vielleicht mit mal(*) statt minus(-) rechnen, das ist nämlich in der Realität auch so: Die Reibungskraft ist proportional zur Geschwindigkeit.

Aus deinem Quelltext lese ich, dass du in Reibungskugel zGeschwindigkeit neu deklarierst - dort solltest du eine entsprechende Fehlermeldung bekommen. In Kugel ist sie schon deklariert, und eine abgeleitete Klasse erbt alle Feldvariablen(und Methoden d.h. Prozeduren und Funktionen) von ihrer Mutterklasse.

Außerdem sollte die Methode bewegeDich ohne Parameter auskommen und ebenfalls ein "override;" statt "overload" bekommen. Dafür braucht dann bewegeDich in Kugel.pas ein "virtuel", damit es per override überschrieben werden kann.

In Reibungskugel.pas#bewegeDich; verwendest du dann die Variable zGeschwindigkeit statt des Parameters pGeschwindigkeit(was du ja wie ich sehe schon tust, pGeschwindigkeit wird nicht verwendet und es sollte einen Hinweis darauf geben dass er entfernt werden kann wenn solche nicht im Compiler abgestellt sind).

So, jetzt bist du erstmal dran ;) Fürs nächste Mal: Compiler-Meldungen lesen, Fehlermeldungen und Beobachtungen mit schreiben(vergisst irgendwie jeder erstmal :)).

Wenn es dich trotzdem interessiert: Ein Timer ist eine Klasse zur Kommunikation mit dem Zeitgeber in Windows. Du stellst ein Taktintervall in Millisekunden ein(Timer1.Interval := 1000), startest den Timer(Timer1.Enabled := true) und trägst eine Prozedur ein, die jeweils nach Ablauf des Intervalls vom Programm aufgerufen wird:
Der Timer ist mit die einfachste Klasse, insgesamt nur 3 Variablen überhaupt.

ausblenden Dieses Beispiel verwendet alles, was ein Timer kann oder brauchen kann
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
type
  TBallausloeser = class(TObject)
  private
    procedure BallTimerTick(Sender: TObject); //wird aufgerufen, wenn der Timer auslöst
  private
    BallTimer: TTimer;
  public
    constructor Init(aBall: ReibKugel);
  end;

implementation

constructor TBallausloeser.Init(aBall: Kugel);
begin
  BallTimer := TTimer.Create; //Create = Init außerhalb der Schule
  BallTimer.OnTimer := BallTimerTick;
  BallTimer.Interal := 1000//1000ms = alle 1sec tickt eure Uhr
  BallTimer.Enabled := true;
end;

procedure TBallausloeser.BallTimer1Tick(Sender: TObject);
begin
  Beep; //Ton machen
  Ball.SetzeRichtung(Ball.GibRichtung + 1); //Die Kugel im Kreis rollen lassen
  Ball.BewegeDich;
end;


Bliebe noch zu sagen, dass eure Lehrer zu meinen scheinen ihr könnt kein Englisch, da sie alles ins Deutsche übersetzen. :roll:
  • Create -> Init
  • Klassen wie Canvas vermeiden //der Stift ist komplizierter als Canvas
  • Euch kein Formular geben, sondern nur eine Art Malvorlage wo der Stift immer wieder direkt aufs Formular drübermalt
  • ..
  • Wenn ihr euch von mSuM nicht löst, könnt ihr am Ende ohne diese Units nicht mit Dephi umgehen. Als Einstieg okay, aber dann die Fehler darin kennen und später noch richtig beibringen.


Phu, das war viel zu lang^^

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)