NIKO, der objektorientierte Roboter

Beispielprogramme


Niko räumt alles auf

Bildschirmphoto

Niko hat die Aufgabe, jedes Feld einmal zu betreten und ggf. herumliegende Gegenstände aufzusammeln.

#!/usr/bin/python

from nikos_welt import *

class Roboter_Modell_C(Roboter):
   def __init__(self,welt):
      Roboter.__init__(self,welt,0.2)

   def kehrt(self):
      self.links()
      self.links()

   def rechts(self):
      for i in range (0,3):
         self.links()

   def links_frei(self):
      self.links()
      Zustand=self.vorne_frei()
      self.rechts()
      return Zustand

   def rechts_frei(self):
      self.rechts()
      Zustand=self.vorne_frei()
      self.links()
      return Zustand

   def Linkskurve(self):
      self.links()
      self.vor()
      self.links()

   def Rechtskurve(self):
      self.rechts()
      self.vor()
      self.rechts()

   def vor_bis_Hindernis(self):
      while self.vorne_frei():
          self.vor()

   def Feld_leeren(self):
      while not self.Feld_leer():
         self.nimm()

   def leere_bis_Hindernis(self):
      while self.vorne_frei():
         self.Feld_leeren()
         self.vor()
      self.Feld_leeren()
 


meine_Welt=Welt('welt2.welt',14)
niko=Roboter_Modell_C(meine_Welt)

niko.leere_bis_Hindernis()
ende = "false"
while ende == "false":
   if niko.links_frei():
      niko.Linkskurve()
      niko.leere_bis_Hindernis()
      if niko.rechts_frei():
         niko.Rechtskurve()
         niko.leere_bis_Hindernis()
   if not (niko.links_frei() & niko.rechts_frei()):
      ende = "true"

Tkinter.mainloop()


NIKO trainiert für Olympia

Bildschirmphoto

Niko steht mit Blick nach Norden rechts unten in seiner Welt. Er hat die Aufgabe das Olympiastadion zu finden, dort eine Runde zu drehen und sich dann erschöpft nach Hause zu begeben. Das Stadion ist rechteckig, das Eingangstor kann im Norden, Westen, Süden oder Osten liegen, die Abmessungen des Stadions sind unbekannt, die Lage ist inbekannt. Das Stadion liegt NICHT am Rand der Welt, ein Beispiel für die Situation zeigt das Bildschirmphoto

#! /usr/bin/python

from roboter_C import *

class Roboter_Modell_S(Roboter_Modell_C):
   def __init__(self,welt):
      Roboter.__init__(self,welt)                  

   def vorne_rechts_frei(self):
      self.rechts()
      if self.vorne_frei():
         self.vor()
         self.links()
         zustand=self.vorne_frei()
         self.links()
         self.vor()
         self.rechts()
         return zustand
      else:
         self.links()
         return 0
         
   def vorne_links_frei(self):
      self.links()
      if self.vorne_frei():
         self.vor()
         self.rechts()
         zustand=self.vorne_frei()
         self.rechts()
         self.vor()
         self.links()
         return zustand
      else:
         self.rechts()
         return 0
         
   def Stadion_gefunden(self):
      return self.vorne_links_frei() or self.vorne_rechts_frei()
      

   def markiere_dein_Heim(self):
      self.gib()

   def suche_das_Stadion(self):
      mein_Roboter.vor_bis_Hindernis()
      while not mein_Roboter.Stadion_gefunden():
         mein_Roboter.Linkskurve()
         mein_Roboter.vor_bis_Hindernis()
         if mein_Roboter.Stadion_gefunden():
            break
         else:
            mein_Roboter.Rechtskurve()
            mein_Roboter.vor_bis_Hindernis()
   
   def suche_den_Eingang(self):
      self.rechts()
      while 1:
         while not self.links_frei():
            self.vor()
         self.links()
         self.vor()
         if not self.links_frei() and not self.rechts_frei():
            break

   def drehe_eine_Runde(self):
      self.vor(); self.rechts()
      self.vor_bis_Hindernis()
      self.links()
      self.vor_bis_Hindernis()
      self.links()
      self.vor_bis_Hindernis()
      self.links()
      self.vor_bis_Hindernis()
      self.links()
      while not self.rechts_frei():
         self.vor()
      self.rechts()

   def gehe_nach_Hause(self):
      self.vor_bis_Hindernis()
      self.links()
      while self.Feld_leer():
         self.vor_bis_Hindernis()
         self.links()
      pass

