Mercurial > pygame-tutorial
changeset 4:2661d2091f1d
Second program step by step
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 17 Jun 2012 00:18:38 +0200 |
| parents | e957564f94bb |
| children | 03fe34478f69 |
| files | 001/000.py 001/001.py 001/002.py 001/003.py 001/004.py 001/005.py 001/006.py 001/game.py |
| diffstat | 8 files changed, 539 insertions(+), 85 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/000.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def draw_map(screen, images): + screen_rect = screen.get_rect() + for y in xrange(screen_rect.h // 32): + for x in xrange(screen_rect.w // 32): + screen.blit(images['.'], (x * 32, y * 32)) + +def wait_for_quit(): + pygame.display.update() + while True: + event = pygame.event.wait() + if event.type == pg.QUIT: + return + +def run_game(): + screen = initialize_screen() + images = load_images() + draw_map(screen, images) + wait_for_quit() + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/001.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def draw_map(screen, images, level_map): + for y, row in enumerate(level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + +def wait_for_quit(): + pygame.display.update() + while True: + event = pygame.event.wait() + if event.type == pg.QUIT: + return + +def run_game(): + screen = initialize_screen() + images = load_images() + draw_map(screen, images, LEVEL_MAP) + wait_for_quit() + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/002.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def draw_map(screen, images, level_map): + for y, row in enumerate(level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + +def wait_for_quit(screen, images, level_map): + hero_x, hero_y = 1, 1 + level_map = [list(row) for row in level_map] + level_map[hero_y][hero_x] = '@' + while True: + draw_map(screen, images, level_map) + pygame.display.update() + event = pygame.event.wait() + if event.type == pg.QUIT: + return + +def run_game(): + screen = initialize_screen() + images = load_images() + wait_for_quit(screen, images, LEVEL_MAP) + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/003.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def draw_map(screen, images, level_map): + for y, row in enumerate(level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + +def walk_around(screen, images, level_map): + hero_x, hero_y = 1, 1 + level_map = [list(row) for row in level_map] + while True: + level_map[hero_y][hero_x] = '@' + draw_map(screen, images, level_map) + pygame.display.update() + event = pygame.event.wait() + level_map[hero_y][hero_x] = '.' + if event.type == pg.QUIT: + return + elif event.type == pg.KEYDOWN: + if event.key == pg.K_ESCAPE: + return + elif event.key == pg.K_DOWN: + hero_y += 1 + elif event.key == pg.K_UP: + hero_y -= 1 + elif event.key == pg.K_LEFT: + hero_x -= 1 + elif event.key == pg.K_RIGHT: + hero_x += 1 + +def run_game(): + screen = initialize_screen() + images = load_images() + walk_around(screen, images, LEVEL_MAP) + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/004.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def draw_map(screen, images, level_map): + for y, row in enumerate(level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + +def move_hero(level_map, x, y, dx, dy): + if level_map[y + dy][x + dx] == '.': + level_map[y][x] = '.' + x += dx + y += dy + level_map[y][x] = '@' + return x, y + +def walk_around(screen, images, level_map): + hero_x, hero_y = 1, 1 + level_map = [list(row) for row in level_map] + level_map[hero_y][hero_x] = '@' + while True: + draw_map(screen, images, level_map) + pygame.display.update() + event = pygame.event.wait() + if event.type == pg.QUIT: + return + elif event.type == pg.KEYDOWN: + if event.key == pg.K_ESCAPE: + return + elif event.key == pg.K_DOWN: + hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 0, 1) + elif event.key == pg.K_UP: + hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 0, -1) + elif event.key == pg.K_LEFT: + hero_x, hero_y = move_hero(level_map, hero_x, hero_y, -1, 0) + elif event.key == pg.K_RIGHT: + hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 1, 0) + +def run_game(): + screen = initialize_screen() + images = load_images() + walk_around(screen, images, LEVEL_MAP) + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/005.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + + +class Level(object): + def __init__(self, level_map): + self.level_map = [list(row) for row in level_map] + self.hero_position = 1, 1 + self[self.hero_position] = '@' + + def __setitem__(self, (x, y), square): + self.level_map[y][x] = square + + def __getitem__(self, (x, y)): + return self.level_map[y][x] + + def render(self, screen, images): + for y, row in enumerate(self.level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + + def move_hero(self, (dx, dy)): + x, y = self.hero_position + if self[x + dx, y + dy] == '.': + self[self.hero_position] = '.' + self.hero_position = x + dx, y + dy + self[self.hero_position] = '@' + + +def initialize_screen(): + pygame.display.init() + screen = pygame.display.set_mode((800, 600)) + screen.fill((0x66, 0x66, 0x66)) + return screen + +def load_images(): + images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + return images + +def walk_around(screen, images, level): + while True: + level.render(screen, images) + pygame.display.update() + event = pygame.event.wait() + if event.type == pg.QUIT: + return + elif event.type == pg.KEYDOWN: + if event.key == pg.K_ESCAPE: + return + elif event.key == pg.K_DOWN: + level.move_hero((0, 1)) + elif event.key == pg.K_UP: + level.move_hero((0, -1)) + elif event.key == pg.K_LEFT: + level.move_hero((-1, 0)) + elif event.key == pg.K_RIGHT: + level.move_hero((1, 0)) + +def run_game(): + screen = initialize_screen() + images = load_images() + level = Level(LEVEL_MAP) + walk_around(screen, images, level) + + +if __name__ == '__main__': + run_game()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/001/006.py Sun Jun 17 00:18:38 2012 +0200 @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import pygame.locals as pg + + +LEVEL_MAP = [ + "XXXXXXXXXXXXXXXXXXXXXXXXX", + "X.......................X", + "X.XXXXXXXXXX.XXXXXXXXXX.X", + "X.X......X.X..........X.X", + "X.X..X.XXX.X.XXXXXXXXXX.X", + "X.XXXX.....X.......X..X.X", + "X......XXXXXXXXXXX.X..X.X", + "X.XX.X.X.........X....X.X", + "X.X..X...........X.X..X.X", + "X.X..X.X.........X.X..X.X", + "X.X..X.XXXXXXXXXXX.XXXX.X", + "X.XXXX..................X", + "X.X..X.XXXXXXXXXXXXXXXX.X", + "X.X..X................X.X", + "X.X....X..............X.X", + "X.XXXX.XXXXXXXXXXXXXXXX.X", + "X.......................X", + "XXXXXXXXXXXXXXXXXXXXXXXXX", +] + + +class Level(object): + def __init__(self, level_map): + self.level_map = [list(row) for row in level_map] + self.hero_position = 1, 1 + self[self.hero_position] = '@' + + def __setitem__(self, (x, y), square): + self.level_map[y][x] = square + + def __getitem__(self, (x, y)): + return self.level_map[y][x] + + def render(self, screen, images): + for y, row in enumerate(self.level_map): + for x, square in enumerate(row): + screen.blit(images[square], (x * 32, y * 32)) + + def move_hero(self, (dx, dy)): + x, y = self.hero_position + if self[x + dx, y + dy] == '.': + self[self.hero_position] = '.' + self.hero_position = x + dx, y + dy + self[self.hero_position] = '@' + + +class Game(object): + def __init__(self): + pygame.display.init() + self.screen = pygame.display.set_mode((800, 600)) + self.screen.fill((0x66, 0x66, 0x66)) + self.images = { + 'X': pygame.image.load('wall.png').convert(), + '.': pygame.image.load('dirt.png').convert(), + '@': pygame.image.load('hero.png').convert(), + } + self.keys = { + pg.K_UP: (self.move_hero, (0, -1)), + pg.K_DOWN: (self.move_hero, (0, 1)), + pg.K_LEFT: (self.move_hero, (-1, 0)), + pg.K_RIGHT: (self.move_hero, (1, 0)), + pg.K_ESCAPE: (self.quit,), + } + + def load_level(self, level_map): + self.level = Level(level_map) + + def quit(self): + self.game_over = True + + def move_hero(self, direction): + self.level.move_hero(direction) + + def control(self): + event = pygame.event.wait() + if event.type == pg.QUIT: + self.quit() + elif event.type == pg.KEYDOWN: + try: + action = self.keys[event.key] + except KeyError: + pass + else: + action[0](*action[1:]) + + def display(self): + self.level.render(self.screen, self.images) + pygame.display.update() + + def run(self): + self.game_over = False + while not self.game_over: + self.display() + self.control() + + +if __name__ == '__main__': + game = Game() + game.load_level(LEVEL_MAP) + game.run()
--- a/001/game.py Fri Jun 15 00:09:01 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import pygame -import pygame.locals as pg - - -LEVEL_MAP = [ - "XXXXXXXXXXXXXXXXXXXXXXXXX", - "X.......................X", - "X.XXXXXXXXXX.XXXXXXXXXX.X", - "X.X......X.X..........X.X", - "X.X..X.XXX.X.XXXXXXXXXX.X", - "X.XXXX.....X.......X..X.X", - "X......XXXXXXXXXXX.X..X.X", - "X.XX.X.X.........X....X.X", - "X.X..X...........X.X..X.X", - "X.X..X.X.........X.X..X.X", - "X.X..X.XXXXXXXXXXX.XXXX.X", - "X.XXXX..................X", - "X.X..X.XXXXXXXXXXXXXXXX.X", - "X.X..X................X.X", - "X.X....X..............X.X", - "X.XXXX.XXXXXXXXXXXXXXXX.X", - "X.......................X", - "XXXXXXXXXXXXXXXXXXXXXXXXX", -] - -def initialize_screen(): - pygame.display.init() - screen = pygame.display.set_mode((800, 600)) - screen.fill((0x66, 0x66, 0x66)) - return screen - -def load_images(): - images = { - 'X': pygame.image.load('wall.png').convert(), - '.': pygame.image.load('dirt.png').convert(), - '@': pygame.image.load('hero.png').convert(), - } - return images - -def draw_map(screen, images, level_map): - for y, row in enumerate(level_map): - for x, square in enumerate(row): - screen.blit(images[square], (x * 32, y * 32)) - -def move_hero(level_map, x, y, dx, dy): - if level_map[y + dy][x + dx] == '.': - level_map[y][x] = '.' - x += dx - y += dy - level_map[y][x] = '@' - return x, y - -def walk_around(screen, images, level_map): - hero_x, hero_y = 1, 1 - level_map = [list(row) for row in level_map] - level_map[hero_y][hero_x] = '@' - while True: - draw_map(screen, images, level_map) - pygame.display.update() - event = pygame.event.wait() - if event.type == pg.QUIT: - return - elif event.type == pg.KEYDOWN: - if event.key == pg.K_ESCAPE: - return - elif event.key == pg.K_DOWN: - hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 0, 1) - elif event.key == pg.K_UP: - hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 0, -1) - elif event.key == pg.K_LEFT: - hero_x, hero_y = move_hero(level_map, hero_x, hero_y, -1, 0) - elif event.key == pg.K_RIGHT: - hero_x, hero_y = move_hero(level_map, hero_x, hero_y, 1, 0) - -def run_game(): - screen = initialize_screen() - images = load_images() - walk_around(screen, images, LEVEL_MAP) - - -if __name__ == '__main__': - run_game()
