gf2:projekte:2024:minecraft:2d1gruppe5

Thornveil – die Stadt des Blütenstaubes

Gruppe 5

Projekt Idee: Unsere Idee bestand darin eine magische kleine Welt zu errichten, die umgeben wird von einer majestätischen Mauer. Sobald der Code abgerufen wird, entsteht das Dorf. Ist sie fertig entstanden so wird Musik abgespielt und das Dorf ist bereit betreten zu werden. Es ist aber wichtig die Musik abzuwarten! Sobald durch das Thor geschritten wird, so wird ein Weg ersichtlich, der sich durch das Dorf schlängelt, vorbei an grünen Wiesen und bunten Blumen. Wird dem Weg gefolgt so kommt man an kleinen Häuschen und Bäumen vorbei bis zu einem grossen Haupthaus unter Begleitung von Musik.

Prozess:

1. Ideenfindung durch gemeinsames Brainstorming, anschliessendes Erstellen eines Planes auf GoodNotes. Erste Versuche durch Bauen der Objekte und genaue Festlegung der Arbeitsteilung. (Siehe Teams Chat und Scrumboard) Für genauen Prozess, verfolge Scrumboard und Chat auf Teams.

2. Start des Programmierens, Feststellung erster Probleme gruppenintern und auf technischer Ebene. Es folgten verschiedene Gespräche zur Findung von Lösungsansätzen sei es für die Gruppendynamik oder für den Code. Lösungen wurden gemeinsam gefunden oder Entscheidungen zur Verkleinerung des Problems getroffen. (Siehe Schwierigkeiten)

3. Zusammenführung der verschiedenen Codeteile durch Leo.

4. Fazit, Dieses Projekt lehrte uns nicht nur auf technischer Ebene, sondern vor allem im Bezug auf Arbeitseinteilung, Gruppendynamik, Eigeninitiative sowie im Punkt der Lösungsfindung. Im grossen und Ganzen wurde erkannt, dass der Weg das Ziel ist und nicht das Produkt. Jedoch sind wir der Meinung, dass die individuellen Fähigkeiten mehr zur Geltung gekommen wären, wenn die Gruppen niveauangepasst erstellt worden wären.

Schwierigkeiten:

Anfangs war geplant rund um die Mauer einen Fluss fliessen zu lassen, dies erwies sich jedoch als zu komplex. So haben wir entschieden dieses Element aus zu lassen. Weiter zeigte sich eine Welt mit verschiedenen Ebenen als etwas zu kompliziert, weshalb auch dieses Objekt nicht codiert wurde.

Auf Ebene der Gruppendynamik hatten wir Anfangsschwierigkeiten aufgrund vieler Absenzen, diese konnten jedoch behoben werden, durch Kommunikation, Klarstellung der Bedingungen und Eigeninitiative.

Weitere Möglichkeiten:

Diese Projekt hat viel potenzial ausgebaut zu werden. Es können beliebig neue Häuser, Pflanzen und Objekte programmiert und eingefügt werden. So hatten wir auch die Idee Tavernen oder Mühlen zu errichten, was jedoch aus zeitlichen Gründen nicht möglich war.

Anleitung:

