 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 04.12.2008, 18:32 Titel: QB Schneeflocke fallen lassen |
|
|
Hallo hab vor ein programm mit qbasic zu machen
und zwar möchte ich eine (erstmal) schneeflocke oder was auch immer vom himmel fallen lassen. Habe bisher die schneeflocke gemacht mit draw "u100" draw "ta-45" usw. Jez hab ich mir die schneeflocke oben in die mitte gemacht und habe jez folgende subs:
Fallen
Schneeflocke
Hauptprogramm
IM hauptprogramm ruf ich fallen auf dorf steht das die schneeflocke oben in der mitte ist, von der sub rufe ich schneeflocke in der die schneeflocke ist doch jez will ich theoretisch wieder in die fallen sub aber ich weiß nicht wie ich die schneeflocke jez fallen lasse also wills mit sleep machen so dass sie pro 2-5 sek oder was auch immer ein paar cm runter geht. Am besten wäre es für mich wenn mir jemand sagen könnte wie ich das ganze mit dem sleep befehl mache. Ich habe schon ausprobiert von der Sub schneeflocke wieder mit call fallen die schneeflocke runter zu bekommen aber da sagt qb dass es auserhalb seinen stapelsbereich ist. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 04.12.2008, 19:20 Titel: |
|
|
Wenn du konsequenter Satzzeichen einbauen würdest, müsste ich nicht eine halbe Minute lang überlegen, was wohl
bedeuten soll ...
Der Stapelbereichsfehler rührt mit ziemlicher Sicherheit daher, dass du von der Prozedur aus die Prozedur aufrufst, die wiederum die Prozedur aufruft ... Da sich das Programm ständig die Rücksprungadresse geschweige aller Variablen merken muss, ist der Speicherplatz da schnell verbraucht. Fazit: Bei selbstaufrufenden Funktionen und Prozeduren wäre ich vorsichtig!
(Rekursion ist natürlich eine tolle Sache, aber man muss sie im Auge behalten.)
Vorschlag: Baue im Hauptprogramm eine Schleife ein, die mehrmals hintereinander die Fall-Prozedur aufruft. Diese Prozedur bewegt die Schneeflocke nur einmal um ein Stück und gibt dann wieder zurück ins Hauptprogramm (in die Schleife). Dazu sollte natürlich auch die neue Position oder die Bewegungsrichtung der Schneeflocke mit zurückgegeben werden (also doch lieber eine Funktion statt einer Prozedur?), damit das Hauptprogramm weiß, welche Startposition sie beim nächsten Fall-Aufruf übergeben soll. Kannst natürlich auch mit DIM SHARED arbeiten. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 04.12.2008, 19:26 Titel: |
|
|
naja xD muss recursiv machen deswegen und sry wegen keinen satzzeichen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 04.12.2008, 19:30 Titel: |
|
|
Wenn es rekursiv sein muss, dann musst du darauf achten, dass es insgesamt nicht zu viele Schachtelungen benötigt, und nach Möglichkeit auch, dass pro Schachtelung möglichst wenig Speicherplatz verbraucht wird. QBASIC ist da vom Platz her sehr eingeschränkt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 04.12.2008, 19:45 Titel: |
|
|
hm okay aber wie krieg ich jez die schneeflocke immer ein stück weiter nach unten? Soll ich das mit draw "bd20" machen oder mit draw "bm-200,-50" ? Könnt euch ja mal angucken was ich so fabrieziert habe.
Achja es kommt nicht auf das aussehen von dem Schnee an.
http://uploaded.to/?id=nnkx6r
hab nochn bisschen gearbeitet und hab von oben in der mitte die schneeflocken bis nach unten bekommen. Neue Frage habe bis jez schon nach links die schneeflocken gemacht aber kann ich das nicht eig ganz einfach in eine sub per for zaeler = 1 to ... machen? nur ich muss ja eig immer was daran verändern und wie kann ich das machen , wenn ich input schneeflocken zum Beispiel mache, dass wenn ich 1 eingebe nur eine reihe kommt und nicht 2? Guckt euch mal mein programm an, hab da bissl rumprobiert aber klappt nix^^.
Zuletzt bearbeitet von GRaf am 05.12.2008, 14:09, insgesamt 5-mal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 04.12.2008, 19:46 Titel: |
|
|
Muss ich mir aber später ansehen, bin schon fast weg. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 05.12.2008, 11:09 Titel: |
|
|
GRaf hat Folgendes geschrieben: | sry wegen keinen satzzeichen! |
Wenn Du Dich schon dafür entschuldigst, dann tu doch uns und Dir selbst den gefallen und gewöhne Dir an, Satzzeichen zu setzen. Du schreibst hier keine SMS, wo jedes Zeichen Geld kostet. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 05.12.2008, 14:01 Titel: |
|
|
habs ja jetzt beim post danach gemacht^^ |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 05.12.2008, 15:56 Titel: |
|
|
So hab jez meinen ganzen Bildschirm voller "Schneeflocken".
Nur, die 1. Schneeflocke geht von der mitte aus und geht dann nach unten und dann fängt die 2. links davon an. Normalerweise kommt der schnee ja gleichmäßig und deswegen wollte ich fragen ob jemand nicht weiß, wie ich es machen kann, dass sofort alle schneeflocken da sind und gemeinsam sich nach unten bewegen.
http://uploaded.to/?id=r1dcm7
Hier mein Programm. Ist ein bisschen unübersichtlig^^. Die secvor Sub's sind dafür da, dass die Schneeflocken auch rechts und links von der 1. Schneeflocke erscheinen, wenn jemand weiß wie ich es mache das ich die ganzen sevor in eine Sub machen kann bitte schreiben^^. Wenn jemand auch weiß, wie das machen kann mit Input schneeflocken, dass wen ich 1 eingebe das z.B. nur die in de mitte kommt und bei 2 die links daneben und so weiter. Danke für Antworten.! |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 05.12.2008, 18:01 Titel: |
|
|
also dafür, dass du nur ne schneeflocke fallen lassen willst, hast du das ganze ganz schön krass verschachtelt. leider funzt bei mir qbasic grad net, aus welchem grund auch immer, kann zwar den quelltext lesen aber das programm nicht ausführen.
ich hätte meine schneeflocke mit line gezeichnet (kann jetzt wie gesagt leider garnicht sehen, wie die schneeflocke bei dir aussieht), wobei das denke ich geschmacksache ist und die anfangsposition per zufallsgenerator ermitteln lassen, zumindest die x-achse. dann hätte ich die schneeflocke mit einer einfachen for-next-schleife wandern lassen, indem ich sie zuerst lösche (also mit einer schwarzen schneeflocke überschreibe) und dann weiter unten neu hinschreiben lasse. du kannst ja auch mehrere schneeflocken hinschreiben und wandern lassen, indem du variablenfelder erstellst. leider weiss ich nicht, wie du dir das projekt optisch vorstellst.
als abschluss würde ich noch gerne deine idee mit dem sleep befehl kommentieren. das beste wäre denke ich ein timer, mitdem du die genaue zeit festlegen kannst, wie schnell deine schneeflocke fällt. alternativ geht auch eine for-next-schleife, die allerdings von der rechnergeschwindigkeit abhängt. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 05.12.2008, 18:03 Titel: |
|
|
Sind deine Dateien binärverschlüsselt? Wenn ja, dann kann ich dir nicht weiterhelfen, ich müsste da schon den Text lesen können.
Für Quellcode kann ich übrigens fb:porticula empfehlen. Keine Wartezeit beim Download und funktioniert auch, ohne dass ich extra JavaScript aktiviere ...[/url] _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 05.12.2008, 18:14 Titel: |
|
|
@beast
naja das sind die befehle die wir in der schule gebrauchen und deswegen ist das auch richtig shice  naja das was ich jetzt habe ist im schlechtesten Fall ne 2-
und ähm hab mal versucht das mit ner schwarzen schnee... zu überdecken aber da kommt dann nurn teil hin. Aber noch eine Frage, dass wäre dann auch meine letzte wie kann ich einfach, die schneeflocken am anfang nebeneinander machen das die zusammen runter fallen? Am besten so, dass ich nicht viel umänder oder löschen muss. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 05.12.2008, 21:07 Titel: |
|
|
Ich habe dein Schneefall-Programm etwas verbessert. Das Ergebnis:
Code: |
DECLARE SUB Schneeflocke (X AS INTEGER, Y AS INTEGER, Farbe AS INTEGER)
DECLARE SUB Schnee ()
DECLARE SUB SchneeVor ()
SCREEN 12
TYPE SchneeFlTyp
X AS INTEGER
Y AS INTEGER
A AS INTEGER
END TYPE
DIM SHARED AnzFlocken
DIM SHARED SchneeFl(AnzFlocken) AS SchneeFlTyp
PRINT " Wie viele Schneeflocken?"
INPUT AnzFlocken
REDIM SHARED SchneeFl(AnzFlocken) AS SchneeFlTyp
CALL Schnee
DO
SchneeVor
Taste$ = INKEY$
LOOP UNTIL Taste$ = CHR$(27)
SUB Schnee
FOR i = 1 TO AnzFlocken
SchneeFl(i).X = CINT(RND * 640)
SchneeFl(i).Y = CINT(RND * 500) - 520
SchneeFl(i).A = 0
Schneeflocke SchneeFl(i).X, SchneeFl(i).Y, 7
NEXT
END SUB
SUB Schneeflocke (X AS INTEGER, Y AS INTEGER, Farbe AS INTEGER)
init$ = "BM" + LTRIM$(RTRIM$(STR$(X))) + "," + LTRIM$(RTRIM$(STR$(Y))) + "C" + LTRIM$(RTRIM$(STR$(Farbe)))
DRAW "X" + VARPTR$(init$)
DRAW "ta-20"
DRAW "u9"
DRAW "ta-160"
DRAW "u9"
DRAW "ta-90"
DRAW "u9"
DRAW "ta+140"
DRAW "u9"
DRAW "ta+200"
DRAW "u9"
DRAW "ta+60"
DRAW "u9"
DRAW "ta+130"
DRAW "u9"
DRAW "ta-10"
DRAW "u9"
DRAW "ta+50"
DRAW "u9"
DRAW "ta-76"
DRAW "u9"
END SUB
SUB SchneeVor
SHARED SchneeFl AS SchneeFlTyp
'Start! = TIMER
FOR i = 1 TO AnzFlocken
Schneeflocke SchneeFl(i).X, SchneeFl(i).Y, 0
IF SchneeFl(i).Y > 500 THEN
SchneeFl(i).X = CINT(RND * 640)
SchneeFl(i).Y = CINT(RND * 100) - 120
SchneeFl(i).A = 0
END IF
SchneeFl(i).X = SchneeFl(i).X + 3 - CINT(RND * 6)
SchneeFl(i).Y = SchneeFl(i).Y + CINT(RND * 5) + 3
IF SchneeFl(i).X < 0 THEN SchneeFl(i).X = 0
IF SchneeFl(i).X > 630 THEN SchneeFl(i).X = 630
SchneeFl(i).A = 0
Schneeflocke SchneeFl(i).X, SchneeFl(i).Y, 7
NEXT
'DO
' Ende! = TIMER
'LOOP UNTIL Ende! - Start! > 0
END SUB
|
In der Sub "Schnee" werden die Schneeflocken zuerst zufällig oberhalb des Bildschirms platziert (Y-Koordinate kleiner als 0). Mittels der Sub "SchneeVor" werden die Schneeflocken bewegt und beim Hinausfallen aus dem Bildschirm oben am Bildschirm wieder neu platziert. Die Bewegung selbst ist auch etwas zufällig.
Im Array "SchneeFl" werden die X- und Y-Koordinaten und der Winkel A (engl. "Angle") gespeichert. Der Winkel wird derzeit noch nicht verwendet, aber das kannst du ja noch machen...
Da das Programm auf meinem durchaus neuen Rechner schon sehr langsam läuft, habe ich die Routine zum Verlangsamen auskommentiert. Wenn das Programm also zu schnell laufen sollte, entferne das Kommentarzeichen vor diesen Zeilen und passe ggf. die Zeitdifferenz etwas an.
LG,
St_W _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 06.12.2008, 00:28 Titel: |
|
|
Sooo mein Programm ist jez fertig
Hier der Link: http://uploaded.to/?id=cjfx24
Jetzt meine letzte Frage
Guckt euch mal bitte mein Programm an und sagt mir ob das recursiv und ein fraktal ist.
Dankee |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 06.12.2008, 12:20 Titel: |
|
|
ist jetzt nur n beispiel aber so könnte man die flocken wandern lassen. da ich mich jetzt nicht so mit dem draw befehl auskenne und bei meinem rechner wie gesagt qbasic nicht richtig funzt und bei meinem laptop die hilfe nicht aufrufbar ist, hab ichs einfach mit line umgesetzt.
Code: | x = 30
y = 30
col = 7
CLS
SCREEN 12
LINE (x, y - 5)-(x + 10, y + 5), col
LINE (x, y + 5)-(x + 10, y - 5), col
LINE (x, y)-(x + 10, y), col
LINE (x + 5, y - 5)-(x + 5, y + 5), col
FOR i = 1 TO 80
DO
LOOP UNTIL TIMER > starttime! + .1
LINE (x, y - 5)-(x + 10, y + 5), 0
LINE (x, y + 5)-(x + 10, y - 5), 0
LINE (x, y)-(x + 10, y), 0
LINE (x + 5, y - 5)-(x + 5, y + 5), 0
starttime! = TIMER
y = y + 5
LINE (x, y - 5)-(x + 10, y + 5), col
LINE (x, y + 5)-(x + 10, y - 5), col
LINE (x, y)-(x + 10, y), col
LINE (x + 5, y - 5)-(x + 5, y + 5), col
NEXT i
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 06.12.2008, 12:30 Titel: |
|
|
GRaf hat Folgendes geschrieben: | Guckt euch mal bitte mein Programm an und sagt mir ob das recursiv und ein fraktal ist. |
Hmm - bei der Kombination der Wörter "rekursiv" und "Fraktal" drängt sich bei mir die Vermutung auf, dass nicht das Wandern über den Bildschirm rekursiv aufgerufen werden soll, sondern die Zeichenroutine einer einzelnen Flocke. Kenne aber weder Aufgabenstellung noch Programmquelltext. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 06.12.2008, 13:02 Titel: |
|
|
fraktal ist ja , wenn bei mir z.B. die schneeflocke immer wieder kommt und ich habb ja das oben eine schneeflocke geht dann 50 cm dadrunter usw.
und recursiv ist, wenn ich in einer sub ne andere aufrufe und das hab ich doch eig oder nicht? |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 06.12.2008, 13:51 Titel: |
|
|
Also aus meiner Sicht ist dein Programm - programmiertechnisch gesehen - ein HORROR!
Für was zum Himmel benötigst du die vielen Subs (secvor, secvora, secvorb, secvorc, secvord, secvore, secvorf, secvorg, secvorh, secvori, secvorj, secvork), die genau den selben Code beinhalten??
Aus den "DECLARE SUB ..." sehe ich, dass du wahrscheinlich noch ein paar mehr solche hattest... - welchen Sinn soll das haben?
Du kannst (ich würde davon abraten) entweder immer mit "CALL secvorb" die Sub hintereinander aufrufen - oder (weit besser) in einer Schleife die Sub aufrufen.
Der folgende Code aus deinem Programm funktioniert zwar, aber warum machst du es so kompliziert, wenn es auch weit einfacher funktioniert:
Code: |
'STATT
CALL schneeflocke
IF schnee > 1 THEN
CALL schneeflocke
END IF
IF schnee > 2 THEN
CALL schneeflocke
END IF
IF schnee > 3 THEN
CALL schneeflocke
END IF
IF schnee > 4 THEN
CALL schneeflocke
END IF
IF schnee > 5 THEN
CALL schneeflocke
END IF
IF schnee > 6 THEN
CALL schneeflocke
END IF
IF schnee > 7 THEN
CALL schneeflocke
END IF
IF schnee > 8 THEN
CALL schneeflocke
END IF
IF schnee > 9 THEN
CALL schneeflocke
END IF
IF schnee > 10 THEN
CALL schneeflocke
END IF
'======================================
'BESSER:
FOR i = 1 to schnee
CALL schneeflocke
NEXT
|
Schau dir einmal mein Beispielprogramm einige Posts oberhalb an. Es ist zwar sicher nicht perfekt, aber auf jeden Fall programmtechnisch besser als deines.
Zu deiner obigen Frage:
Dein Programm ist nicht rekursiv. Was du mit "fraktal" meinst, weiß ich nicht so genau. Wenn du laut deiner eigenen Beschreibung oben meinst, dass die Schneeflocken immer wieder von oben kommen, wenn sie am unteren Bildschirmrand verschwunden sind, nennt man das sicher nicht "fraktal". Vielleicht könntest du noch einmal genauer definieren, was du damit meinst.
Übrigens: Die Bedeutung von "fraktal"
Zitat: |
Bedeutungen: Mathematik: a) geometrisches oder mathematisches Gebilde, dessen Form oder Struktur sich sowohl im größeren als auch im kleineren Maßstab immer und immer wieder wiederholt; b) geometrisches Gebilde, dessen [selbstähnliche] Form man innerhalb des Gebildes in kleinerem Maßstab immer wieder entdecken kann. Auch die Natur scheint sich des Öfteren der fraktalen Geometrie zu bedienen. So zeigt z.B. ein Blumenkohl, die Verästelung eines Baums oder ein Farnblatt eindeutig fraktale Eigenschaften. Genauso wie [ähnliche] Bewegung innerhalb von Bewegung die Charakteristik des materiellen Universums umschreibt, so umschreibt [ähnliche] Form innerhalb von Form die Charakteristik eines Fraktals.
Beispiele: Eines der bekanntesten Fraktale ist wohl das Apfelmännchen von Benoît Mandelbrot. Der Algorithmus (Rechenvorschrift), um dieses Fraktal zu berechnen, ist ganz einfach.
Grammatik: Substantiv, Neutrum
Herkunft: zu engl. fractal, verkürzte Form von fractional, von frz. fractale, von lat. fractus = gebrochen, zu frangere = brechen, da manche Fraktale „zerklüftet“ oder „zerbrochen“ zu sein scheinen
|
Echte Schneeflocken, glaube ich, sind annähernd Fraktale. Wenn du das aber am Bildschirm so darstellen willst, hast du eine Menge Arbeit vor dir. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Zuletzt bearbeitet von St_W am 06.12.2008, 14:07, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 06.12.2008, 13:53 Titel: |
|
|
Fraktale sind selbstähnlich. D. h. wenn du einen Teil der Schneeflocke herausnimmst und vergrößerst, siehst du wieder eine nach demselben Prinzip aufgebaute Schneeflocke.
Zitat: | ich habb ja das oben eine schneeflocke geht dann 50 cm dadrunter usw. |
Das klingt nach Verschiebungssymmetrie.
edit: so, das hier ist eine Rekursion und ein Fraktal. Und selbstverständlich überladen.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
GRaf
Anmeldungsdatum: 04.12.2008 Beiträge: 23
|
Verfasst am: 06.12.2008, 18:03 Titel: |
|
|
also in der schule hatten wir einen ast ,dann haben wir den winkel gedreht, dan noch ein ast und immer wieder und das ist dann ein fraktal? |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|