![]() |
Simulation kleiner "Dinger" (Achtung Sinnfrei)
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
dieses Programm ist mehr aus langeweile herraus entstanden. Im Prinzip sollen dort n "Partikel" die ihn am nächste "Nahrung" aus n "Nahrung" auswählen und sich zu dieser hinbewegen und diese "fressen". Das Programm ist noch nicht ganz fertig, evtl. auch etwas unschön geschrieben UND es hat einen Bug.... und zwar bewegen sich die "Partikel" irgendwann nicht mehr weiter, und fressen auch nicht mehr. Anleitung: Erstellen der Partikel mit rechtsklick. Neue Nahrung per Button. Getestet: Auf 3 WinXP Rechnern. EDIT1: Neue Version (siehe Partikel3.zip), Array's haben jetzt definitiv keine Indexfehler mehr(hoffentlich^^) und die Anzahl kann pr Eingabefeld bestimmt werden. (Achtung: BEi 0 oder nicht Integer werten kommt ein Error, hab noch keine Überprüfung drinne.) Furuha |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Bewegen tuen die sich alle zwar, aber bei mir laufen die nach wenigen Sekunden alle auf den selben Punkt zu und zappeln dort nur rum.
Wenn ich das Programm maximiere, dann malt der Mauszeiger rechts (neben der Zeichenfläche) so eigenartig rum? Tipp: wir haben hier schon kleine Einwohner ... falls du dort mal etwas abgucken willst z.B.: ![]() |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Danke für den Verweis.
Und genau dieses stehenbleiben und rumzappeln was du ansprichst ist das Problem. Vorallem alle auf dem selben Punkt! Vllt handhabe ich die array's falsch? btw. : Kann sich ein timer eigentlich überhohlen? oder wartet der bis zur nächsten Ausführung bis der einmal durch ist? Furuha |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
nun. Um das "sich selbs überholen" auszuschalten mach doch sowas:
Delphi-Quellcode:
procedure form.OnTimerTimer;
begin timer.enabled:=false; //code... timer.enabled:=true; end; |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Also ein Timer kann sich nicht "überholen", es sei den du machst z.B. ein Application.ProcessMessages drt rein, womit die Nachrichtenschleife mittendrin ausgeführt wird.
Denn die Timernachricht wird von dieser abgearbeitet und alle Nachrichten werden normaler Weise nacheinander verarbeitet. Wegen dem an einer Stelle sammeln ... vermutlich ist einfach deine Berechnung irgendwo falsch ... ich hatte es hier auch schon, daß sich sehr viele Partikel in einer Futterstelle sammelten und diese nicht verschwand. womöglich könntest du auch etwas mit Records rumspielen, damit sieht man dann auch leichter, was womit gemeint ist. (vielleicht hast'e ja nur irgendwo 'nen falschen Array-Index verwendet)
Delphi-Quellcode:
wofür ist px1 und px2?
// statt
var partikel: array of array[0..3] of extended; food: array of array[0..2] of extended; // z.B. lieber sowas type TPartikel = record x, y, movX, movY: extended; end; TFood = record x, y, mirfälltgradkeinnamedafürein: extended; end; var partikel: array of TPartikel; TFood: array of TFood; und warum sind x2 und y2 globale Variablen, wo sie doch nur in FormMouseMove verwendet werden ja und wozu wird in FormMouseMove gemalt ... wird doch eh gleich wieder vom Timer übermalt PS: Deine CodeFormatierung ist nicht unbedingt die Beste ... könnte man vielleicht etwas aufräumen |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Hab den Code etwas von Müll befreit, allerdings noch nicht neu formatiert. Neue Version im ersten Post.
EDIT: Indexfehler usw. sollten auch beseitigt sein. Mehr Infos im ertsen Post. |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Hallo furuha,
ich hab mir mal Deine Sourcen angetan. OK, daß die Formatierung noch im argen liegt weißt Du ja. Aber als ich es ausprobiert habe, hat es mal funktioniert (der Hintergrund wurde weiß) und mal nicht. Neben dem Formatieren der Sourcen solltest Du vielleicht etwas an der Oberfläche arbeiten, z.B. "Start mit Rechtsklick der Maus" oder einen "Start"-Button. Unter uses hast Du wohl alle Units eingebunden die Dir über den Weg gelaufen sind, da wäre weniger auch mehr, denn Grids z.B. wird wohl überhaupt nicht benötigt. Zum Programm selbst, da hab ich nur ein paar rote Rechtecke gesehen, und viele Masernflecken, die sich auf einer Diagonalen einfanden und dann mehr oder weniger geordnet in einem Kanalloch verschwanden. (wenn es denn dann lief) Gruß K-H |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Das flackert aber teilweise ganz schön, hast du
Delphi-Quellcode:
eingestellt?
DoubleBuffered := true;
Warum nehmen die Partikel nicht immer den kürzesten Weg zum Futter. Manchmal schließen sie erst zu einer Reihe weiterer Partikel auf und folgen dann erst zu der Nahrung. Oder ist das Absicht? |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Zitat:
|
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Also doch Absicht ;-)
Naja, alleine essen macht ja auch dick^^ |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
hier gibts noch mehr fressende Tierchen, mit sagen wir mal etwas "echteren" künstlichen Intelligenz :-)
![]() |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Eigentlich sollten die alle immer zum nahegelegensten Nahrungs"kästchen" pilgern.
"DoubleBuffered := true;" müsste im Source stehen. Zu den Units...an denen habe ich garnichts geändert...ich hatte halt irgendwann mit Delphi 2005 PE ne Form mit Code die ausführbar und hab erstmal alles so gelassen. Bin mit der 05er nicht ganz so vertraut. Den Link werde ich mir auch noch genauer anschauen. EDIT: Die Teile kennen nur 8 Bewegungsrichtungen. Aber warum die Gruppen bilden ist mir schleierhaft... Da war noch ein Fehler in der Richtungs bestimmung:
Delphi-Quellcode:
Vorher waren da keine Else-If Anweisungen, sondern ein einfaches if.
if round(food[tp3, 0]) < partikel[index, 1] then begin
partikel[index, 1] := (partikel[index, 1] - 1); end else if round(food[tp3, 0]) > partikel[index, 1] then begin partikel[index, 1] := (partikel[index, 1] + 1); end; if round(food[tp3, 1]) < partikel[index, 0] then begin partikel[index, 0] := (partikel[index, 0] - 1); end else if round(food[tp3, 1]) > partikel[index, 0] then begin partikel[index, 0] := (partikel[index, 0] + 1); end; |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Liste der Anhänge anzeigen (Anzahl: 1)
[edit]schwachsinn
[edit2]
Delphi-Quellcode:
ist dir die 1 schonmal aufgefallen?
for * := 1 to high
(wo beginnt denn das Array? ) [add]
Delphi-Quellcode:
dann wollt ich erstmal hierrauf hinweisen ... speziell auf 0 und 1
if round(food[tp3, 0]) < partikel[index, 1] then begin
... if round(food[tp3, 1]) < partikel[index, 0] then begin ... hab mich dann aber immernoch gewundert, warum die nie zum nächsten Futter wollten dann fand ich hier den weiteren Fehler (ebenfalls 0 und 1), wodurch diese nicht da gezeichnet wurden, wo sie waren
Delphi-Quellcode:
- füg einfach mal diesen Code wieder ein und schau auf die Entfernungen und Futternummern ... da stimmt nicht grad viel
for index2 := 0 to high(food) do
begin canvas.rectangle(Round(food[index2, 1])-10, Round(food[index2, 0])-10, Round(food[index2, 1])+10, Round(food[index2, 0])+10); canvas.TextOut(Round(food[index2, 1])+10, Round(food[index2, 0])+10, IntToStr(index2) + ':' + FloatToStr(food[index2, 2])); end; - läßt sich in Ruhe ansehn, wenndu den Timer natürlich stoppst (Rechtsklick, solange bis du genügend "nicht überschriebene" Zahlen siehst) der Fehler lag also die ganze Zeit in deinen "unübersichtlichen" Arrays versteckt. ach ja... - code etwas formatiert - einiges "unnötiges/sinnloses" gelöscht [edit3] seh grad, in Partikel3 wars schon weg :stupid: - einiges verschoben (vorallem das Zeichnen) - fehler korrigiert - futter > futternummer : inhalt - partikel > futternummer, wo es hin will : entfernung |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
also ich kann bei allen drei Versionen nichts als ein leeres graues feld und ein-zwei buttons sehen.. Vielleicht hängt das damit zusammen das ich Vista benutze - keine Ahnung :(
|
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Ist bei mir genau so! Mit XP. Alles was ich auf der Form seh ist mein schmutziger Monitor. :gruebel:
|
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Auch nach'm Rechtsklick?
|
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Liste der Anhänge anzeigen (Anzahl: 1)
hab mal schnell noch 'nen [Start]-Button (damit man nicht erst wo hinklicken muß, was man womöglich nicht weiß) und ein paar Edits und Co. eingefügt
Edits werden nur beim Drücken auf [Start] übernommen und entsprechen dem der Tasten darüber und die Checkboxen reagieren gleich |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Vielen Dank himitsu. werde mir dein "werk" gleich mal ansehen...
ich muss aber auch zugeben das (außer ich zwinge mich dazu - gaaanz selten xD) mein Source nieee so ganz leicht durschaubar und gut strukturiert ist. EDIT: Ja ich sehe deutliche Vorteile in deiner Version gegenüber meiner^^ ICh werde hier jetzt auch garnicht versuchen meine oder mich groß zu verteidigen - das würde eh nach hinten losgehen.... |
Re: Simulation kleiner "Dinger" (Achtung Sinnfrei)
Wie schonmal gesagt (#5), am einfachsten wäre es noch, wenn du zukünftig statt Array-of-Array lieber ein Array-of-Record nutzt.
Dort hätte man dann anstatt var[index,0] und var[index,1] ein var[index].x und var[index].y und bei X und Y erkennt man doch viel eher, wofür diese da sind. PS: ich muß zugeben, daß ich auch nicht sonderlich "ordentlich" bin ... mehrere Befehle in einer Zeile (manchma sogar gleich ganze Prozeduren, aber ich find's oftmals so übersichtlicher) und vorallem Kommentare sucht man meistens vergebens, aber bei der Bennung und Strukturierung von Variablen, Typen und Co. kann man sich dennoch viel Arbeit (später) ersparen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz