Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.56 KB | None | 0 0
  1. a) (5%)
  2. Du kan representere brettet slik du selv vil, men vi anbefaler at du bruker en liste av lister og bruker f.eks. True, 1 eller '*' for levende celler og False, 0 eller ' ' for døde celler. I såfall vil Steg 1 i illustrasjonen over være lagret slik:
  3. board = [['*', ' ', ' '],
  4. [' ', '*', ' '],
  5. [' ', '*', '*']]
  6. og du kan finne celle (x,y) med board[y][x]. F.eks. vil board[0][0] vil være øverste venstre hjørne og board[2][0] er nederste venstre hjørne. Andre alternativer er f.eks. å bruke en liste av kolonner i stedet for liste av rader, en dict med koordinater som nøkkel, en enkelt liste med radene liggende etter hverandre (slik at (x,y) f.eks. er på indeks y*w+x).
  7. Velg representasjon for brettet, og lag et lite eksempel-brett (f.eks. som board over)
  8. Lag en get og en set funksjon (evt. metode) som henter eller oppdaterer cellen på en gitt x, y koordinat
  9. b) (7%)
  10. Lag en funksjon som tar imot bredde og høyde, og lager et brett og fyller det med tilfeldige data. Du kan bruke random-modulen for tilfeldige data, f.eks. random.choice eller random.randint.
  11. Hvis du har valgt objekt-løsningen vil dette være konstruktøren, __init__(self, w, h); hvis ikke kan du kalle den f.eks. make_board(w, h))
  12. c) (10%)
  13. Lag en funksjon neighbours som finner antall levende naboer for en celle. Den bør ta x, y-koordinatene for cellen som argument (samt evt. brettet), og returnere et heltall. Bruk get-funksjonen du har laget for å sjekke innholdet i en celle. Naboene har disse koordinatene:
  14. (x-1,y-1)
  15. (x,y-1)
  16. (x+1,y-1)
  17. (x-1,y)
  18. (x,y)
  19. (x+1,y)
  20. (x-1,y+1)
  21. (x,y+1)
  22. (x+1,y+1)
  23. Du kan velge å kreve at x,y ikke ligger på kanten av brettet, slik at du vet at cellen har gyldige naboceller i alle retninger. Sjekk i såfall at koordinatene er gyldige med assert eller if/raise. Alternativt kan du gjøre det slik at de ytterste cellene bare har «døde» naboer på utsiden av brettet, f.eks. (hvor cellene med grå bakgrunn er «virtuelle» celler utenfor brettet):
  24.  
  25.  
  26. d) (13%)
  27. Lag en funksjon (eller metode) step() som utfører ett steg av simuleringen. Dvs., for hver celle i den nye tabellen, finn ut hvor mange levende naboer cellen hadde fra før, og sett cellen til 1 eller 0 i tråd med reglene over.
  28. Alle cellene skal endre tilstand samtidig, så vi trenger å bevare det nåværende brettet mens vi beregner hvilke celler som skal overleve/dø/vokse. Det er derfor antakelig lettest å lagre brettet for neste steg i en ny liste.
  29. e) (5%)
  30. Lag en funksjon som printer ut brettet på en passende måte (f.eks. med '*' for levende og ' ' for døde celler). Hvis du har implementert brettet som en klasse, kan du gjøre dette ved å implementere __str__-metoden – den skal i såfall returnere en streng, og ikke print-e noe selv.
  31. Du kan evt. få ting til å se ganske bra ut med Unicode blokk-tegn, '█' ('\u2588'), evt i kombinasjon med box drawing-tegn – på eksamen holder det selvfølgelig med '*'.
  32.  
  33. #### ELEGANT LØSNING m/objekter
  34. ## a)
  35. # Brett-data lagres i en liste:
  36. # [1,0,0,
  37. # 0,1,0,
  38. # 0,1,1]
  39. # Board-klassen har __getitem__ og __setitem__ som gjør at vi kan
  40. # bruke board[x, y] og board[x,y] = value for å jobbe med de enkelte cellene
  41.  
  42.  
  43. class Board:
  44. """A two-dimensional board."""
  45. def __init__(self, width, height, filler = None, initial = None):
  46. assert width > 0 and height > 0, "Width and height must be > 0"
  47. self.width = width
  48. self.height = height
  49. if initial != None:
  50. assert len(initial) == width*height
  51. self.data = initial.copy()
  52. else:
  53. self.data = [filler] * (width*height)
  54.  
  55. def __getitem__(self, pos):
  56. """Get item at position (x,y). E.g. board[x,y]"""
  57. x, y = pos
  58. assert x >= 0 and x < self.width, f"X must be 0 <= {x} < {self.width}"
  59. assert y >= 0 and y < self.width, f"Y must be 0 <= {y} < {self.height}"
  60. return self.data[x + y*self.width]
  61.  
  62. def __setitem__(self, pos, v):
  63. """Set item at position (x,y). E.g. board[x,y] = v"""
  64. x, y = pos
  65. assert x >= 0 and x < self.width, f"X must be 0 <= {x} < {self.width}"
  66. assert y >= 0 and y < self.width, f"Y must be 0 <= {y} < {self.height}"
  67. self.data[x + y*self.width] = v
  68.  
  69. def get(self, x, y, default):
  70. """Return cell at (x,y) or default if (x,y) is outside board"""
  71. if x < 0 or x >= self.width or y < 0 or y >= self.height:
  72. return default
  73. else:
  74. return self.data[x + y*self.width]
  75.  
  76. def copy(self):
  77. return Board(self.width, self.height, initial=self.data)
  78.  
  79. def __str__(self):
  80. rows = []
  81. for y in range(self.height):
  82. row = []
  83. for x in range(self.width):
  84. row.append(str(self[x, y]))
  85. rows.append(', '.join(row))
  86. return '\n'.join(rows)
  87.  
  88.  
  89. class GameOfLife:
  90. def __init__(self, width, height):
  91. self.board = Board(width, height, filler = 0)
  92. for y in range(height):
  93. for x in range(width):
  94. self.board[x,y] = random.randint(0,1)
  95.  
  96. def neighbours(self, x, y):
  97. ns = [(-1,-1), (0,-1), (1,-1), (-1,0), (1,0), (-1,1), (0,1), (1,1)]
  98. living = 0
  99. for dx, dy in ns:
  100. living += self.board.get(x+dx, y+dy, 0) # 0 er default verdi for utenfor brettet
  101. return living
  102. # evt:
  103. #return sum([self.board.get(x+dx,y+dy, 0) for dx, dy in ns])
  104.  
  105. def step(self):
  106. new_board = self.board.copy()
  107. for y in range(self.board.height):
  108. for x in range(self.board.width):
  109. neighs = self.neighbours(x, y)
  110. if self.board[x, y] == 1 and (neighs < 2 or neighs > 3):
  111. new_board[x, y] = 0
  112. elif self.board[x, y] == 0 and neighs == 3:
  113. new_board[x, y] = 1
  114. # uendret i de andre tilfellene
  115. self.board = new_board
  116.  
  117. def __str__(self):
  118. head_foot = '+' + '--' * self.board.width + '+'
  119. rows = [head_foot]
  120. for y in range(self.board.height):
  121. row = ['|']
  122. for x in range(self.board.width):
  123. if self.board[x,y] == 1:
  124. row.append('██')
  125. else:
  126. row.append(' ')
  127. row.append('|')
  128. rows.append(''.join(row))
  129. rows.append(head_foot)
  130. return '\n'.join(rows)
  131.  
  132.  
  133. life = GameOfLife(10, 10)
  134. for i in range(20):
  135. print(life)
  136. life.step()
  137. print(life)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement