archiv:ef:ef2020_2022:minecraft:projekt:maximandrin:start:code

#Globale Variabeln initiieren

w = 0 h = 0 board = 0 piece = 0 pieceX = 0 pieceY = 0 color = DIAMOND_BLOCK isRunning = False origin = player.position() score = 0

#Generelle Funktionen

def startTetris():

  player.say("startTetris")
  global w
  global h
  global board
  global piece
  global pieceX
  global pieceY
  global isRunning
  global origin
  global score
  
  #Grösse der Spielfläche
  w = 9
  h = 15
  
  #erstellen einer zweidimensionalen Liste zum Speichern der Spielfläche
  # (0/1) (1/1)
  # (0/0) (1/0)
  board = []
  for i in range(w):
      temparr = range(h)
      board[i] = temparr
      for j in range(h):
          board[i][j] = 0
  
  #erstellen des ersten Tetrominos
  pieceX = Math.round(w/2) - 2
  pieceY = h - 1
  getPiece()
  
  #Spieler zentrieren und Agenten wegteleportieren
  agent.teleport_to_player()
  player.teleport(agent.get_position())
  origin = player.position()
  command = "tp ~ ~ ~ facing ~ ~" + h/3 + " ~10"
  player.execute(command)
  agent.teleport(pos(0, -10, 0), SOUTH)
  
  #"Spielkonsole" bauen
  makeBoard(w - 1, h - 1)
  
  #Spiel starten
  isRunning = True
  score = 0
  gameloop()

player.on_chat(„start“, startTetris)

def makeBoard(w, h):

  #Plattform bauen
  blocks.fill(GLASS, pos(-1, -1, -1), pos(1, -1, 1))
  blocks.fill(GLASS_PANE, pos(-1, 0, -1), pos(1, 0, -1))
  blocks.fill(GLASS_PANE, pos(-1, 0, 1), pos(1, 0, 1))
  blocks.place(GLASS_PANE, pos(-1, 0, 0))
  blocks.place(GLASS_PANE, pos(1, 0, 0))
  
  #Bildschirm bauen
  n = Math.round(w / 2)
  o = Math.round(w/2%1)
  blocks.fill(BLACK_CONCRETE, pos(-n, 0, 11), pos(n+o, h, 11))
  blocks.fill(POLISHED_ANDESITE, pos(-n-1, -1, 11), pos(-n-1, h+1, 9))
  blocks.fill(POLISHED_ANDESITE, pos(n+o+1, -1, 11), pos(n+o+1, h+1, 9))
  blocks.fill(POLISHED_ANDESITE, pos(-n-1, -1, 11), pos(n+o+1, -1, 9))
  blocks.fill(POLISHED_ANDESITE, pos(-n-1, h+1, 11), pos(n+o+1, h+1, 9))
  blocks.fill(AIR, pos(-n, 0, 9), pos(n+o, h, 10))
  blocks.fill(GLASS, pos(-n, 0, 9), pos(n+o, h, 9))

def stopTetris():

  global isRunning
  
  #Aus gameloop() ausbrechen
  isRunning = False

player.on_chat(„stop“, stopTetris)

def getPiece():

  global piece
  global color
  global pieceX
  
  #Eines der Tetrominos wählen
  n = Math.random() * 7
  if n < 1:
      #I
      piece = [[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,1,0,0]]
      color = LIGHT_BLUE_WOOL
  elif n < 2:
      #O
      piece = [[1,1],[1,1]]
      color = YELLOW_WOOL
      pieceX = pieceX + 1
  elif n < 3:
      #T
      piece = [[0,1,0],[1,1,0],[0,1,0]]
      color = PURPLE_WOOL
  elif n < 4:
      #S
      piece = [[1,0,0],[1,1,0],[0,1,0]]
      color = RED_WOOL
  elif n < 5:
      #2
      piece = [[0,1,0],[1,1,0],[1,0,0]]
      color = LIME_WOOL
  elif n < 6:
      #L
      piece = [[1,1,0],[0,1,0],[0,1,0]]
      color = ORANGE_WOOL
  elif n < 7:
      #J
      piece = [[0,1,0],[0,1,0],[1,1,0]]
      color = BLUE_WOOL

