Last active
April 30, 2024 15:21
-
-
Save horstjens/ded3720363b58c5c4e3ef406e372ebb3 to your computer and use it in GitHub Desktop.
linus
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 = """ | |
################################# | |
#1..ö..........#................# | |
#...ö....#######................# | |
#.$$............................# | |
#...............................# | |
#..............######...........# | |
#..............#................# | |
#..............#................# | |
#..............................2# | |
################################# | |
""" | |
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] | |
def zacken_runter(): | |
for z in Game.zacken: | |
z.target.y = -1.5 | |
z.dy = -1 | |
def zacken_rauf(): | |
for z in Game.zacken: | |
z.target.y = -0.5 | |
z.dy = 1 | |
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 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: | |
# 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 | |
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 | |
#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.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.append( | |
vp.cone(pos=vp.vector(x,-0.5,z), | |
axis=vp.vector(0,1,0), | |
radius=0.5, | |
color=vp.color.red) | |
) | |
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: | |
z.dy = 0 | |
z.target = vp.vector(z.pos.x, z.pos.y, z.pos.z) | |
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: | |
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 | |
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