Eine Flache Welt muss erstellt werden, in dieser Welt kann unabhängig von der Spielerposition der Code ausgeführt werden. In diese Welt muss per „Erweiterungen“ die Erweiterung „make-code-minecraft-music“ eingefügt werden. Zu finden im Code Editor-„Erweiterungen“ Um das Dorf erscheinen zu lassen muss das Word „Blütenstaub“ in den Chat geschrieben werden. Es ist wichtig, dass nach dem Ausführen des Codes gewartet und Stillgestanden wird, bis der Befehl gegeben wird wieder Bewegen zu dürfen! Damit wilkommen in Thornveil der Stadt des Blütenstaubes und viel Spass.

  mauerlaenge=0#Platzhalter nummer, wird in der Funktion "Stadtmauer" Definiert.#Leo
  mauerbreite=0#Platzhalter nummer, wird in der Funktion "Stadtmauer" Definiert
  BigHouseWidth=0#Platzhalter nummer, wird in der Funktion "ScatterBoneMeal" Definiert
  loading=1   #Fake Boolean um mit 1 und 0 Wahr und Falsch darzustellen, wird in "Loading" verwendet.
  list=[BARREL,CRAFTING_TABLE,STONECUTTER]
  def Stadtmauer(laenge,breite):#Generation der Stadtmauer welche das Dorf umrandet#Leo
      global mauerlaenge
      mauerlaenge=laenge
      global mauerbreite
      mauerbreite=breite
      blocks.fill(STONE_BRICKS,pos(0,0,0), pos(0+laenge,6,0+breite),FillOperation.HOLLOW)
      blocks.fill(AIR,pos(1,0,1), pos(0+laenge-1,7,0+breite-1))
      blocks.fill(STONE_BRICKS,pos(3,0,0), pos(0+laenge-3,7,0))
      if laenge%2==0:#Tür der Stadtmauer, immer in der Mitte durch Modulo.
          blocks.fill(AIR, pos(0+laenge/2-1, 0, 0), pos(0+laenge/2+1, 3, 0), FillOperation.REPLACE)
      else:
          blocks.fill(AIR, pos(0+laenge/2, 0, 0), pos(0+laenge/2+1, 2, 0), FillOperation.REPLACE)
  def Pfad(laenge,breite):#Pfad in der mitte des Dorfes, immer in der Mitte durch Modulo.#Leo
      if laenge%2==0:
          blocks.fill(GRASS_PATH, pos(0+laenge/2-1, -1, 1), pos(0+laenge/2+1, -1, 0+breite), FillOperation.REPLACE)
      else:
          blocks.fill(GRASS_PATH, pos(0+laenge/2-0.5, 0-1, 1), pos(0+laenge/2+0.5, -1, 0+breite), FillOperation.REPLACE)
 
  def Signal(): #Musik welche das Signal zur fertigstellung des Programms gibt.#Leo
      music.change_tempo_by(300)
      music.play_note(Note.C4, 0)
      music.play_note(Note.D4, 0)
      music.play_note(Note.E4, 0)
      music.play_note(Note.F4, 0)
      music.play_note(Note.B3, 0)
      music.play_note(Note.C4, 0)
      music.play_note(Note.D4, 0)
      music.play_note(Note.E4, 0)
      music.play_note(Note.C5, 0,1000)
 
  def Musik():#Musik die spielt sobald der Spieler ins Dorf eintitt.#Leo
      music.set_volume(255)
      music.play_music(MusicDisc.PIGSTEP)
 
  def BuildHouse(LAENGE,BREITE,HOEHE,Xoffset,Yoffset,Zoffset):#Dominique#Leo#Victoria#Julien
      blocks.fill(PLANKS_BIRCH, pos(5+Xoffset,-1+Yoffset, 10+Zoffset), pos(5+Xoffset+ LAENGE, 0+Yoffset+HOEHE, 10+BREITE+Zoffset), FillOperation.HOLLOW)        
      blocks.place(OAK_DOOR, pos(7+Xoffset, 0+Yoffset, 10+Zoffset))
      fenster_hoehe_start = 1
      fenster_hoehe_end = 2
      for h in range(fenster_hoehe_start, fenster_hoehe_end + 1):  # Höhe von 1 bis 2
              blocks.place(GLASS, pos(6+Xoffset, h+Yoffset, 10+Zoffset))  # Fenster links vorne
              blocks.place(GLASS, pos(9+Xoffset, h+Yoffset, 10+Zoffset))  # Fenster rechts vorne
              blocks.place(GLASS, pos(6+Xoffset, h+Yoffset, 10 + BREITE+Zoffset))  # Fenster links hinten
              blocks.place(GLASS, pos(9+Xoffset, h+Yoffset, 10 + BREITE+Zoffset))  # Fenster rechts hinten
      for h in range(fenster_hoehe_start, fenster_hoehe_end + 1):  # Höhe von 1 bis 2
              blocks.place(GLASS, pos(5+Xoffset, h+Yoffset, 12+Zoffset))  # Fenster links außen
              blocks.place(GLASS, pos(5+Xoffset, h+Yoffset, 14+Zoffset))  # Fenster links außen
              blocks.place(GLASS, pos(5+Xoffset+LAENGE,h+Yoffset, 12+Zoffset))  # Fenster rechts außen
              blocks.place(GLASS, pos(5+Xoffset+LAENGE, h+Yoffset, 14+Zoffset))  # Fenster rechts außen
              dach_hoehe = HOEHE // 2 + 2
      for i in range(dach_hoehe):
              blocks.fill(PLANKS_BIRCH, pos(5+Xoffset + i, HOEHE + i+Yoffset, 10+Zoffset), pos(5+Xoffset + LAENGE - i, HOEHE + i+Yoffset, 10 + BREITE+Zoffset), FillOperation.REPLACE)   
      blocks.place(BED, pos(1+Xoffset+LAENGE, 0+Yoffset, 8+Zoffset+BREITE))
      blocks.place(list[randint(0,2)],pos(1+Xoffset+LAENGE+2, 0+Yoffset, 9+Zoffset+BREITE))
  def ScatterBoneMeal(breite):#Victoria #Leo
      agent.set_item(BONE_MEAL, 64, 1)
      agent.set_assist(PLACE_ON_MOVE, False)
      agent.set_assist(DESTROY_OBSTACLES, False)
      agent.set_slot(1)
      agent.teleport_to_player()
      agent.move(FORWARD, 1)
      agent.move(RIGHT, 3)
      for i in range ((breite-BigHouseWidth)/3-3):
          agent.place(DOWN)
          agent.move(LEFT, 6)
          agent.place(DOWN)
          agent.move(FORWARD, 3)
          agent.move(RIGHT, 6)
      agent.teleport(pos(0, 60, 0), SOUTH)
 
  def Detection(laenge,breite):#Leo
      x1 = player.position().get_value(Axis.X)
      y1 = player.position().get_value(Axis.Y)
      z1 = player.position().get_value(Axis.Z)
 
      x = player.position().get_value(Axis.X)
      y = player.position().get_value(Axis.Y)
      z = player.position().get_value(Axis.Z)
 