meine_Welt=Welt("stadion.welt")
mein_Roboter=Roboter_Modell_S(meine_Welt)

mein_Roboter.markiere_dein_Heim()
mein_Roboter.suche_das_Stadion()
mein_Roboter.suche_den_Eingang()
mein_Roboter.drehe_eine_Runde()
mein_Roboter.gehe_nach_Hause()

Tkinter.mainloop()


Zwei Roboter arbeiten abwechselnd

Bildschirmphoto
#!/usr/bin/python

import whrandom
from nikos_welt import *
from roboter_c import *

class Roboter_Modell_E(Roboter_Modell_C):
   def __init__(self,welt):
      Roboter_Modell_C.__init__(self,welt)

   def Zufall(self):
      for i in range(whrandom.randint(0,3)):
          self.links()

   def vor(self):
      if self.vorne_frei():
         Roboter_Modell_C.vor(self)
      else:
         self.kehrt()


meine_Welt=Welt('welt0.welt',14)
niko1=Roboter_Modell_E(meine_Welt)
niko2=Roboter_Modell_E(meine_Welt)
niko2.links()
niko2.vor()
niko1.vor()

def kurs1():
   niko1.gib()
   niko1.vor()
   niko1.gib()
   niko1.vor()
   niko1.gib()
   niko1.vor()
   niko1.gib()
   niko1.vor()
   niko1.gib()
   niko1.Zufall()

def kurs2():
   niko2.gib()
   niko2.vor()
   niko2.gib()
   niko2.vor()
   niko2.gib()
   niko2.vor()
   niko2.gib()
   niko2.vor()
   niko2.gib()
   niko2.Zufall()

ende = "false"
while ende == "false":
   kurs1()
   kurs2()
   if niko1.get_Position() == niko2.get_Position():
      ende="true"
   

Tkinter.mainloop()

Zwei Roboter arbeiten gleichzeitig

Bildschirmphoto

Dieses Beispiel führt in die Programmierung von threads ein. Es simuliert die Mutter-Kind- Beziehung: Roboter 1 wirft ständig irgendwo etwas hin, Roboter 2 (Mutter) räumt auf.

#!/usr/bin/python

import whrandom
import thread
from nikos_welt import *
from roboter_c import *

class Roboter_Modell_E(Roboter_Modell_C):
   def __init__(self,welt):
      Roboter_Modell_C.__init__(self,welt)

   def Zufall(self):
      for i in range(whrandom.randint(0,3)):
          self.links()

   def vor(self):
      if self.vorne_frei():
         Roboter_Modell_C.vor(self)
      else:
         self.Zufall()


meine_Welt=Welt('welt0.welt',14)
ziel=(0,0)

def kurs1():
   niko=Roboter_Modell_E(meine_Welt)
   while 1:
      for i in range(whrandom.randint(0,6)): 
         niko.vor()
         niko.gib()
      niko.Zufall()
      if niko.get_Position()==ziel:
         thread.exit()

def kurs2():
   niko=Roboter_Modell_E(meine_Welt)
   while 1:
      for i in range(whrandom.randint(0,6)): 
         niko.Feld_leeren()
         niko.vor()
      niko.Zufall()
      if niko.get_Position()==ziel:
         thread.exit()

thread.start_new_thread(kurs1,())  # referenz, Parameter
thread.start_new_thread(kurs2,())  # referenz, Parameter
Tkinter.mainloop()


zurück

Dr. Bernd Kokavecz
15.12.99