Simulation

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

Ixam

Betreff: Simulation

BeitragSo, Jun 17, 2007 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich möchte eine Bakterien bzw. Immunsystemsimulation schreiben. Damit ich nicht ständig wenn das Gebiet wechselt neue Themen machen muss schreib ich alle Fragen hierein... Wink
Mein erstes Problem ist folgendes
Code: [AUSKLAPPEN]
Type Bakterie
 Field TeilungZ%
 Field posx%
 Field Posy%
End Type

Local B.Bakterie

B= New Bakterie
B\TeilungZ% = teilg%
B\Posx% = 150
B\Posy% = 150

Teilg% ist ,wenn ich ihn in eine Datei schreiben lass richtig nur B\TeilungZ% ist nicht gleich !
Warum?
 

Ixam

BeitragSo, Jun 17, 2007 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das problem habe ich inzwischen nach vielem nachdenken umgangen! Wink
Jetzt habe ich aber eine andere Frage:
Wenn ich folgenden code habe:
Code: [AUSKLAPPEN]
Zeit%=0
Repeat
Zeit%=Zeit%+1
Until keyhit(1)

Wann ist dann eine sekunde rum? gibts vieleicht einen Befehl für das?
Ixam

Noobody

BeitragSo, Jun 17, 2007 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst einfach am Anfang der Schleife das da:
Code: [AUSKLAPPEN]
time=Millisecs()

Das speichert die Programmzeit in der Variable time.
Dann fragst du in der Schleife ab:
Code: [AUSKLAPPEN]
If Millisecs()-time>=1000 Then
  Zeit%=Zeit%+1
  time=Millisecs()
EndIf

Dies fragt nun ab, ob die aktuelle Zeit minus die Zeit am Anfang der Schleife grösser als 1000 Millisekunden ist (=1 Sekunde).
Dann speichert es die aktuelle Zeit wieder in der Variablen time.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

darth

BeitragSo, Jun 17, 2007 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
t=millisecs()
repeat
 if millisecs()-t>1000 then
  text 10,10,"Sekunde ist um" ;verschwindet gleich wieder :P
  t=millisecs()
 endif
until keyhit(1)


millisecs() liest den aktuellen stand der millisekunden bis zu systemstart aus. die differenz zwischen zwei millisecs() werten gibt dir eine zeitspanne an, nun kannst du einfach auswählen wie gross die sein soll Smile (code s.o.)
Diese Signatur ist leer.
 

Ixam

BeitragSo, Jun 17, 2007 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!
Ixam

P.S. Kannst mir jemand veraten wie ich eine kommazahl aus einer Datei auslese?

Noobody

BeitragSo, Jun 17, 2007 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das?
Wenn jetzt z.B. 0.7 in einer TXT-Datei steht?
Dann öffnest du die Datei mit OpenFile("deine_datei.txt"), speicherst den Rückgabewert und dann mit ReadFloat(rückgabewert) auslesen.
Aber für sowas guckt man 1 min. lang in die Command Reference und man hat die Befehle.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

darth