def on_forever():
 
          x = player.position().get_value(Axis.X)
          y = player.position().get_value(Axis.Y)
          z = player.position().get_value(Axis.Z)
 
          if(x-laenge/2-1<x1<x-laenge/2+1) and (-70<y<5) and (z==z1):
              Musik()
              gameplay.time_set(12000)
              gameplay.title(mobs.target(NEAREST_PLAYER), "Thornveil", "Die Stadt des Blütenstaubes")
              ScatterBoneMeal(breite)
      loops.forever(on_forever)
 
  def Umrandung(laenge,breite):#Leo
      Stadtmauer(laenge, breite)
      Pfad(laenge, breite)
      Detection(laenge, breite)
 
  def BigHouse(length, width, height, Xoffset, Yoffset, Zoffset):#Julien#Victoria#Leo#Dominique
      Xoffset=mauerlaenge/2-length
      Zoffset=mauerbreite-width*2
      global BigHouseWidth
      BigHouseWidth=width
      #Boden
      blocks.fill(WOOL, pos(5+Xoffset, -1+Yoffset, 10+Zoffset), pos(5 + length + Xoffset, -1+Yoffset, 10 + width+Zoffset), FillOperation.REPLACE)
      for h in range(height):#Wände
          blocks.fill(PLANKS_SPRUCE, pos(5+Xoffset, h+Yoffset, 10+Zoffset), pos(5 + length+Xoffset, h+Yoffset, 10+Zoffset), FillOperation.REPLACE)
          blocks.fill(PLANKS_SPRUCE, pos(5+Xoffset, h+Yoffset, 10 + width+Zoffset), pos(5 + length+Xoffset, h+Yoffset, 10 + width+Zoffset), FillOperation.REPLACE)
          blocks.fill(MOSSY_STONE_BRICKS, pos(5+Xoffset, h+Yoffset, 10+Zoffset), pos(5+Xoffset, h+Yoffset, 10 + width+Zoffset), FillOperation.REPLACE)
          blocks.fill(MOSSY_STONE_BRICKS, pos(5 + length+Xoffset, h+Yoffset, 10+Zoffset), pos(5 + length+Xoffset, h+Yoffset, 10 + width+Zoffset), FillOperation.REPLACE)
      #Tür
      blocks.fill(AIR, pos(9+Xoffset, 0+Yoffset, 10+Zoffset), pos(9+Xoffset, 1+Yoffset, 10+Zoffset), FillOperation.REPLACE)
      blocks.place(DARK_OAK_DOOR, pos(9+Xoffset, 0+Yoffset, 10+Zoffset))
      for h in range(1, 3):#Fenster
          for x in range(7, length + 5, 4):
              blocks.place(GLASS, pos(x+Xoffset, h+Yoffset, 10+Zoffset))
              blocks.place(GLASS, pos(x+Xoffset, h+Yoffset, 10 + width+Zoffset))
          for z in range(12, width + 10, 4):
              blocks.place(GLASS, pos(5+Xoffset, h+Yoffset, z+Zoffset))
              blocks.place(GLASS, pos(5 + length+Xoffset, h+Yoffset, z+Zoffset))
      roof_height = height // 2 + 2
      for i in range(roof_height):#Dach
          blocks.fill(MOSSY_STONE_BRICKS, pos(4 + i+Xoffset, height + i+Yoffset, 9+Zoffset), pos(6 + length - i+Xoffset, height + i+Yoffset, 11 + width+Zoffset), FillOperation.REPLACE)
      blocks.place(BED, pos(Xoffset+length/2, 0+Yoffset, 0+width*2+Zoffset-3))
      blocks.place(BED, pos(Xoffset+length/2+1, 0+Yoffset, 0+width*2+Zoffset-3))
  def Tree(x, y, z,Xoffset,Yoffset,Zoffset):#Julien#Victoria
      for i in range(4):#Stamm bauen
          blocks.place(LOG_OAK, pos(x+Xoffset,y + i+Yoffset, z+Zoffset))
      for dx in range(-2, 3):#Blätterkrone bauen
          for dz in range(-2, 3):
              for dy in range(3, 6):
                  if abs(dx) + abs(dz) < 3: #Verhindert zu eckige Form
                      blocks.place(LEAVES_OAK, pos(x + dx+Xoffset, y + dy+Yoffset, z + dz+Zoffset))
 
  def Fire(Xoffset,Yoffset,Zoffset):#Leo#Dominique
      blocks.place(CAMPFIRE, pos(0+Xoffset,0+Yoffset, 0+Zoffset))
 
  def Villagers(x,y,z):#Leo#Dominique
      mobs.spawn(VILLAGER, pos(0+x, 0+y, 0+z))
 
  def Loading():“Leo
      def on_forever():
          if loading==1:
              gameplay.title(mobs.target(NEAREST_PLAYER), "Laden...", "Bitte nicht bewegen")
              gameplay.title(mobs.target(NEAREST_PLAYER), "", "Bitte nicht bewegen")
              loops.pause(1000)
          else:   
              loops.pause(infinity)
      loops.forever(on_forever)
 
  def Loaded():#Signal um das Wiederholen von "Laden" zu verhindern.“Leo
      def on_forever():
          global loading
          loading=2
      loops.forever(on_forever)
 
  def fin():#End Nachricht#Leo
      for i in range (2):
          gameplay.title(mobs.target(NEAREST_PLAYER), "Geladen", "Viel Spass")
          gameplay.title(mobs.target(NEAREST_PLAYER), "", "Viel Spass")
          loops.pause(1500)
 
  def BuildFountain(x, y, z, start_x, start_y, start_z):#Doppelbrunnen#Victoria#Leo#Julien
      # Unterer Brunnen
      blocks.fill(STONE_BRICKS, pos(start_x, start_y, start_z),pos(start_x + x - 1, start_y, start_z + z - 1), FillOperation.REPLACE)
      blocks.fill(AIR, pos(start_x + 1, start_y, start_z + 1),pos(start_x + x - 2, start_y, start_z + z - 2), FillOperation.REPLACE)
      blocks.fill(TORCH, pos(start_x, start_y + 1, start_z), pos(start_x + x - 1, start_y + 1, start_z + z - 1), FillOperation.REPLACE)
      blocks.fill(WATER, pos(start_x + 1, start_y, start_z + 1),pos(start_x + x - 2, start_y, start_z + z - 2), FillOperation.REPLACE)
      center_x = start_x + x/2-1
      center_z = start_z + z/2-1
      blocks.fill(STONE_BRICKS, pos(center_x, start_y, center_z),pos(center_x, start_y + y, center_z), FillOperation.REPLACE)
      blocks.place(WATER, pos(center_x, start_y+y+1, center_z))
 
  def Ausführen():#Ausführung des Codes bei Chat eingabe.#Leo
      Loading()
      Umrandung(40,70)
      BigHouse(12,12,5,10,0,30)#Xoffset und Zoffset sind hier nur Platzhalter da sie in Der funktion neu Definiert werden.
      Tree(10,0,10,18,0,25)#Baum Kopien mit verschiedenen Positionen.
      Tree(10,-1,10,22,0,50)
      Tree(10,0,10,25,0,10)
      Tree(10,-1,10,5,0,10)
      Tree(10,0,10,-1,0,-5)
      Tree(10,0,10,17,0,-3)
      Tree(10,0,10,0,0,18)
      Tree(10,0,10,-2,0,25)
      Tree(10,0,10,6,0,20)
      Tree(10,0,10,27,0,40)
      Tree(10,0,10,-4,0,45)
      Tree(10,0,10,4,0,39)
      BuildHouse(5, 4, 6, 1,0,10)#Häuser kopien mit verschiedenen Positionen.
      BuildHouse(5, 7, 4, 5,0,-2)
      BuildHouse(5, 5, 6, 6,0,30)
      BuildHouse(5, 4, 5, 20,0,5)
      BuildHouse(5, 4, 4, 25,0,16)
      BuildFountain(5,4,10,27,0,42)#Brunnen
      Villagers(10,0,10)#Dorfbewohner für etwas Lebendigkeit
      Villagers(31,0,20)
      Villagers(22,0,6)
      Villagers(16,0,35)
      Fire(34,0,7)#Lagerfeuer
      Fire(34,0,40)
      Fire(17,0,33)
      Loaded()#Text um dem Spieler anzuzeigen das der Code fertig generiert hat.
      Signal()#Musik weann code ausgeführt
      fin()#Signal den Text zu "Geladen" zu ändern.
  player.on_chat("Blütenstaub", Ausführen)
  • gf2/projekte/2024/minecraft/2d1gruppe5.txt
  • Zuletzt geändert: 2025/05/18 13:43
  • von glocknerl