Skip to content

Instantly share code, notes, and snippets.

@horstjens
Last active May 13, 2024 15:45
Show Gist options
  • Save horstjens/ded3720363b58c5c4e3ef406e372ebb3 to your computer and use it in GitHub Desktop.
Save horstjens/ded3720363b58c5c4e3ef406e372ebb3 to your computer and use it in GitHub Desktop.
linus
import vpython as vp
# z ziel
# $ stacheln für schalter 4
# 4 schalter für stacheln $
# % stacheln für schalter 5
# 5 schalter für stacheln %
# & stacheln für schalter 6
# 6 schalter für stachelen &
# / versenkbare Türe für Schalter 7
# 7 schalter für Türe /
# ö Kugel
# . Boden
# # Wand
# 1 spieler 1, blau, kann kugeln schieben, kann kugeln blocken, kann nicht durch stacheln gehen
# 2 spieler 2, rot, kann nicht kugeln schieben, kann kugeln blocken, kann durch stacheln gehen
level1= r"""
#################################
#.1.2.#...ö......#.....öö.......#
#.###.#...ö......#.....öö...#ööö#
#.....#ööö###%%%%#.....öö...#...#
#$$$$$#.&&#5#....#.....öö...#...#
#.....#...#.#....#.....öö..6#...#
#&&.&&#&&.#.####.#öö#########&&&##############
#.....ö...#....../..........&...ö..........zz#
#4....ö...#7...../..........&...ö..........zz#
##############################################
"""
level2 = """
"""
class Game:
fps=30
dt=1/fps
kugeln = []
zacken = {}
zacken6 = []
zacken7 = []
scene = vp.canvas(width=1400,
height=750,
background=vp.color.white)
spielfeld = [list(line) for line in level1.splitlines() if len(line.strip()) > 0]
zacken4_up = True
def zacken_runter():
for z in Game.zacken.values():
z.target.y = -1.5
z.dy = -1
Game.zacken4_up = False
Game.zlabel.text=f"zacken sind unten {Game.zacken4_up}"
def zacken_rauf():
for z in Game.zacken.values():
z.target.y = -0.5
z.dy = 1
Game.zacken4_up = True
Game.zlabel.text=f"zacken sind oben {Game.zacken4_up}"
# zacken ins spielfeld schreiben
for (x,z), cone in Game.zacken.items():
Game.spielfeld[z][x] = "$"
def move_player(player, dx=0, dz=0):
target1 = Game.spielfeld[int(player.pos.z)+dz][int(player.pos.x)+dx]
target2 = Game.spielfeld[int(player.pos.z)+dz*2][int(player.pos.x)+dx*2]
if (not player.can_push_kugel) and (target1 == "ö"):
return
if (player.can_pass_spike == False) and (target1 in "$%&/"):
# spikes are up?
print(target1, Game.zacken4_up)
if (target1 == "$") and (Game.zacken4_up == True):
return
if target1 not in "#12":
#if Game.spielfeld[int(player.pos.z)][int(player.pos.x)+dx] != "#":
#moving = True
# kugel schieben ?
#if Game.spielfeld[int(player.pos.z)][int(player.pos.x)+1] == "ö":
if target1 == "ö":
# kugel blockt ?
#if Game.spielfeld[int(player.pos.z)][int(player.pos.x)+2] == "#":
if target2 in "#12ö":
return
moving = False
#else:
for k in Game.kugeln:
if k.pos.x == player.pos.x + dx:
if k.pos.z == player.pos.z + dz:
if player.can_push_kugel:
# kugel verschieben
k.pos.x += dx
k.pos.z += dz
Game.spielfeld[int(player.pos.z)+dz][int(player.pos.x)+dx] = "."
Game.spielfeld[int(player.pos.z)+dz*2][int(player.pos.x)+dx*2] = "ö"
break
# player verschieben
player.target = player.pos + vp.vector(dx,0,dz)
player.delta = vp.vector(dx,0,dz)
player.ready = False
Game.spielfeld[int(player.pos.z)][int(player.pos.x)] = "."
Game.spielfeld[int(player.pos.z)+dz][int(player.pos.x)+dx] = "1" if player == player1 else "2"
player1=vp.cylinder(pos=vp.vector(1,-0.5,1,),
axis=vp.vector(0,1,0,),
radius=0.4,
color=vp.color.blue)
player1.speed = 1.12
player1.target = None
player1.ready=True
player1.can_push_kugel = True
player1.can_pass_spike = False
player1.can_block_kugel = True
player2=vp.cylinder(pos=vp.vector(2,-0.5,2,),
axis=vp.vector(0,1,0,),
radius=0.4,
color=vp.color.red)
player2.speed = 1.12
player2.target = None
player2.ready=True
player2.can_push_kugel = False
player2.can_pass_spike = True
player2.can_block_kugel = True
#print(Game.spielfeld)
for z, line in enumerate(Game.spielfeld):
for x, char in enumerate(line):
if char == "#":
vp.box(pos=vp.vector(x,0,z),
size=vp.vector(0.9,0.9,0.9),
color=vp.vector(0.69,0.7,0.52),
)
elif char == "4":
vp.box(pos=vp.vector(x,-0.5,z),
size=vp.vector(0.9,0.1,0.9),
color=vp.color.yellow)
else: # char == ".":
vp.box(pos=vp.vector(x,-0.5,z),
size=vp.vector(0.9,0.1,0.9),
color=vp.color.white)
if char == "1":
player1.pos = vp.vector(x, -0.5, z)
if char == "2":
player2.pos = vp.vector(x, -0.5, z)
if char == "$":
Game.zacken[(x,z)] = vp.cone(
pos=vp.vector(x,-0.5,z),
axis=vp.vector(0,1,0),
radius=0.5,
color=vp.color.yellow)
if char == "ö":
Game.kugeln.append(
vp.sphere(pos=vp.vector(x, 0, z),
radius = 0.5,
color=vp.color.blue)
)
#vp.scene.camera.pos = vp.vector(len(Game.spielfeld[0])//2,
# 5,
# len(Game.spielfeld)//2+1)
#vp.scene.camera.axis = vp.vector(0,-1,0)
# zacken
for z in Game.zacken.values():
z.dy = 0
z.target = vp.vector(z.pos.x, z.pos.y, z.pos.z)
Game.zlabel = vp.label(pixel_pos = True, pos=vp.vector(20,10,0),
text="zacken sind ....", align="left")
while True:
vp.rate(30)
#vp.scene.bind("keydown",key_pressed)
pressed = vp.keysdown()
if "v" in pressed:
zacken_runter()
if "c" in pressed:
zacken_rauf()
#print(pressed)
if player1.ready:
if "d" in pressed:
move_player(player1, 1, 0)
if "a" in pressed:
move_player(player1, -1,0)
if "w" in pressed:
move_player(player1, 0, -1)
if "s" in pressed:
move_player(player1, 0,1)
if player2.ready:
if "right" in pressed:
move_player(player2, 1,0)
if "left" in pressed:
move_player(player2, -1, 0)
if "up" in pressed:
move_player(player2, 0, -1)
if "down" in pressed:
move_player(player2, 0, 1)
for z in Game.zacken.values():
if z.dy != 0:
z.pos.y += z.dy * Game.dt * player.speed
if vp.mag(z.target - z.pos) < 0.1:
z.pos = vp.vector(z.target.x, z.target.y, z.target.z)
z.dy = 0
char1, char2 = None, None
if player1.ready:
char1 = Game.spielfeld[int(player1.pos.z)][int(player1.pos.x)]
if player2.ready:
char2 = Game.spielfeld[int(player2.pos.z)][int(player2.pos.x)]
#print(char1, char2, player1.pos, player2.pos)
#if (char1 == "4") or (char2 == "4"):
# zacken_runter()
#else:
# zacken_rauf()
for player in (player1, player2):
if not player.ready:
player.pos += vp.norm(player.delta) * Game.dt * player.speed
if vp.mag(player.target - player.pos) < 0.1:
player.pos = vp.vector(player.target.x,
player.target.y,
player.target.z)
player.ready = True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment