Matias_Gray

Isaac

Dec 23rd, 2022
1,166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.49 KB | Software | 0 0
  1. import pgzrun
  2. import random
  3. import math
  4.  
  5. WIDTH=1400
  6. HEIGHT=700
  7.  
  8. redactor=False
  9. mouse_down=False
  10.  
  11. cursor=Actor("rock.png")
  12. mousex=0
  13. mousey=0
  14.  
  15. hero=Actor("hero70")
  16. hero.x=WIDTH/2
  17. hero.y=HEIGHT/2
  18. hero.lifes=5
  19. hero.immortal_timer=0
  20.  
  21. walls=[]
  22. doors=[]
  23. enemies=[]
  24. bullets=[]
  25.  
  26.  
  27. place=[]#карта
  28. designs=[]#наполнение
  29. with_enemies=[]
  30. with_boss=[]
  31. for i in range(25):
  32.     place.append(False)#заполняем карту пустыми ячейками
  33.     designs.append(1)#типы комнат
  34.     with_enemies.append(False)
  35.     with_boss.append(False)
  36. place[12]=True#стартовая комната в центре карты существует
  37. with_enemies[12]=False
  38.  
  39.  
  40. designs[12]=1
  41.  
  42. left  =( 0, 5,10,15,20)#крайние комнаты, у которых нет соотв. их названию соседей
  43. right =( 4, 9,14,19,24)
  44. top   =( 0, 1, 2, 3, 4)
  45. bottom=(20,21,22,23,24)
  46.  
  47. room=12
  48. #
  49. room1=()
  50. 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))
  51. 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))
  52. rooms=(room1,room2,room3)
  53.  
  54. def generate(num):
  55.     sosedstvo=[]
  56.     sosedi=[]
  57.     for i in range(num):
  58.         sosedstvo.clear()
  59.         sosedi.clear()
  60.         for i in range(25):
  61.                 sosedstvo.append(False)
  62.         for room in range(25):
  63.             if place[room]:
  64.                 if room not in left:
  65.                     sosedstvo[room-1]=True
  66.                 if room not in right:
  67.                     sosedstvo[room+1]=True
  68.                 if room not in top:
  69.                     sosedstvo[room-5]=True
  70.                 if room not in bottom:
  71.                     sosedstvo[room+5]=True
  72.         for room in range(25):
  73.             if not place[room] and sosedstvo[room]:
  74.                 sosedi.append(room)
  75.         newroom=random.choice(sosedi)
  76.         place[newroom]=True
  77.         designs[newroom]=random.randint(0,len(rooms)-1)
  78.         with_enemies[newroom]=True
  79.     return newroom
  80.  
  81. def open_room(where):
  82.     global room
  83.     room=where
  84.  
  85.     delete_room()
  86.     place_doors(room)
  87.     build_room(room)
  88.     spawn_enemies(room)
  89.  
  90.     print("Комната ",room)
  91.     if with_enemies[room]:
  92.         print("в комнате есть враги")
  93.         print(len(enemies),"врагов")
  94.     elif with_boss[room]:
  95.         print("в комнате есть босс!")
  96.     else:
  97.         print("в комнате нет врагов")
  98.    
  99.  
  100. def delete_room():
  101.     while len(walls)>0:
  102.         for wall in walls:
  103.             walls.remove(wall)
  104.             del wall
  105.     while len(doors)>0:
  106.         for door in doors:
  107.             doors.remove(door)
  108.             del door
  109.     #TODO other objects
  110.  
  111. def build_room(room):
  112.     for i in rooms[designs[room]]:
  113.         wall=Actor("rock.png")
  114.         walls.append(wall)
  115.         wall.x=i[0]
  116.         wall.y=i[1]
  117.  
  118. def place_doors(room):
  119.     #top
  120.     if room not in top:
  121.         if place[room-5]:
  122.             make_door(9,0,"top",room-5)
  123.             make_door(10,0,"top",room-5)
  124.     #bottom
  125.     if room not in bottom:
  126.         if place[room+5]:
  127.             make_door(9,9,"bottom",room+5)
  128.             make_door(10,9,"bottom",room+5)
  129.     #left
  130.     if room not in left:
  131.         if place[room-1]:
  132.             make_door(0,4,"left",room-1)
  133.             make_door(0,5,"left",room-1)
  134.     #right
  135.     if room not in right:
  136.         if place[room+1]:
  137.             make_door(19,4,"right",room+1)
  138.             make_door(19,5,"right",room+1)
  139.  
  140. def make_door(posx,posy,way,room):
  141.     door=Actor("door.png")
  142.     doors.append(door)
  143.     door.posx=posx
  144.     door.posy=posy
  145.     door.x=posx*70+35
  146.     door.y=posy*70+35
  147.     door.way=way
  148.     door.room=room
  149.  
  150. def make_boss_room():
  151.     b_room=generate(1)
  152.     with_enemies[b_room]=False
  153.     with_boss[b_room]=True
  154.     global room
  155.     place_doors(room)
  156.  
  157. def spawn_enemies(room):
  158.     if with_enemies[room]:
  159.         for i in range(random.randint(1,4)):
  160.             enemy=Actor("e1.png")
  161.             enemies.append(enemy)
  162.             enemy.x=WIDTH/2
  163.             enemy.y=HEIGHT/2
  164.             enemy.state=1
  165.             enemy.timer=0
  166.             enemy.hp=5
  167.  
  168. def on_mouse_move(pos):
  169.     global mousex
  170.     global mousey
  171.     mousex,mousey = (pos)
  172.     mousex=mousex-mousex%70+35
  173.     mousey=mousey-mousey%70+35
  174. def on_mouse_down(pos):
  175.     global mouse_down
  176.     mouse_down=True
  177. def on_mouse_up(pos):
  178.     global mouse_down
  179.     mouse_down=False
  180.  
  181. def collide_walls(object):
  182.     for wall in walls:
  183.         if object.colliderect(wall):
  184.             return wall
  185.     return False
  186.  
  187. def move_hero():
  188.     if keyboard.a:
  189.         hero.x-=10
  190.         wall=collide_walls(hero)
  191.         if wall:
  192.             hero.left=wall.right
  193.     if keyboard.d:
  194.         hero.x+=10
  195.         wall=collide_walls(hero)
  196.         if wall:
  197.             hero.right=wall.left
  198.     if keyboard.s:
  199.         hero.y+=10
  200.         wall=collide_walls(hero)
  201.         if wall:
  202.             hero.bottom=wall.top
  203.     if keyboard.w:
  204.         hero.y-=10
  205.         wall=collide_walls(hero)
  206.         if wall:
  207.             hero.top=wall.bottom
  208.    
  209.     go_somewhere=False
  210.     for door in doors:
  211.         if hero.colliderect(door) and len(enemies)==0:
  212.             go_somewhere=True
  213.             where=door.room
  214.             how=door.way
  215.     if go_somewhere:
  216.         open_room(where)
  217.         hero.x=WIDTH/2
  218.         hero.y=HEIGHT/2
  219.         if how=="top":
  220.             hero.y=HEIGHT-70-40
  221.         elif how=="bottom":
  222.             hero.y=70+40
  223.         elif how=="left":
  224.             hero.x=WIDTH-70-40
  225.         elif how=="right":
  226.             hero.x=70+40
  227.  
  228. def move_enemies():
  229.     for enemy in enemies:
  230.         if enemy.state==1:#настройка первого прыжка
  231.             enemy.timer=100
  232.             enemy.angle=random.randint(0,360)
  233.             enemy.state=4
  234.  
  235.         elif enemy.state==2:#ожидание до прыжка
  236.             if enemy.timer==0:
  237.                 enemy.timer=30
  238.                 enemy.state=3
  239.                 enemy.angle=enemy.angle_to(hero)+180 + random.randint(-40,40)
  240.             else:
  241.                 enemy.timer-=1
  242.  
  243.         elif enemy.state==3:#прыжок
  244.             if enemy.timer==0:
  245.                 enemy.state=2
  246.                 enemy.timer=100
  247.             else:
  248.                 enemy.timer-=1
  249.                 enemy.x-=cos(enemy.angle)*5
  250.                 enemy.y+=sin(enemy.angle)*5
  251.  
  252.         elif enemy.state==4:#ожидание до первого прыжка
  253.             if enemy.timer==0:
  254.                 enemy.timer=30
  255.                 enemy.state=3
  256.             else:
  257.                 enemy.timer-=1
  258.            
  259.         elif enemy.state==5:
  260.             pass
  261.         elif enemy.state==6:
  262.             pass
  263.  
  264. def enemy_collision():
  265.     if hero.immortal_timer>0:
  266.         hero.immortal_timer-=1
  267.     for enemy in enemies:
  268.         if hero.colliderect(enemy) and hero.immortal_timer==0:
  269.             hero.lifes-=1
  270.             hero.immortal_timer=100
  271.  
  272. def move_bullets():
  273.     global room
  274.     b_to_remove=[]
  275.     for b in bullets:
  276.         b.x-=cos(b.angle)*b.speed
  277.         b.y+=sin(b.angle)*b.speed
  278.         for enemy in enemies:
  279.             if b.colliderect(enemy):
  280.                 if b not in b_to_remove:
  281.                     b_to_remove.append(b)
  282.                 enemy.hp-=1
  283.                 if enemy.hp<=0:
  284.                     enemies.remove(enemy)
  285.                     del enemy
  286.                     check_enemies_left()
  287.     for b in b_to_remove:
  288.         bullets.remove(b)
  289.         del b
  290.  
  291. def check_enemies_left():
  292.     global room
  293.     print("осталось",len(enemies),"врагов")
  294.     if len(enemies)==0:
  295.         with_enemies[room]=False
  296.         print("Все противники убиты")
  297.         enemies_left=0
  298.         for i in range(25):
  299.             if with_enemies[i]:
  300.                 enemies_left+=1
  301.         if enemies_left==0:
  302.             print("Генерируем босса!")
  303.             make_boss_room()
  304.         else:
  305.             print("Не генерируем босса. Осталось зачистить комнат:",enemies_left)
  306.  
  307.  
  308. def cos(a):
  309.     a=math.radians(a)
  310.     return math.cos(a)
  311. def sin(a):
  312.     a=math.radians(a)
  313.     return math.sin(a)
  314.  
  315. def draw_map():
  316.     global room
  317.     room_number=0
  318.     x=WIDTH-20-50*5
  319.     y=20
  320.     for i in range(5):
  321.         for j in range(5):
  322.             if place[room_number]:
  323.                 box=Rect((x+50*j,y+25*i),(50,25))
  324.                 if room==room_number:
  325.                     color=(254,0,0)
  326.                 else:
  327.                     color=(0,0,0)
  328.                 screen.draw.rect(box,color)
  329.             room_number+=1
  330.  
  331. def bullet_creation(angle):
  332.     bullet=Actor("e_bullet")
  333.     bullet.x=hero.x
  334.     bullet.y=hero.y
  335.     bullet.speed=7
  336.     bullets.append(bullet)
  337.     bullet.angle=angle
  338.  
  339. def on_key_down(key):
  340.     if key == keys.LEFT:
  341.         bullet_creation(0)
  342.     if key == keys.RIGHT:
  343.         bullet_creation(180)
  344.     if key == keys.UP:
  345.         bullet_creation(-90)
  346.     if key == keys.DOWN:
  347.         bullet_creation(90)
  348.  
  349. def draw_hearts():
  350.     l=hero.lifes
  351.     x=30
  352.     y=30
  353.     while l>0:
  354.         if l>1:
  355.             screen.blit("heart.png",(x,y))
  356.             l-=2
  357.             x+=70
  358.         if l==1:
  359.             screen.blit("heart05.png",(x,y))
  360.             l-=1
  361.  
  362.  
  363.  
  364. def draw():
  365.     screen.fill('#5533cc')
  366.     #cursor.draw()
  367.  
  368.     for wall in walls:
  369.         wall.draw()
  370.     for door in doors:
  371.         door.draw()
  372.     for bullet in bullets:
  373.         bullet.draw()
  374.     for e in enemies:
  375.         e.draw()
  376.  
  377.     hero.draw()
  378.     draw_map()
  379.     draw_hearts()
  380.  
  381. def update():
  382.     global mousex
  383.     global mousey
  384.     global mouse_down
  385.     global redactor
  386.     cursor.x=mousex
  387.     cursor.y=mousey
  388.     move_hero()
  389.     move_enemies()
  390.     move_bullets()
  391.     enemy_collision()
  392.  
  393.  
  394.     if redactor:
  395.         #строительство карты
  396.         if mouse_down==True and redactor:
  397.             can_build=True
  398.             for wall in walls:
  399.                 if wall.collidepoint((mousex,mousey)):
  400.                     can_build=False
  401.             if can_build:
  402.                 wall=Actor("rock.png")
  403.                 wall.x=mousex
  404.                 wall.y=mousey
  405.                 walls.append(wall)
  406.         #print(mouse_down)
  407.        
  408.         #удаление стен по нажатию p
  409.         if keyboard.p and redactor:
  410.             for wall in walls:
  411.                 if wall.collidepoint((mousex,mousey)):
  412.                     walls.remove(wall)
  413.                     del wall
  414.  
  415.         #сохранение карты
  416.         if keyboard.o and redactor:
  417.             text="("
  418.             for wall in walls:
  419.                 text+="("+str(wall.x)+","+str(wall.y)+"),"
  420.             text+=")"
  421.             redactor=False
  422.             print(text)
  423.  
  424.  
  425. generate(2)
  426. open_room(room)
  427. pgzrun.go()
Advertisement
Add Comment
Please, Sign In to add comment