Python Forum
[PyGame] Error: variable referenced before assignment
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] Error: variable referenced before assignment
#1
I have been recently following a tutorial about how to make a flappy bird AI.
When i finished part 4 of the tutorial(tried to add the score) , i tried to run the code and i got this error:
Error:
line 208, in main draw_window(win, bird, pipes, base, score) UnboundLocalError: local variable 'score' referenced before assignment
this is my code:
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
import os
import random
import pygame
import time
import neat
pygame.font.init()
 
win_width = 500
win_height = 700
 
bird_imgs = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]
pipe_img = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "pipe.png")))
base_img = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "base.png")))
bg_img = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bg.png")))
 
Stat_Font = pygame.font.SysFont("comicsans", 50)
 
class Bird:
    imgs = bird_imgs
    max_rotation = 25
    rotation_velocity = 20
    animation_time = 5
 
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.tilt = 0
        self.tick_count = 0
        self.vel = 0
        self.height = self.y
        self.img_count = 0
        self.img = self.imgs[0]
    def jump(self):
        self.vel = -10.5
        self.tick_count = 0
        self.height = self.y
 
    def move(self):
        self.tick_count += 1
 
        d = self.vel*self.tick_count + 1.5*self.tick_count**2
 
        if d >= 16:
            d = 16
 
        if d < 0:
            d -= 2
 
        self.y = self.y + d
 
        if d < 0 or self.y < self.height + 50:
            if self.tilt < self.max_rotation:
                self.tilt = self.max_rotation
        else:
            if self.tilt > -90:
                self.tilt -= self.rotation_velocity
 
    def draw(self, win):
        self.img_count += 1
 
        if self.img_count < self.animation_time:
            self.img = self.imgs[0]
        elif self.img_count < self.animation_time*2:
            self.img = self.imgs[1]
        elif self.img_count < self.animation_time*3:
              self.img = self.imgs[2]
        elif self.img_count < self.animation_time*4:
              self.img = self.imgs[1]
        elif self.img_count == self.animation_time*4 + 1:
              self.img = self.imgs[0]
              self.img_count = 0
 
        if self.tilt <= -80:
            self.img = self.imgs[1]
            self.img_count = self.animation_time*2
 
        rotated_image = pygame.transform.rotate(self.img, self.tilt)
        new_rect = rotated_image.get_rect(center=self.img.get_rect(topleft = (self.x, self.y)).center)
        win.blit(rotated_image, new_rect.topleft)
 
    def get_mask(self):
        return pygame.mask.from_surface(self.img)
 
 
class Pipe:
    gap = 200
    vel = 5
 
    def __init__(self, x):
        self.x = x
        self.height = 0
 
        self.top = 0
        self.bottom = 0
        self.pipe_top = pygame.transform.flip(pipe_img, False, True)
        self.pipe_bottom = pipe_img
 
        self.passed = False
        self.set_height()
 
    def set_height(self):
        self.height = random.randrange(50, 450)
        self.top = self.height - self.pipe_top.get_height()
        self.bottom = self.height + self.gap
 
    def move(self):
        self.x -= self.vel
 
    def draw(self, win):
        win.blit(self.pipe_top, (self.x, self.top))
        win.blit(self.pipe_bottom, (self.x, self.bottom))
 
    def collide(self, bird):
        bird_mask = bird.get_mask()
        top_mask = pygame.mask.from_surface(self.pipe_top)
        bottom_mask = pygame.mask.from_surface(self.pipe_bottom)
 
        top_offset = (self.x - bird.x, self.top - round(bird.y))
        bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))
 
        b_point = bird_mask.overlap(bottom_mask, bottom_offset)
        t_point = bird_mask.overlap(top_mask, top_offset)
 
        if t_point or b_point:
            return True
 
        return False
 
class Base:
    vel = 5
    width = base_img.get_width()
    img = base_img
 
    def __init__(self, y):
        self.y = y
        self.x1 = 0
        self.x2 = self.width
 
    def move(self):
        self.x1 -= self.vel
        self.x2 -= self.vel
 
        if self.x1 + self.width < 0:
            self.x1 = self.x2 + self.width
 
        if self.x2 + self.width < 0:
            self.x2 = self.x1 + self.width
 
    def draw(self, win):
        win.blit(self.img, (self.x1, self.y))
        win.blit(self.img, (self.x2, self.y))
 
def draw_window(win, bird, pipes, base, score):
    win.blit(bg_img, (0,0))
    for pipe in pipes:
        pipe.draw(win)
 
    text = Stat_Font.render("Score: " + str(score), 1,(255,255,255))
    win.blit(text, (win_width - 10 - text.get_width(), 10))
 
    base.draw(win)
 
    bird.draw(win)
    pygame.display.update()
 
def main():
    bird = Bird(230,350)
    base = Base(630)
    pipes = [Pipe(600)]
    win = pygame.display.set_mode((win_width, win_height))
    clock = pygame.time.Clock()
 
    run = True
    while run:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
 
                run = False
        #bird.move()
        add_pipe = False
        rem = []
        for pipe in pipes:
            if pipe.collide(bird):
                pass
 
            if pipe.x + pipe.pipe_top.get_width() < 0:
                rem.append(pipe)
 
            if not pipe.passed and pipe.x < bird.x:
                pipe.passed = True
                add_pipe = True
 
            pipe.move()
 
        if add_pipe:
            score += 1
            pipes.append(Pipe(700))
 
 
        for r in rem:
            pipes.remove(r)
 
        if bird.y + bird.img.get_height() >= 730:
            pass
 
        base.move()
        draw_window(win, bird, pipes, base, score)
 
    pygame.quit()
    quit()
 
main()
here is part 4 of the series:
https://www.youtube.com/watch?v=SYqQ5oddgcw

Can anyone see what I did wrong?
Reply
#2
You didn't create the score variable see the link below at the point it is created.
https://youtu.be/SYqQ5oddgcw?t=350
Reply
#3
oh thanks you
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  local variable 'spider_1_health' referenced before assignment Tbot1000 1 2,474 Sep-01-2020, 09:07 PM
Last Post: metulburr

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020