Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pgzrun
- import random
- import math
- WIDTH=1400
- HEIGHT=700
- redactor=False
- mouse_down=False
- cursor=Actor("rock.png")
- mousex=0
- mousey=0
- hero=Actor("hero70")
- hero.x=WIDTH/2
- hero.y=HEIGHT/2
- hero.lifes=5
- hero.immortal_timer=0
- walls=[]
- doors=[]
- enemies=[]
- bullets=[]
- place=[]#карта
- designs=[]#наполнение
- with_enemies=[]
- with_boss=[]
- for i in range(25):
- place.append(False)#заполняем карту пустыми ячейками
- designs.append(1)#типы комнат
- with_enemies.append(False)
- with_boss.append(False)
- place[12]=True#стартовая комната в центре карты существует
- with_enemies[12]=False
- designs[12]=1
- left =( 0, 5,10,15,20)#крайние комнаты, у которых нет соотв. их названию соседей
- right =( 4, 9,14,19,24)
- top =( 0, 1, 2, 3, 4)
- bottom=(20,21,22,23,24)
- room=12
- #
- room1=()
- room2=((35.0,35.0),(35.0,105.0),(35.0,175.0),(35.0,245.0),(35.0,455.0),(35.0,525.0),(35.0,595.0),(35.0,665.0),(105.0,665.0),(175.0,665.0),(245.0,665.0),(315.0,665.0),(385.0,665.0),(455.0,665.0),(525.0,665.0),(805.0,665.0),(875.0,665.0),(945.0,665.0),(1015.0,665.0),(1085.0,665.0),(1155.0,665.0),(1225.0,665.0),(1295.0,665.0),(1365.0,665.0),(1365.0,595.0),(1365.0,525.0),(1365.0,455.0),(1365.0,245.0),(1365.0,175.0),(1365.0,105.0),(1365.0,35.0),(1295.0,35.0),(1225.0,35.0),(1155.0,35.0),(1085.0,35.0),(1015.0,35.0),(945.0,35.0),(875.0,35.0),(805.0,35.0),(455.0,35.0),(385.0,35.0),(315.0,35.0),(245.0,35.0),(175.0,35.0),(105.0,35.0),(595.0,665.0),(595.0,35.0),(525.0,35.0),(105.0,245.0),(105.0,175.0),(105.0,105.0),(175.0,105.0),(245.0,105.0),(105.0,455.0),(105.0,525.0),(105.0,595.0),(175.0,595.0),(245.0,595.0),(1295.0,245.0),(1295.0,175.0),(1295.0,105.0),(1085.0,105.0),(1155.0,105.0),(1225.0,105.0),(1155.0,595.0),(1225.0,595.0),(1295.0,595.0),(1295.0,455.0),(1295.0,525.0))
- room3=((35.0,35.0),(35.0,105.0),(35.0,175.0),(35.0,245.0),(35.0,665.0),(35.0,595.0),(35.0,525.0),(35.0,455.0),(1365.0,245.0),(1365.0,175.0),(1365.0,105.0),(1365.0,35.0),(1365.0,455.0),(1365.0,525.0),(1365.0,595.0),(1365.0,665.0),(105.0,665.0),(175.0,665.0),(245.0,665.0),(315.0,665.0),(385.0,665.0),(455.0,665.0),(525.0,665.0),(595.0,665.0),(805.0,665.0),(875.0,665.0),(945.0,665.0),(1015.0,665.0),(1085.0,665.0),(1155.0,665.0),(1225.0,665.0),(1295.0,665.0),(105.0,35.0),(175.0,35.0),(245.0,35.0),(315.0,35.0),(385.0,35.0),(455.0,35.0),(525.0,35.0),(595.0,35.0),(805.0,35.0),(875.0,35.0),(945.0,35.0),(1015.0,35.0),(1085.0,35.0),(1155.0,35.0),(1225.0,35.0),(1295.0,35.0),(385.0,385.0),(455.0,385.0),(525.0,385.0),(595.0,385.0),(665.0,385.0),(735.0,315.0),(805.0,315.0),(875.0,315.0),(945.0,315.0),(1015.0,315.0),(665.0,315.0),(735.0,385.0),(385.0,455.0),(1015.0,245.0),(315.0,455.0),(315.0,385.0),(1085.0,315.0),(1085.0,245.0))
- rooms=(room1,room2,room3)
- def generate(num):
- sosedstvo=[]
- sosedi=[]
- for i in range(num):
- sosedstvo.clear()
- sosedi.clear()
- for i in range(25):
- sosedstvo.append(False)
- for room in range(25):
- if place[room]:
- if room not in left:
- sosedstvo[room-1]=True
- if room not in right:
- sosedstvo[room+1]=True
- if room not in top:
- sosedstvo[room-5]=True
- if room not in bottom:
- sosedstvo[room+5]=True
- for room in range(25):
- if not place[room] and sosedstvo[room]:
- sosedi.append(room)
- newroom=random.choice(sosedi)
- place[newroom]=True
- designs[newroom]=random.randint(0,len(rooms)-1)
- with_enemies[newroom]=True
- return newroom
- def open_room(where):
- global room
- room=where
- delete_room()
- place_doors(room)
- build_room(room)
- spawn_enemies(room)
- print("Комната ",room)
- if with_enemies[room]:
- print("в комнате есть враги")
- print(len(enemies),"врагов")
- elif with_boss[room]:
- print("в комнате есть босс!")
- else:
- print("в комнате нет врагов")
- def delete_room():
- while len(walls)>0:
- for wall in walls:
- walls.remove(wall)
- del wall
- while len(doors)>0:
- for door in doors:
- doors.remove(door)
- del door
- #TODO other objects
- def build_room(room):
- for i in rooms[designs[room]]:
- wall=Actor("rock.png")
- walls.append(wall)
- wall.x=i[0]
- wall.y=i[1]
- def place_doors(room):
- #top
- if room not in top:
- if place[room-5]:
- make_door(9,0,"top",room-5)
- make_door(10,0,"top",room-5)
- #bottom
- if room not in bottom:
- if place[room+5]:
- make_door(9,9,"bottom",room+5)
- make_door(10,9,"bottom",room+5)
- #left
- if room not in left:
- if place[room-1]:
- make_door(0,4,"left",room-1)
- make_door(0,5,"left",room-1)
- #right
- if room not in right:
- if place[room+1]:
- make_door(19,4,"right",room+1)
- make_door(19,5,"right",room+1)
- def make_door(posx,posy,way,room):
- door=Actor("door.png")
- doors.append(door)
- door.posx=posx
- door.posy=posy
- door.x=posx*70+35
- door.y=posy*70+35
- door.way=way
- door.room=room
- def make_boss_room():
- b_room=generate(1)
- with_enemies[b_room]=False
- with_boss[b_room]=True
- global room
- place_doors(room)
- def spawn_enemies(room):
- if with_enemies[room]:
- for i in range(random.randint(1,4)):
- enemy=Actor("e1.png")
- enemies.append(enemy)
- enemy.x=WIDTH/2
- enemy.y=HEIGHT/2
- enemy.state=1
- enemy.timer=0
- enemy.hp=5
- def on_mouse_move(pos):
- global mousex
- global mousey
- mousex,mousey = (pos)
- mousex=mousex-mousex%70+35
- mousey=mousey-mousey%70+35
- def on_mouse_down(pos):
- global mouse_down
- mouse_down=True
- def on_mouse_up(pos):
- global mouse_down
- mouse_down=False
- def collide_walls(object):
- for wall in walls:
- if object.colliderect(wall):
- return wall
- return False
- def move_hero():
- if keyboard.a:
- hero.x-=10
- wall=collide_walls(hero)
- if wall:
- hero.left=wall.right
- if keyboard.d:
- hero.x+=10
- wall=collide_walls(hero)
- if wall:
- hero.right=wall.left
- if keyboard.s:
- hero.y+=10
- wall=collide_walls(hero)
- if wall:
- hero.bottom=wall.top
- if keyboard.w:
- hero.y-=10
- wall=collide_walls(hero)
- if wall:
- hero.top=wall.bottom
- go_somewhere=False
- for door in doors:
- if hero.colliderect(door) and len(enemies)==0:
- go_somewhere=True
- where=door.room
- how=door.way
- if go_somewhere:
- open_room(where)
- hero.x=WIDTH/2
- hero.y=HEIGHT/2
- if how=="top":
- hero.y=HEIGHT-70-40
- elif how=="bottom":
- hero.y=70+40
- elif how=="left":
- hero.x=WIDTH-70-40
- elif how=="right":
- hero.x=70+40
- def move_enemies():
- for enemy in enemies:
- if enemy.state==1:#настройка первого прыжка
- enemy.timer=100
- enemy.angle=random.randint(0,360)
- enemy.state=4
- elif enemy.state==2:#ожидание до прыжка
- if enemy.timer==0:
- enemy.timer=30
- enemy.state=3
- enemy.angle=enemy.angle_to(hero)+180 + random.randint(-40,40)
- else:
- enemy.timer-=1
- elif enemy.state==3:#прыжок
- if enemy.timer==0:
- enemy.state=2
- enemy.timer=100
- else:
- enemy.timer-=1
- enemy.x-=cos(enemy.angle)*5
- enemy.y+=sin(enemy.angle)*5
- elif enemy.state==4:#ожидание до первого прыжка
- if enemy.timer==0:
- enemy.timer=30
- enemy.state=3
- else:
- enemy.timer-=1
- elif enemy.state==5:
- pass
- elif enemy.state==6:
- pass
- def enemy_collision():
- if hero.immortal_timer>0:
- hero.immortal_timer-=1
- for enemy in enemies:
- if hero.colliderect(enemy) and hero.immortal_timer==0:
- hero.lifes-=1
- hero.immortal_timer=100
- def move_bullets():
- global room
- b_to_remove=[]
- for b in bullets:
- b.x-=cos(b.angle)*b.speed
- b.y+=sin(b.angle)*b.speed
- for enemy in enemies:
- if b.colliderect(enemy):
- if b not in b_to_remove:
- b_to_remove.append(b)
- enemy.hp-=1
- if enemy.hp<=0:
- enemies.remove(enemy)
- del enemy
- check_enemies_left()
- for b in b_to_remove:
- bullets.remove(b)
- del b
- def check_enemies_left():
- global room
- print("осталось",len(enemies),"врагов")
- if len(enemies)==0:
- with_enemies[room]=False
- print("Все противники убиты")
- enemies_left=0
- for i in range(25):
- if with_enemies[i]:
- enemies_left+=1
- if enemies_left==0:
- print("Генерируем босса!")
- make_boss_room()
- else:
- print("Не генерируем босса. Осталось зачистить комнат:",enemies_left)
- def cos(a):
- a=math.radians(a)
- return math.cos(a)
- def sin(a):
- a=math.radians(a)
- return math.sin(a)
- def draw_map():
- global room
- room_number=0
- x=WIDTH-20-50*5
- y=20
- for i in range(5):
- for j in range(5):
- if place[room_number]:
- box=Rect((x+50*j,y+25*i),(50,25))
- if room==room_number:
- color=(254,0,0)
- else:
- color=(0,0,0)
- screen.draw.rect(box,color)
- room_number+=1
- def bullet_creation(angle):
- bullet=Actor("e_bullet")
- bullet.x=hero.x
- bullet.y=hero.y
- bullet.speed=7
- bullets.append(bullet)
- bullet.angle=angle
- def on_key_down(key):
- if key == keys.LEFT:
- bullet_creation(0)
- if key == keys.RIGHT:
- bullet_creation(180)
- if key == keys.UP:
- bullet_creation(-90)
- if key == keys.DOWN:
- bullet_creation(90)
- def draw_hearts():
- l=hero.lifes
- x=30
- y=30
- while l>0:
- if l>1:
- screen.blit("heart.png",(x,y))
- l-=2
- x+=70
- if l==1:
- screen.blit("heart05.png",(x,y))
- l-=1
- def draw():
- screen.fill('#5533cc')
- #cursor.draw()
- for wall in walls:
- wall.draw()
- for door in doors:
- door.draw()
- for bullet in bullets:
- bullet.draw()
- for e in enemies:
- e.draw()
- hero.draw()
- draw_map()
- draw_hearts()
- def update():
- global mousex
- global mousey
- global mouse_down
- global redactor
- cursor.x=mousex
- cursor.y=mousey
- move_hero()
- move_enemies()
- move_bullets()
- enemy_collision()
- if redactor:
- #строительство карты
- if mouse_down==True and redactor:
- can_build=True
- for wall in walls:
- if wall.collidepoint((mousex,mousey)):
- can_build=False
- if can_build:
- wall=Actor("rock.png")
- wall.x=mousex
- wall.y=mousey
- walls.append(wall)
- #print(mouse_down)
- #удаление стен по нажатию p
- if keyboard.p and redactor:
- for wall in walls:
- if wall.collidepoint((mousex,mousey)):
- walls.remove(wall)
- del wall
- #сохранение карты
- if keyboard.o and redactor:
- text="("
- for wall in walls:
- text+="("+str(wall.x)+","+str(wall.y)+"),"
- text+=")"
- redactor=False
- print(text)
- generate(2)
- open_room(room)
- pgzrun.go()
Advertisement
Add Comment
Please, Sign In to add comment