Advertisement
Valkyrie1114

Untitled

Dec 19th, 2020
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.25 KB | None | 0 0
  1. # simulates interactions of wild life
  2. import math
  3. import random
  4. import pygame, sys
  5. import random
  6. import pdb
  7. import time
  8. from pygame.locals import *
  9. import os
  10.  
  11.  
  12. WINDOW_WIDTH = 1000
  13. WINDOW_HEIGHT = 600
  14.  
  15. pygame.init() # setsup pygame
  16. screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) # setsup screen size
  17. clock = pygame.time.Clock() # tells program how fast to update
  18. timmer = 1 # how long program has gone on for
  19.  
  20. # colours
  21. grey = (60, 60, 60)
  22. dark_grey = (20, 20, 20)
  23. dark_blue = (0, 0, 160)
  24. black = (0, 0, 0)
  25.  
  26. preyPopulation = 0
  27. predatorPopulation = 0
  28.  
  29.  
  30.  
  31. # classes-------------------------------------------------------------------
  32. class Animal(pygame.sprite.Sprite): # main class
  33. def __init__(self, image, x, y):
  34. super().__init__()
  35. self.image = image
  36. self.rect = self.image.get_rect(center=(x, y))
  37. self.energy = 10
  38. self.dist = 1000
  39.  
  40. def move(self, mx, my): # moves the sprite
  41. self.rect.x += mx
  42. self.rect.y += my
  43.  
  44. def is_collided_with(self, sprite): # is the eat function
  45. return self.rect.colliderect(sprite.rect)
  46.  
  47. def checkEnergy(self): # checks the energy of an animal
  48. EnergyVal = self.energy
  49. return EnergyVal
  50.  
  51.  
  52.  
  53. class Predator(Animal): # class for predators
  54. def __init__(self, image, x, y):
  55. super().__init__(image, x, y)
  56. self.energy = 12
  57. self.starvetimmer = 0
  58. self.dist = 1000
  59.  
  60. def reproduce(self):#reproduction function
  61. global predatorPopulation
  62. if self.energy >= 15:
  63. print("wolf reproducing...")
  64. predator = Predator(self.image, self.rect.x, self.rect.y)
  65. all_sprites.add(predator)
  66. Wolf_group.add(predator)
  67. self.energy -= 6#decreases sprites energy
  68.  
  69.  
  70. def Pack(self, predatorSpriteGroup):
  71. minDist = 200 # sets detect distance
  72. closestpredator = None
  73. hunted = False
  74. for predator in predatorSpriteGroup:
  75. tempdist = math.sqrt((self.rect.x - predator.rect.x) ** 2 + (self.rect.y - predator.rect.y) ** 2)
  76. if tempdist < self.dist and tempdist < minDist:
  77. minDist = tempdist
  78. closestpredator = predator
  79. hunted = True
  80.  
  81. if closestpredator:
  82. xvariation = random.randint(-5, 5) * 10 # makes it so they arent always on the same position as
  83. yvariation = random.randint(-5, 5) * 10
  84. return closestpredator.rect.x + xvariation, closestpredator.rect.y + yvariation
  85.  
  86. def findClosestPrey(self, preySpriteGroup):
  87. minDist = self.dist # I'm guessing you are setting 1000 to be the max distance it will detect the prey?
  88. closestPrey = None
  89. for prey in preySpriteGroup:
  90. tempdist = math.sqrt((self.rect.x - prey.rect.x) ** 2 + (self.rect.y - prey.rect.y) ** 2)
  91. if tempdist < self.dist and tempdist < minDist:
  92. minDist = tempdist
  93. closestPrey = prey
  94.  
  95. if closestPrey:
  96. return closestPrey.rect.x, closestPrey.rect.y
  97.  
  98. def update(self):
  99. # something that should be done/checked in each game loop
  100. if self.energy <= 0:
  101. print("Wolf starved to death")
  102. self.kill()
  103. else:
  104. if self.starvetimmer == 160:
  105. self.energy -= 1
  106. self.starvetimmer = 0
  107. else:
  108. self.starvetimmer += 1
  109.  
  110. if self.energy < 10:
  111. if Rabbit_group:
  112. preyX, preyY = self.findClosestPrey(Rabbit_group)
  113. movementx, movementy = Track(self.rect.x, preyX, self.rect.y, preyY) # how the predators move
  114. self.move(movementx+0.2, movementy+0.2)
  115. else:
  116. self.Pack(Wolf_group)
  117.  
  118. Leaving = leavingWindow(self.rect.x, self.rect.y) # keeps sprites in window
  119. if Leaving == True:
  120. movementx, movementy = Boundry(self.rect.x, self.rect.y)
  121. self.rect.x = movementx
  122. self.rect.y = movementy
  123.  
  124.  
  125. rabbit_collision = pygame.sprite.spritecollide(self, Rabbit_group, True)
  126. if rabbit_collision:
  127. self.dist = 1000
  128. print("Ate rabbit")
  129. self.energy += 4 # increases the rabbits energy
  130.  
  131. self.reproduce() #always call reproduce regardless because the function already checks energy requirements
  132.  
  133.  
  134.  
  135. class Prey(Animal):
  136. def __init__(self, image, x, y):
  137. super().__init__(image, x, y)
  138. self.energy = 7
  139. self.starvetimmer = 0
  140. self.dist = 1000
  141.  
  142. def reproduce(self):
  143. global preyPopulation
  144. if self.energy >= 10 and preyPopulation < 20: #if enough energy and fewer than 20 total rabbits, reproduce
  145. print("Rabbit reproducing...")
  146. prey = Prey(self.image, self.rect.x - 50, self.rect.y + 50) # elf.x, self.rect.y)
  147. all_sprites.add(prey)
  148. Rabbit_group.add(prey)
  149. self.energy -= 7
  150. preyPopulation += 1
  151.  
  152. def findClosestPredator(self, predatorSpriteGroup):
  153. minDist = 100 # sets detect distance
  154. closestpredator = None
  155. hunted = False
  156. for predator in predatorSpriteGroup:
  157. tempdist = math.sqrt((self.rect.x - predator.rect.x) ** 2 + (self.rect.y - predator.rect.y) ** 2)
  158. if tempdist < self.dist and tempdist < minDist:
  159. minDist = tempdist
  160. closestpredator = predator
  161. hunted = True
  162.  
  163. if closestpredator:
  164. return closestpredator.rect.x, closestpredator.rect.y, hunted
  165. else:
  166. return 0, 0, hunted
  167.  
  168. def findClosestfood(self, foodSpriteGroup):
  169.  
  170. minDist = self.dist # sets detect distance
  171. closestfood = None
  172. for food in foodSpriteGroup:
  173. tempdist = math.sqrt((self.rect.x - food.rect.x) ** 2 + (self.rect.y - food.rect.y) ** 2)
  174. if tempdist < self.dist and tempdist < minDist:
  175. minDist = tempdist
  176. closestfood = food
  177.  
  178. if closestfood:
  179. return closestfood.rect.x, closestfood.rect.y
  180.  
  181. def update(self):
  182. # something that should be done/checked in each game loop
  183. if self.energy <= 0:
  184. print("Predator starved to death...")
  185. self.kill()
  186. else:
  187. if self.starvetimmer == 100:
  188. self.energy -= 1
  189. self.starvetimmer = 0
  190. else:
  191. self.starvetimmer += 1
  192.  
  193. Leaving = leavingWindow(self.rect.x, self.rect.y) # keeps sprites in window
  194. if Leaving == True:
  195. movementx, movementy = Boundry(self.rect.x, self.rect.y)
  196. self.rect.x = movementx
  197. self.rect.y = movementy
  198.  
  199. wolfX, wolfY, hunted = self.findClosestPredator(Wolf_group)
  200. if hunted == True and self.energy >= 2:
  201. print("Running...")
  202. movementx, movementy = Runaway(self.rect.x, wolfX, self.rect.y, wolfY) # how the prey move
  203. self.move(movementx, movementy)
  204. else:
  205. if self.energy < 10:
  206. if carrot_group:
  207. foodX, foodY = self.findClosestfood(carrot_group)
  208. movementx, movementy = Track(self.rect.x, foodX, self.rect.y, foodY) # how the predators move
  209. self.move(movementx, movementy)
  210.  
  211. carrot_collision = pygame.sprite.spritecollide(self, carrot_group, True)
  212. if carrot_collision:
  213. self.dist = 1000
  214. print("Ate carrot")
  215. self.energy += 6 # increases the rabbits energy
  216.  
  217. self.reproduce() #always call reproduce because the function already specifies energy requirements
  218.  
  219.  
  220.  
  221. class Carrot(pygame.sprite.Sprite): # food for prey class
  222. def __init__(self, image, x, y):
  223. super().__init__()
  224. self.image = image
  225. self.rect = self.image.get_rect(center=(x, y))
  226. self.amount=0
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235. # Functions--------------------------------------------------------------
  236. def Track(AgressorX, DefenderX, AgressorY, DefenderY): # finds comapres X and Y, tells sprite how to move
  237. if AgressorX > DefenderX:
  238. XMovement = -1
  239. elif AgressorX < DefenderX:
  240. XMovement = 1
  241. else:
  242. XMovement = 0
  243.  
  244. if AgressorY > DefenderY:
  245. YMovement = -1
  246. elif AgressorY < DefenderY:
  247. YMovement = 1
  248. else:
  249. YMovement = 0
  250. return XMovement, YMovement
  251.  
  252.  
  253. def Runaway(AgressorX, DefenderX, AgressorY, DefenderY):
  254. if AgressorX > DefenderX:
  255. XMovement = 1
  256. elif AgressorX < DefenderX:
  257. XMovement = -1
  258. else:
  259. XMovement = 1
  260.  
  261. if AgressorY > DefenderY:
  262. YMovement = 1
  263. elif AgressorY < DefenderY:
  264. YMovement = -1
  265. else:
  266. YMovement = -1
  267. return XMovement, YMovement
  268.  
  269.  
  270. def leavingWindow(Xpos, Ypos): # boundry, keeps sprites in the window
  271. if Xpos <= 50:
  272. return True
  273. elif Xpos >= WINDOW_WIDTH-50:
  274. return True
  275. if Ypos <= 50:
  276. return True
  277. elif Ypos >= WINDOW_HEIGHT-50:
  278. return True
  279.  
  280.  
  281. def Boundry(Xpos, Ypos):
  282. Xmovement = min(max(0, Xpos), WINDOW_WIDTH)
  283. ymovement = min(max(0, Ypos), WINDOW_HEIGHT)
  284.  
  285. return Xmovement, ymovement
  286.  
  287.  
  288. def button(screen, msg, x, y, width, height, inactiveColour, activecolour, action=None): # setup buttons
  289. mouse = pygame.mouse.get_pos() # gets mouses position
  290. click = pygame.mouse.get_pressed() # sees if the mouse is clicked
  291.  
  292. pygame.draw.rect(screen, activecolour, (x, y, width, height))
  293. txt = pygame.font.SysFont("comicsansms", 12)
  294. TextSurf, TextRect = text_objects(msg, txt)
  295. TextRect.center = (x + width // 2, y + height // 2)
  296. screen.blit(TextSurf, TextRect)
  297.  
  298. global running
  299.  
  300. if x + width > mouse[0] > x and y + height > mouse[1] > y:
  301.  
  302. if click[0] == 1 and action != None:
  303. if action == "play":
  304. main_game()
  305. elif action == "quit":
  306. pygame.quit
  307. quit()
  308. elif action == "pause":
  309. paused()
  310. elif action == "unpause":
  311. return True
  312. elif action == "return":
  313. main_menu()
  314. running=False
  315.  
  316. else:
  317. pygame.draw.rect(screen, inactiveColour, (x, y, width, height))
  318. txt = pygame.font.SysFont("comicsansms", 12)
  319. TextSurf, TextRect = text_objects(msg, txt)
  320. TextRect.center = (x + width // 2, y + height // 2)
  321. screen.blit(TextSurf, TextRect)
  322.  
  323. def Repopulate():
  324. if len(Rabbit_group)==0:
  325. for i in range(2):
  326. randomx = random.randrange(50, WINDOW_WIDTH-50)
  327. randomy = random.randrange(50, WINDOW_HEIGHT-50)
  328.  
  329. prey = Prey(prey_image, randomx , randomy)
  330. all_sprites.add(prey)
  331. Rabbit_group.add(prey)
  332.  
  333. if len(Wolf_group)==0:
  334. randomx = random.randrange(50, WINDOW_WIDTH-50)
  335. randomy = random.randrange(50, WINDOW_HEIGHT-50)
  336.  
  337. predator = Predator(predator_image, randomx, randomy)
  338. all_sprites.add(predator)
  339. Wolf_group.add(predator)
  340.  
  341.  
  342. #Test---------------------------------------------------------------------------------------------------------------
  343.  
  344. def text_objects(text, font): # sets up the text
  345. textSurface = font.render(text, True, black)
  346. return textSurface, textSurface.get_rect()
  347.  
  348. #pause---------------------------------------------------------------------------------------------------------------
  349. def paused():
  350. largeText = pygame.font.SysFont("comicsansms", 115)
  351. TextSurf, TextRect = text_objects("Paused", largeText)
  352. TextRect.center = ((1000 / 2), (200))
  353. screen.blit(TextSurf, TextRect)
  354. pause = True
  355. while pause:
  356. pygame.event.pump()
  357.  
  358. for event in pygame.event.get():
  359. key = pygame.key.get_pressed()
  360. if event.type == pygame.QUIT:
  361. pause = False
  362.  
  363. if key[pygame.K_ESCAPE]:
  364. pause = False
  365.  
  366. if button(screen, "Continue", 350, 350, 100, 50, (25, 210, 25), (0, 255, 0), "unpause"):
  367. return
  368. button(screen, "Leave", 550, 350, 100, 50, (205, 25, 35), (255, 0, 0), "return")
  369.  
  370. pygame.display.flip()
  371.  
  372. pygame.quit()
  373.  
  374. # classes and sprites--------------------------------------------------------
  375.  
  376.  
  377. # setup sprite groups
  378.  
  379.  
  380. prey_image = pygame.image.load('Prey.png')
  381. predator_image=pygame.image.load('Icon.png')
  382. carrot_image=pygame.image.load("carrot.png")
  383.  
  384. all_sprites = pygame.sprite.Group()
  385.  
  386. carrot_group = pygame.sprite.Group()
  387.  
  388. Wolf_group = pygame.sprite.Group()
  389.  
  390. Rabbit_group = pygame.sprite.Group()
  391.  
  392. # sets up multiple rabbits and carrots at start
  393. for i in range(2):
  394. prey = Prey(prey_image, 100 * (i+1), 100)
  395. all_sprites.add(prey)
  396. Rabbit_group.add(prey)
  397.  
  398.  
  399. predator = Predator(predator_image, 600, 500)
  400. all_sprites.add(predator)
  401. Wolf_group.add(predator)
  402.  
  403.  
  404.  
  405. for i in range(0, 10): # makes random carrots
  406. randomx = random.randrange(50, WINDOW_WIDTH-50)
  407. randomy = random.randrange(50, WINDOW_HEIGHT-50)
  408.  
  409. carrot = Carrot(carrot_image, randomx, randomy)
  410. carrot.amount+=1
  411. all_sprites.add(carrot)
  412. carrot_group.add(carrot)
  413.  
  414.  
  415. # start of program
  416. def main_game():
  417. timmer = 1
  418. carrotGrowth=0
  419.  
  420. running = True
  421. while running:
  422.  
  423. for event in pygame.event.get():
  424. if event.type == pygame.QUIT:
  425. running = False
  426. # buttons
  427.  
  428. if carrotGrowth == 400:
  429. for i in range(0, 10): # makes random carrots
  430. randomx = random.randrange(50, WINDOW_WIDTH - 50)
  431. randomy = random.randrange(50, WINDOW_HEIGHT - 50)
  432.  
  433. carrot = Carrot(carrot_image, randomx, randomy)
  434. all_sprites.add(carrot)
  435. carrot_group.add(carrot)
  436. carrotGrowth = 0
  437. else:
  438. carrotGrowth += 1
  439.  
  440. Repopulate()
  441.  
  442. all_sprites.update()
  443.  
  444. screen.fill((0, 128, 0)) # background
  445. all_sprites.draw(screen) # makes the sprites
  446. button(screen, "pause", 0, 0, 100, 50, grey, dark_grey, "pause")
  447. pygame.display.flip() # updates screen
  448.  
  449.  
  450. timmer += 1
  451. clock.tick(60)
  452.  
  453. pygame.quit()
  454. exit()
  455.  
  456.  
  457. # main menu setup-----------------------------------------------------
  458.  
  459.  
  460. def main_menu():
  461. intro = True
  462.  
  463. while intro:
  464. for event in pygame.event.get():
  465.  
  466. if event.type == pygame.QUIT:
  467. pygame.quit()
  468. quit()
  469.  
  470. screen.fill(dark_blue)
  471. largeText = pygame.font.SysFont("comicsansms", 100)
  472. TextSurf, TextRect = text_objects("Wildlife simulator", largeText)
  473. TextRect.center = ((1000 / 2), (200))
  474. screen.blit(TextSurf, TextRect)
  475.  
  476. button(screen, "Start", 450, 300, 100, 50, grey, dark_grey, "play")
  477. button(screen, "Quit", 450, 400, 100, 50, grey, dark_grey, "quit")
  478.  
  479. pygame.display.update()
  480. clock.tick(15)
  481.  
  482.  
  483. play=True
  484. while play==True:
  485. main_menu()
  486.  
  487.  
  488. quit()
  489.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement