Heute hatte ich große Lust, mal wieder irgend etwas mit TigerJython anzustellen. Meine Wahl fiel auf eine zweidimensionale Simulation der Brownschen Bewegung, wie sie Jarka Arnold, Tobias Kohn und Aegidius Plüss in ihrem Online-Tutorial »Programmierkonzepte mit Python und der Lernumgebung TigerJython« auf den Seite 355ff. vorgestellt haben. Herausgekommen ist dieses kleine Programm:
from gamegrid import *
# =========================== class Particle ===========================
class Particle(Actor):
def __init__(self):
Actor.__init__(self, "sprites/ball.gif", 2)
# Called when actor is added to gamegrid
def reset(self):
self.oldPt = self.gameGrid.toPoint(self.getLocationStart())
def advance(self, distance):
pt = self.gameGrid.toPoint(self.getNextMoveLocation())
dir = self.getDirection()
# Left/right wall
if pt.x < 5 or pt.x > WIDTH - 5:
self.setDirection(180 - dir)
# Top/bottom wall
if pt.y < 5 or pt.y > HEIGHT - 5:
self.setDirection(360 - dir)
self.move(distance)
def act(self):
self.advance(3)
if self.getIdVisible() == 1:
pt = self.gameGrid.toPoint(self.getLocation())
self.getBackground().drawLine(self.oldPt.x, self.oldPt.y, pt.x, pt.y)
self.oldPt.x = pt.x
self.oldPt.y = pt.y
# =========================== class CollisionListener ==================
class CollisionListener(GGActorCollisionListener):
# Collision callback: just exchange direction and speed
def collide(self, a, b):
dir1 = a.getDirection()
dir2 = b.getDirection()
sd1 = a.getSlowDown()
sd2 = b.getSlowDown()
a.setDirection(dir2)
a.setSlowDown(sd2)
b.setDirection(dir1)
b.setSlowDown(sd1)
return(10) # Wait a moment until collision is rearmed
# =========================== Hauptprogramm ============================
def init():
collisionListener = CollisionListener()
for i in range(nbParticles):
particles[i] = Particle()
# Put them at random locations, but apart of each other
ok = False
while not ok:
ok = True
loc = getRandomLocation()
for k in range(i):
dx = particles[k].getLocation().x - loc.x
dy = particles[k].getLocation().y - loc.y
if dx*dx + dy*dy < 300:
ok = False
addActor(particles[i], loc, getRandomDirection())
# Select collision area
particles[i].setCollisionCircle(Point(0, 0), 8)
# Select collision listener
particles[i].addActorCollisionListener(collisionListener)
# Set speed in groups of 10
if i < 10:
particles[i].setSlowDown(2)
elif i < 20:
particles[i].setSlowDown(3)
elif i < 30:
particles[i].setSlowDown(4)
# Define collision partners
for i in range(nbParticles):
for k in range(i + 1, nbParticles):
particles[i].addCollisionActor(particles[k])
particles[0].show(1)
WIDTH = 400
HEIGHT = 400
nbParticles = 40
particles = [0]*nbParticles
makeGameGrid(WIDTH, HEIGHT, 1, False)
setSimulationPeriod(10)
setTitle("Brownsche Bewegung")
show()
init()
doRun()
Auch wenn Ihr das alles unter oben angegebenen Link nachlesen und nachvollziehen könnt, habe ich den Quellcode doch noch einmal hier und in meinem GitLab-Repositorium veröffentlicht, denn in der von mir ausgedruckten Fassung hatten sich die Autoren um das bei Python-Klassen übliche self
herumgedrückt. Kann man zwar machen, ist aber nicht sehr pythonisch und verwirrte zumindest mich1.
Ansonsten habe ich festgestellt, daß ich mir das Modul gamegrid
dringend mal (in der Java-Dokumentation) genauer anschauen muß. Denn das obige Skript verwendet Methoden, die in der TigerJython-Doku nicht aufgeführt sind, die mich aber glauben lassen, daß gamegrid
noch mächtiger ist, als ich bisher gedacht hatte. Still digging!
Die aktuelle Online-Version hat das mittlerweie korrigiert. Dort steht nun anstelle des verwirrenden p
ein self
. Habe ich aber erst bei der Abfassung dieses Beitrags bemerkt. ↩
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!