#Durchgehend wiederholende Funktion die Spiel „steuert“

def gameloop():

  global isRunning
  frame = 0
  
  #Wiederholen bis Spieler "stop" schreibt
  while isRunning:
      #Bei Bewegung den Tetromino bewegen
      movedDirection = playerMoved()
      if movedDirection[0] != "":
          movePiece(movedDirection[0], movedDirection[1])
          player.teleport(origin)
      
      #Alle 20 Durchläufe den Tetromino nach unten bewegen
      if frame % 20 == 0:
          moveDown()
      frame += 1

#Bewegen der Tetrominos

def playerMoved():

  
  #neue und alte Position vergleichen
  cPos = player.position()
  if origin.to_string() == cPos.to_string():
      return ["", ""]
  else:
      #Richtung bestimmen
      x = origin.get_value(Axis.X) - cPos.get_value(Axis.X)
      y = origin.get_value(Axis.Y) - cPos.get_value(Axis.Y)
      z = origin.get_value(Axis.Z) - cPos.get_value(Axis.Z)
      if x < 0:
          return ["x", "+"]
      elif x > 0:
          return ["x", "-"]
      elif y != 0:
          return ["y", "+"]
      elif z < 0:
          return ["z", "+"]
      else:
          return ["z", "-"]

def movePiece(direction, sign):

  player.say("movePiece")
  global piece
  
  #Je nach Richtung richtige Bewegung ausführen
  if direction == "x" and sign == "-":
      move(-1)
  elif direction == "x" and sign == "+":
      move(1)
  elif direction == "y":
      moveToBottom()
  elif direction == "z" and sign == "-":
      rotateLeft()
  else:
      rotateRight()

def move(n):

  player.say("move")
  global piece
  global pieceX
  global pieceY
  
  #X Wert des Tetrominos ändern
  newX = pieceX + n
  if not checkCollisions(piece, newX, pieceY, False):
      checkCollisions(piece, newX, pieceY, True)

def moveDown():

  player.say("moveDown")
  global piece
  global pieceX
  global pieceY
  
  #Y Wert des Tetrominos ändern
  newY = pieceY - 1
  checkCollisions(piece, pieceX, newY, True)

def moveToBottom():

  player.say("moveToBottom")
  global piece
  global pieceX
  global pieceY
  global board
  
  #Y Wert des Tetrominos senken bis Kollision stattfindet
  newY = pieceY
  while not checkCollisions(piece, pieceX, newY, False):
      newY = newY - 1
  for i in range(piece.length):
      for j in range(piece.length):
          if piece[i][j] == 1 and pieceY < h - 1:
              blocks.place(AIR, positions.add(origin, pos(-w/2+pieceX+i, pieceY+j, 10)))
  pieceY = newY + 1
  placePiece()

def rotateLeft():

  player.say("rotateLeft")
  global piece
  global pieceX
  global pieceY
  tempPiece = []
  newPiece = []
  for i in range(piece.length):
      tr = range(piece.length)
      tempPiece[i] = tr
      newPiece[i] = tr
      for j in range(piece.length):
          tempPiece[i][j] = 0
          newPiece[i][j] = 0
  newPiece = piece
  tPiece = piece
  
  #gedrehtes Tetromino in neue Liste speichern
  for i in range(piece.length):
      for j in range(piece.length):
          tempPiece[i][j] = tPiece[i][piece.length-1-j]
  for i in range(piece.length):
      for j in range(piece.length):
          newPiece[j][i] = tempPiece[i][j]
  piece = tPiece
  if not checkCollisions(newPiece, pieceX, pieceY, False):
      checkCollisions(newPiece, pieceX, pieceY, True)

def rotateRight():

  player.say("rotateRight")
  global piece
  global pieceX
  global pieceY
  tempPiece = []
  newPiece = []
  for i in range(piece.length):
      tr = range(piece.length)
      tempPiece[i] = tr
      newPiece[i] = tr
      for j in range(piece.length):
          tempPiece[i][j] = 0
          newPiece[i][j] = 0
  newPiece = piece
  
  #gedrehtes Tetromino in neue Liste speichern
  for i in range(piece.length):
      for j in range(piece.length):
          tempPiece[j][i] = piece[i][j]
  for i in range(tempPiece.length):
      for j in range(tempPiece.length):
          newPiece[i][tempPiece.length-1-j] = tempPiece[i][j]
  checkCollisions(newPiece, pieceX, pieceY, True)