BeitragSo, Jun 17, 2007 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
imfalle einer von dir angelegten datei (writefloat datei,float#):
Code: [AUSKLAPPEN]
zahl#=readfloat(datei)

oder (falls es in einem textfile steht)
Code: [AUSKLAPPEN]
tmp$=readline(datei)
 zahl#=getnumberoutofstring(tmp$)

natürlich musst du die funktion noch schreiben Razz
ich würde da irgendwas basteln, das die vorkomma stellen ausliest (left(string$,anz)+right(string$,anz)+len(string$) sollten da reichen) - dann die nachkommastellen, und schlussendlich vorkomma+nachkomma/10^anzal_nachkomma
Diese Signatur ist leer.
 

Ixam

BeitragSo, Jun 17, 2007 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Hilfe,aber den letzten Beitrag habe ich nicht ganz kapiert
Ixam

Silver_Knee

BeitragMo, Jun 18, 2007 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
wen deine txt so aussieht:
[quote=txt]bla
Hans
1.74
Coool
gammel[/quote]
dann geht das einfach mit:
Code: [AUSKLAPPEN]
fl#=FLoat(Readline(file))
 

Ixam

BeitragDi, Jun 19, 2007 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke
nächste Frage Rolling Eyes :
Gibt es einen Befehl um zu sagen das, dass nur zutrifft wenn das ergebnis von dem und dem eine natürliche zahl ist?
Ixam

Skabus

BeitragDi, Jun 19, 2007 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ixam hat Folgendes geschrieben:
Danke
nächste Frage Rolling Eyes :
Gibt es einen Befehl um zu sagen das, dass nur zutrifft wenn das ergebnis von dem und dem eine natürliche zahl ist?
Ixam


Hm...ich seh da keine Schwierigkeiten.
Ob etwas zutrifft kann man mit If abfragen.
Und natürliche Zahlen sind doch alle zahlen außer die negativen....
Oder sehe ich das falsch?Ergo:


Code: [AUSKLAPPEN]


If (Summant + Summant) >= 0 Then

  Blablablabefehleblablabla

Endif



Hoffe ich konnte helfen....

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
 

Ixam

BeitragDi, Jun 19, 2007 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry ich meinte natürlich ganze zahlen Embarassed
Hab aber inzwischen das ganze doch selber gelößt
Danke
Ixam

Silver_Knee

BeitragDi, Jun 19, 2007 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
mit int kannst du runden also:

if int(zahl)=zahl

also wenn die gerundete zahl = der zahl selbst und das trifft ja nur bei ganzen zahlen ein
 

Ixam

BeitragDi, Jun 19, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es doch nicht gelöst (hat immer noch ne Macke).
Ich schildere es jetzt genauer:
Ich lasse eine Schleife durchlaufen und zähle die Schleifendurchläufe. Ich möchte nun, dass eine bestimmte aktion alle x durchläufe ausgefürht wird. Wie mache ich das?
Ixam

Skabus

BeitragDi, Jun 19, 2007 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ixam hat Folgendes geschrieben:
Sorry ich meinte natürlich ganze zahlen Embarassed
Hab aber inzwischen das ganze doch selber gelößt
Danke
Ixam


Hm....in wie weit müssen da die Faktoren/Summanten/etc.. beachtet werden?
Weil du ja im Grunde nur wissen musst ob die einzelnen Teile Kommastellen haben können wenn wir z.B. haben:

Code: [AUSKLAPPEN]


y# = 1.5
x# = 2.0

If (y + x) = ganze Zahl Then

   Blablabla

EndIf



Dann musst du durch subtraieren und durch Anwenden von floor() (rundet ab) und ceil() (rundet auf) den Rest hinter dem Komma herausfinden.
Oder man nimmt int().Wenn der Rest dann größer ist als 0 dann handelt es sich um eine ganze Zahl.

Hier am Beispiel:

Code: [AUSKLAPPEN]


y# = 1.5   ;erster Teil der Rechnung
x# = 2.0   ;zweiter Teil der Rechnung


If (y + x) = (int(y) + int(x)) Then

 ;Befehle.....

EndIf




So nach etlichen Edits hab ich mal gemerkt das ich zu doof zum rechnen
bin.So klappt das ganze nun^^

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu
 

Ixam

BeitragSo, Jun 24, 2007 10:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe eine andere Frage:
wie kann ich bei über 10000 erstellte types in einer schleife eine Bedingung abfragen und wenn die bedingung zutrifft wird das type entfernt .
Danke schon im voraus
Ixam

Tankbuster

BeitragSo, Jun 24, 2007 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich habe eine andere Frage:
wie kann ich bei über 10000 erstellte types in einer schleife eine Bedingung abfragen und wenn die bedingung zutrifft wird das type entfernt .

Die Anzahl spielt keine Rolle. Allerdings läuft es bei so vielen sicherlich nicht grade schnell Laughing
Ich hab mir mal 2 beispiele ausgedacht:

Code: [AUSKLAPPEN]
For S.spieler = Each spieler
If S\bedingung=1
Delete S
Endif
Next


Code: [AUSKLAPPEN]
For S.spieler = Each spieler
If S\leben<1
Delete S
Endif
Next
Twitter
Download Jewel Snake!
Windows|Android
 

Ixam

BeitragMo, Jun 25, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Das habe ich schon ausprobiert gehabt. Es klappt nicht wirklich, da alle Types gelöscht werden. Wo ist mein fehler?
Ixam

BladeRunner

Moderator

BeitragMo, Jun 25, 2007 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Glaskugel oder Code ist diese Frage nicht zu beantworten.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Tankbuster

BeitragMo, Jun 25, 2007 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, du hast eine Variable genommen, zum beispiel:
Zitat:
variable=1

und dann hast du folgendes hingeschrieben:

Zitat:
For S.spieler = Each spieler
If variable=1
Delete S
Endif
Next


Dann wird jeder Spieler gelöscht, denn antword ist bei jedem 1!
Deshalb ist es sinnvoll für jeden Type noch ein extra Feld anzulegen, in dem die Bedingung gespeichert ist. Ein kleiner beispielcode:

den mag ich^^

Code: [AUSKLAPPEN]
Type Schnee
Field x
Field y
Field speed
End Type

Graphics 800, 600
SetBuffer BackBuffer()

;es werden 300 Types erstellt
For i=1 To 300

   S.Schnee=New Schnee
   S\x=Rnd(800)
   S\y=Rnd(-1000)
   S\speed=Rnd(1,2)

Next

While Not KeyHit(1)
   Cls

   For S.Schnee=Each Schnee ;für jeden Schnee-Type

      S\y=S\y+S\speed ;wird S\y vergrößert
      Plot S\x,S\y ;und es wird ein Punkt an der Position gemalt

         If S\y>300 Then ;Hier! Wenn S\y größer als 300 ist, wird das Type gelöscht!
         Delete S
      
         EndIf


      Next

Flip
Wend
Twitter
Download Jewel Snake!
Windows|Android

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group