Advertisement
kirjalainenlassi

kultapeli pt2

Oct 5th, 2022
693
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.23 KB | None | 0 0
  1. '''
  2. Lassin hieno ratkaisu tehtävään pt2
  3. '''
  4.  
  5. import os
  6.  
  7.  
  8. MAP1 =  '''######
  9. #..T.#
  10. #P..G#
  11. #..T.#
  12. ######'''
  13.        
  14.  
  15. MAP2 =  '''######
  16. #T...#
  17. #P..G#
  18. #....#
  19. ######'''
  20.  
  21. MAP3 =  '''######
  22. #..#.#
  23. #P.#G#
  24. #..#.#
  25. ######'''
  26.  
  27. MAP4 = '''############
  28. #T.G....T..#
  29. #..##...#G.#
  30. #...G...#..#
  31. #G..##..TG.#
  32. #.T........#
  33. #...P......#
  34. #...#..G...#
  35. #..G#....T.#
  36. #...#.G....#
  37. #......T...#
  38. ############'''
  39.  
  40.  
  41. def safe_gold(map: str):
  42.     '''
  43.    Funktio kertoo montako turvallista saavutettavissa olevaa kultaa
  44.    kartalla on.
  45.    
  46.    :param map: str, kartta
  47.    :return: int, turvallisten kultien määrä
  48.    '''
  49.    
  50.     map_in_rows = map.splitlines()
  51.  
  52.     # pähee upee hakukone
  53.     def xy(coord: tuple, dir = 0):
  54.         '''
  55.        Funktio palauttaa koordinaatteja vastaavan ruudun arvon
  56.        kartasta. Jos funktiolle annetaan suunta (dir), se palauttaa siinä
  57.        suunnassa olevan ruudun arvon.
  58.  
  59.        Suunnat:
  60.        1: ylös
  61.        2: oikealle
  62.        3: alas
  63.        4: vasemmalle
  64.  
  65.        Koordinaattien periaate
  66.  
  67.          0 1 2 3 4 5 (x)
  68.        0 # # # # # #
  69.        1 # T . . . #
  70.        2 # P . . G #
  71.        3 # . . . . #
  72.        4 # # # # # #
  73.        (y)
  74.    
  75.  
  76.        :param x: int, x-koordinaatti
  77.        :param y: int, y-koordinaatti
  78.        :return1: ruudun sisältö
  79.        :return2: ruudun koordinaatit
  80.        '''
  81.  
  82.         x, y = coord
  83.  
  84.         if dir == 0:
  85.             return (map_in_rows[y])[x] , (x, y)
  86.         elif dir == 1:
  87.             return (map_in_rows[y - 1])[x] , (x, y - 1)
  88.         elif dir == 2:
  89.             return (map_in_rows[y])[x + 1] , (x + 1, y)
  90.         elif dir == 3:
  91.             return (map_in_rows[y + 1])[x] , (x, y + 1)
  92.         elif dir == 4:
  93.             return (map_in_rows[y])[x - 1] , (x - 1, y)
  94.  
  95.  
  96.     def in_danger(coord):
  97.         '''
  98.        Funktio kertoo onko pelaaja vaarassa annetussa ruudussa
  99.        '''
  100.  
  101.         danger = False
  102.  
  103.         for i in range(1, 5):
  104.             if xy(coord, i)[0] == "T":
  105.                 danger = True
  106.  
  107.         return danger
  108.  
  109.  
  110.     def is_wall(coord):
  111.         '''
  112.        Funktio kertoo onko annetuissa koordinaateissa seinä
  113.        '''
  114.  
  115.         if xy(coord) == "#":
  116.             return True
  117.         else:
  118.             return False
  119.  
  120.  
  121.     # etsitään lähtöruutu ja tallennetaan se
  122.     start = ()
  123.  
  124.     for i1, row in enumerate(map_in_rows):
  125.         for i2, square in enumerate(row):
  126.             if square == "P":
  127.                 start = (i2, i1)
  128.  
  129.    
  130.     # käydyt ruudut
  131.     visited = set()
  132.  
  133.     # seuraavaksi käytävät ruudut
  134.     # aloitetaan P-kirjaimesta, eli lähdöstä
  135.     visit_next = {start}
  136.  
  137.     # kultien määrä
  138.     golds = 0
  139.  
  140.  
  141.     while visit_next:
  142.  
  143.         # löydetyt ruudut, joihin voi mennä
  144.         discovered = set()
  145.  
  146.         for square in visit_next:
  147.  
  148.             # jos ruudussa on kultaa, päivitetään kultien määrä
  149.             if xy(square)[0] == "G":
  150.                 golds += 1
  151.  
  152.             # jos ruudun vieressä on ansa, ei ruudusta voi liikkua
  153.             if in_danger(square):
  154.                 continue
  155.             elif square in visited:
  156.                 continue
  157.  
  158.             # käydään läpi ruudun viereiset ruudut ja lisätään ne seuraavaksi
  159.             # käytäviin ruutuihin, jos viereisessä ruudussa on seinä, ei sitä
  160.             # lisätä
  161.             for i in range(1, 5):
  162.                 value, coord = xy(square, i)
  163.  
  164.                 if value == "#":
  165.                     continue
  166.  
  167.                 if coord not in visited:
  168.                     discovered.add(coord)
  169.  
  170.         # lisätään juuri käydyt ruudut käytyjen listaan
  171.         visited.update(visit_next)
  172.  
  173.         # päivitetään seuraavaksi käytäväksi juuri löydetyt uudet ruudut
  174.         visit_next = discovered
  175.  
  176.     return golds
  177.  
  178.  
  179.        
  180. def main():
  181.  
  182.     print()
  183.  
  184.     print(os.getcwd())
  185.     # testailua
  186.  
  187.     print("safe golds in 1. map")
  188.     print(safe_gold(MAP1))
  189.  
  190.     print()
  191.  
  192.     print("safe golds in 2. map")
  193.     print(safe_gold(MAP2))
  194.  
  195.     print()
  196.  
  197.     print("safe golds in 3. map")
  198.     print(safe_gold(MAP3))
  199.  
  200.     print()
  201.  
  202.     print("safe golds in 4. map")
  203.     print(safe_gold(MAP4))
  204.  
  205.  
  206. if __name__ == "__main__":
  207.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement