[Tutor] Help with error in ski game

Chloe Beck chloebeck at hotmail.com
Sun Nov 20 12:58:25 CET 2011


Hi,
I've just begun trying to teach myself how to program with Python. I'm 
currently working through the book 'Hello World, Computer programming 
for kids and other beginners' and am stuck on one of the exercises.

The exercise is a take on the SkiFree game.

The error message I get is as follows and occurs in game play when my 
skier goes to the far left of the screen:

Traceback (most recent call last):
   File "/Users/Chloe/Documents/SKI SKI/ski ski ski", line 99, in <module>
     skier.move(speed)
   File "/Users/Chloe/Documents/SKI SKI/ski ski ski", line 28, in move
     if self.rect.centerx < 20:  self.rect.centrex = 20
AttributeError: 'pygame.Rect' object has no attribute 'centrex'

I can't for the life of me figure out what i've done wrong but as i said 
i am very new to this all. Enjoying it so far though :)
I'm using Python 2.5 on a Mac

Below is the code. Any help is greatly appreciated as is any advice on 
new things to try when attempting to learn Python


Regards Chloe







import pygame, sys, random

skier_images = ["skier_down.png", "skier_right1.png",
                 "skier_right2.png", "skier_left2.png",
                 "skier_left1.png"]

class SkierClass(pygame.sprite.Sprite):
     def __init__(self):
         pygame.sprite.Sprite.__init__(self)
         self.image = pygame.image.load("skier_down.png")
         self.rect = self.image.get_rect()
         self.rect.center = [320,100]
         self.angle = 0

     def turn(self, direction):
         self.angle = self.angle + direction
         if self.angle < -2:  self.angle = -2
         if self.angle >  2:  self.angle = 2
         center = self.rect.center
         self.image = pygame.image.load(skier_images[self.angle])
         self.rect = self.image.get_rect()
         self.rect.center = center
         speed = [self.angle, 6 - abs(self.angle) * 2]
         return speed

     def move(self, speed):
         self.rect.centerx = self.rect.centerx + speed[0]
         if self.rect.centerx < 20:  self.rect.centrex = 20
         if self.rect.centerx > 620: self.rect.centerx = 620

class ObstacleClass (pygame.sprite.Sprite):
     def __init__(self, image_file, location, type):
         pygame.sprite.Sprite.__init__(self)
         self.image_file = image_file
         self.image = pygame.image.load(image_file)
         self.location = location
         self.rect = self.image.get_rect()
         self.rect.center = location
         self.type = type
         self.passed = False

     def scroll(self, t_ptr):
         self.rect.centery = self.location[1] - t_ptr

def create_map(start, end):
     obstacles = pygame.sprite.Group()
     gates = pygame.sprite.Group()
     locations = []
     for i in range(10):
         row = random.randint(start, end)
         col = random.randint (0, 9)
         location  = [col * 64 + 20, row * 64 + 20]
         if not  (location in locations):
             locations.append(location)
             type = random.choice(["tree", "flag"])
             if type == "tree" : img = "skier_tree.png"
             elif type =="flag":  img = "skier_flag.png"
             obstacle = ObstacleClass(img, location, type)
             obstacles.add(obstacle)
     return obstacles

def animate() :
     screen.fill([255, 255, 255])
     pygame.display.update(obstacles.draw(screen))
     screen.blit(skier.image, skier.rect)
     screen.blit(score_text, [10, 10])
     pygame.display.flip()

def updateObstacleGroup(map0, map1):
     obstacles = pygame.sprite.Group()
     for ob in map0:  obstacles.add(ob)
     for ob in map1:  obstacles.add(ob)
     return obstacles

pygame.init()
screen = pygame.display.set_mode([640,640])
clock = pygame.time.Clock()
skier = SkierClass()
speed = [0, 6]
map_position = 0
points = 0
map0 = create_map(20, 29)
map1 = create_map(10, 19)
activeMap = 0

obstacles = updateObstacleGroup(map0, map1)
font = pygame.font.Font(None,50)


while True:
     clock.tick(30)
     for event in pygame.event.get():
         if event.type == pygame.QUIT: sys.exit()
         if event.type == pygame.KEYDOWN:
             if event.key == pygame.K_LEFT:
                 speed = skier.turn(-1)
             elif event.key == pygame.K_RIGHT:
                 speed = skier.turn(1)
     skier.move(speed)
     map_position += speed[1]

     if map_position >=640 and activeMap ==0:
         activeMap = 1
         map0 = create_map(20, 29)
         obstacles = updateObstacleGroup(map0, map1)
     if map_position >=1280 and activeMap == 1:
         activeMap = 0
         for ob in map0:
             ob.location[1] = ob.location[1]  -  1280
         map_position = map_position - 1280
         map1 = create_map(10, 19)
         obstacles = updateObstacleGroup(map0,map1)

     for obstacle in obstacles:
         obstacle.scroll(map_position)

     hit = pygame.sprite.spritecollide(skier, obstacles, False)
     if hit:
         if hit [0]. type == "tree" and not hit[0].passed:
             points = points - 100
             skier.image = pygame.image.load("skier_crash.png")
             animate()
             pygame.time.delay(1000)
             skier.image = pygame.image.load("skier_down.png")
             skier.angle = 0
             speed = [0,6]
             hit[0].passed = True
         elif hit [0].type == "flag" and not hit [0].passed:
             points += 10
             obstacles.remove(hit[0])


     score_text = font.render("Score: " +str(points), 1, (0, 0, 0))
     animate()

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20111120/c40e87f9/attachment.html>


More information about the Tutor mailing list