-
Notifications
You must be signed in to change notification settings - Fork 0
/
gene_house.py
164 lines (147 loc) · 5.34 KB
/
gene_house.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import sys, pygame
pygame.init()
# game hyperparameters
size = width, height = 512, 512
speed = 3
growth_speed = 3
game_time = 60
velocity = [0, 0]
black = 0, 0, 0
white = 255, 255, 255
# display screen
screen = pygame.display.set_mode(size)
# load & initalize images
background = pygame.image.load("assets/background.png")
player = pygame.image.load("assets/char_walk_right.gif")
player_rect = player.get_rect()
# initialize clock
clock = pygame.time.Clock()
# set up Time & Score text
font = pygame.font.Font(None, 32)
time = 0
text = font.render("Time: "+str(time), True, (10, 10, 10))
textpos = text.get_rect(x=100, y=10)
score = [0]
score_text = font.render("Score: "+str(score[0]), True, (10, 10, 10))
scoretextpos = text.get_rect(x=300, y=10)
# create list of crops
crops = []
# tomato class
class Tomato():
def __init__(self):
self.image = pygame.image.load("assets/seeds.png")
self.crop_rect = player_rect.copy().move(70,50)
self.timestamp = pygame.time.get_ticks()//1000
self.growth_stage = 0
# grow the tomato every growth_speed seconds
def check_grow(self):
if time - self.timestamp >= growth_speed:
self.grow()
self.timestamp = time
# advance the tomato to the next stage of growth
def grow(self):
if self.growth_stage == 0:
self.growth_stage = 1
self.image = pygame.image.load("assets/bud.png")
elif self.growth_stage == 1:
self.growth_stage = 2
self.image = pygame.image.load("assets/sprout.png")
elif self.growth_stage == 2:
self.growth_stage = 3
self.image = pygame.image.load("assets/tomato_bloom.png")
elif self.growth_stage == 3:
self.growth_stage = 4
self.image = pygame.image.load("assets/tomato_transparent.png")
else:
# delete the crop by removing it from the crop list
crops.remove(self)
def retrieve(self):
# retrieve crop by removing it's image and increasing score
crops.remove(self)
new_score = score[0] + 1
score[0] = new_score
# when game is over, display player's score than close after 5 seconds
def game_over():
screen.fill(white)
game_over_text = font.render("Game Over! Your Score = "+str(score[0]), True, (10,10,10))
screen.blit(game_over_text, (100, 100))
pygame.display.flip()
pygame.time.delay(5000)
sys.exit()
# main game loop
playing = True
while playing:
# tick clock & update time & score
clock.tick(60)
time = pygame.time.get_ticks()//1000
text = font.render("Time: "+str(time), True, (10, 10, 10))
score_text = font.render("Score: "+str(score[0]), True, (10, 10, 10))
# move character if key is pressed
for event in pygame.event.get():
# handle quitting the game
if event.type == pygame.QUIT: sys.exit()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
# move down
velocity[0]=0
velocity[1]=speed
elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
# move up
velocity[0]=0
velocity[1]=-speed
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
# move right
velocity[0]=speed
velocity[1]=0
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
# move left
velocity[0]=-speed
velocity[1]=0
elif event.type == pygame.KEYDOWN and event.key == pygame.K_t:
# plant a new tomato
tomato = Tomato()
valid_spot = True
# test if the new tomato would overlap an old one
for crop in crops:
if pygame.Rect.colliderect(tomato.crop_rect, crop.crop_rect):
valid_spot = False
# add the tomato to crops if it doesn't overlap any other crop
if valid_spot:
crops.append(tomato)
elif event.type == pygame.KEYDOWN and event.key == pygame.K_r:
# retrieve a tomato
grown_tomatoes = []
# test if the player is overlapping any grown tomatoes
for crop in crops:
if pygame.Rect.colliderect(player_rect, crop.crop_rect) and crop.growth_stage == 4:
grown_tomatoes.append(crop)
# retrive those tomatoes
for crop in grown_tomatoes:
crop.retrieve()
else:
velocity[0]=0
velocity[1]=0
# prevent player from moving off-screen
if player_rect.left < -25:
velocity[0] = max(0, velocity[0])
if player_rect.right > width + 25:
velocity[0] = min(0, velocity[0])
if player_rect.top < 0:
velocity[1] = max(0, velocity[1])
if player_rect.bottom > height:
velocity[1] = min(0, velocity[1])
player_rect = player_rect.move(velocity)
# redraw the screen
screen.fill(black)
screen.blit(background, (0,0))
screen.blit(text, textpos)
screen.blit(score_text, scoretextpos)
# draw everything in the crops list
for crop in crops:
crop.check_grow()
screen.blit(crop.image, crop.crop_rect)
screen.blit(player, player_rect)
pygame.display.flip()
# end the game after game_time seconds
if time >= game_time:
playing = False
game_over()