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()