def checkCollisions(newPiece, newX, newY, proceed):

  player.say("checkCollisions")
  global board
  
  #Kollisionen finden und testen ob Tetromino zuunterst ist
  #Ohne tempPiece entsteht Error, weil type von newPiece nicht bekannt ist
  tempPiece = [[0]]
  tempPiece = newPiece
  collided = False
  bottom = False
  walls = False
  for i in range(newPiece.length):
      for j in range(newPiece.length):
          if newPiece[i][j] == 1:
              if i + newX >= board.length or i + newX < 0:
                  walls = True
              elif board[i + newX][j + newY] == 1:
                  collided = True
              elif j + newY < 0:
                  bottom = True
  if proceed and not walls :
      if bottom:
          placePiece()
      elif not collided:
          updatePiece(newPiece, newX, newY)
      else:
          placePiece()
  elif bottom or collided or walls:
      player.say("not placed")
      return(True)
  return(False)

#Funktionen zum Ändern des Bildschirms der „Konsole“

def updatePiece(newPiece, newX, newY):

  player.say("updatePiece")
  global board
  global piece
  global pieceX
  global pieceY
  global h
  global color
  for i in range(piece.length):
      for j in range(piece.length):
          if piece[i][j] == 1 and pieceY < h - 1:
              #board[i + pieceX][j + pieceY] = 0
              blocks.place(AIR, positions.add(origin, pos(-w/2+pieceX+i, pieceY+j, 10)))
  for i in range(newPiece.length):
      for j in range(newPiece.length):
          if newPiece[i][j] == 1:
              if newY + j < h:
                  blocks.place(color, positions.add(origin, pos(-w/2+newX+i, newY+j, 10)))
  piece = newPiece
  player.say("Updated Piece")
  pieceX = newX
  pieceY = newY

def placePiece():

  player.say("placePiece")
  global board
  global piece
  global pieceX
  global pieceY
  global score
  global isRunning
  
  #Tetromino zur "board" Liste hinzufügen
  for i in range(piece.length):
      for j in range(piece.length):
          if piece[i][j] == 1:
              board[i + pieceX][j + pieceY] = 1
              if pieceY + j < h:
                  blocks.place(placeColor(color), positions.add(origin, pos(-w/2+pieceX+i, pieceY+j, 10)))
              if pieceY + j >= h:
                  isRunning = False
  
  if isRunning:
      #Neues Tetromino generieren
      score = score + 1
      pieceX = Math.round(w/2) - 2
      pieceY = h - 1
      getPiece()
  else:
      player.say("Zu langsam ☹")
      player.say("score: " + str(score))

def removeRow(y):

  player.say("removeRow")
  global board
  global w
  global h
  
  #alles über der Reihe nach unten schieben
  for i in range(y, h):
      board[i] = board[i+1]
      blocks.clone(positions.add(origin, pos(-w/2, i+1, 10)), positions.add(origin, pos(w/2, i+1, 10)), positions.add(origin, pos(-w/2, i, 10)), CloneMask.REPLACE, CloneMode.NORMAL)
  for i in range(w):
      board[h][i]=0
      blocks.fill(AIR, positions.add(origin, pos(-w/2,h, 10)), positions.add(origin, pos(w/2, h, 10)))

def placeColor(color):

  if color == LIGHT_BLUE_WOOL:
      return(LIGHT_BLUE_CONCRETE)
  elif color == YELLOW_WOOL:
      return(YELLOW_CONCRETE)
  elif color == PURPLE_WOOL:
      return(PURPLE_CONCRETE)
  elif color == LIME_WOOL:
      return(LIME_CONCRETE)
  elif color == RED_WOOL:
      return(RED_CONCRETE)
  elif color == ORANGE_WOOL:
      return(ORANGE_CONCRET)
  else:
      return(BLUE_CONCRETE)
  • archiv/ef/ef2020_2022/minecraft/projekt/maximandrin/start/code.txt
  • Zuletzt geändert: 2023/09/14 14:24
  • von andrin