Thank you. Here is the complete code so far. I changed out my graphics for simple squares, and it will run as-is. Find the red key and take it to the white exit.
import pygame
import random
import time
import sys
pygame.init()
blue = (5, 5, 200)
green = (4, 80, 4)
red = (250, 0, 0)
grey = (30, 30, 30)
lightgrey = (150, 150, 150)
black = (0, 0, 0)
brown = (100, 100, 5)
white = (255, 255, 255)
width = 600
height = 600
tile_size = 30
mapheight = 2400
mapwidth = 2400
floor_locations = []
#wallimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/wall1.png")
#heroimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/hero_1.png")
#upstair = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/upstairs.png")
#keyimage = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/key.png")
#downstair = pygame.image.load("C:/Users/owner/Desktop/python3/dungeongraphics/downstairs.png")
diggers = pygame.sprite.Group()
players = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
base_tiles = pygame.sprite.Group()
floor_tiles = pygame.sprite.Group()
walls = pygame.sprite.Group()
keys = pygame.sprite.Group()
exits = pygame.sprite.Group()
key_collected = False
class Player(pygame.sprite.Sprite):
def __init__(self, game, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(blue)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def move(self, dx=0, dy=0):
global key_collected
if not self.collide_with_walls(dx, dy):
self.rect.x += dx
self.rect.y += dy
collect = pygame.sprite.spritecollide(game.player, keys, True)
if collect:
key_collected = True
exiting = pygame.sprite.spritecollide(game.player, exits, False)
if exiting and key_collected == True:
print("win!!")
def collide_with_walls(self, dx=0, dy=0):
for wall in walls:
if wall.rect.x==self.rect.x + dx and wall.rect.y == self.rect.y + dy:
return True
return False
def update(self):
self.rect.x = self.x
self.rect.y = self.y
class Floor(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(brown)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Key(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(red)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Entrance(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(green)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Exit(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(white)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Base(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.colour = grey
self.image = pygame.draw.rect(game.window, (self.colour), (x, y, tile_size, tile_size), 0)
self.rect = pygame.Rect(x, y, tile_size, tile_size)
self.x = x
self.y = y
pygame.display.flip()
class Wall(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(lightgrey)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
pygame.display.flip()
class Digger(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((tile_size, tile_size))
self.image.fill(red)
self.rect = self.image.get_rect() #pygame.Rect(self.rect.x, self.recty, tile_size, tile_size)
self.rect.x = x
self.rect.y = y
def Make_map():
for x in range(0, mapwidth, tile_size):
for y in range(0, mapheight, tile_size):
base = Base(x, y)
base_tiles.add(base)
digger = Digger((mapwidth / 2), (mapheight / 2))
diggers.add(digger)
all_sprites.add(digger)
for i in range(2400):
(dx, dy) = random.choice([(0, tile_size), (0, -tile_size), (-tile_size, 0), (tile_size, 0)])
if digger.rect.x + dx <= tile_size:
dx = 0
if digger.rect.x + dx >= mapwidth - (2 * tile_size):
dx = 0
if digger.rect.y + dy <= tile_size:
dy = 0
if digger.rect.y + dy >= mapheight - (2 * tile_size):
dy = 0
digger.rect.x = digger.rect.x + dx
digger.rect.y = digger.rect.y + dy
floor_locations.append((digger.rect.x, digger.rect.y))
pygame.sprite.spritecollide(digger, floor_tiles, True)
floor = Floor(digger.rect.x, digger.rect.y)
all_sprites.add(floor)
floor_tiles.add(floor)
pygame.sprite.spritecollide(digger, base_tiles, True)
key_location = random.choice(floor_locations)
x, y = key_location
key1 = Key(x, y)
all_sprites.add(key1)
keys.add(key1)
for floor in floor_tiles:
for delta_x, delta_y in ((tile_size, 0), (0, tile_size), (-tile_size, 0), (0, -tile_size), (-tile_size, tile_size), (tile_size, -tile_size), (-tile_size, -tile_size), (tile_size, tile_size)):
floor.rect.x = floor.rect.x + delta_x
floor.rect.y = floor.rect.y + delta_y
hits = pygame.sprite.spritecollide(floor, base_tiles, False)
floor.rect.x = floor.rect.x - delta_x
floor.rect.y = floor.rect.y - delta_y
for hit in hits:
wall = Wall(hit.rect.x, hit.rect.y)
all_sprites.add(wall)
walls.add(wall)
entrance = Entrance((mapwidth / 2), (mapheight / 2))
eXit = Exit(digger.rect.x, digger.rect.y)
all_sprites.add(floor, entrance, eXit)
floor_tiles.add(floor)
exits.add(eXit)
class Game():
def __init__(self):
pygame.init()
self.window = pygame.display.set_mode((width, height))
pygame.display.set_caption("Dungeon")
self.clock = pygame.time.Clock()
pygame.key.set_repeat(500, 100)
def New(self):
Make_map()
self.player = Player(game, (mapwidth / 2), (mapheight / 2))
all_sprites.add(self.player)
players.add(self.player)
self.camera = Camera(mapwidth, mapheight)
self.run()
all_sprites.draw(window)
pygame.display.flip()
def run(self):
playing = True
while playing:
self.update()
self.draw()
self.events()
def quit(self):
pygame.quit()
sys.exit()
def update(self):
self.camera.update(self.player)
all_sprites.draw(game.window)
def draw(self):
self.window.fill(black)
for sprite in all_sprites:
self.window.blit(sprite.image, self.camera.apply(sprite))
pygame.display.flip()
def events(self):
# catch all events here
check = True
while check:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.quit()
if event.key == pygame.K_LEFT:
self.player.move(dx=-tile_size)
check = False
if event.key == pygame.K_RIGHT:
self.player.move(dx=tile_size)
check = False
if event.key == pygame.K_UP:
self.player.move(dy=-tile_size)
check = False
if event.key == pygame.K_DOWN:
self.player.move(dy=tile_size)
check = False
class Camera:
def __init__(self, width, height):
self.camera = pygame.Rect(0, 0, width, height)
self.width = width
self.height = height
def apply(self, entity):
return entity.rect.move(self.camera.topleft)
def update(self, target):
x = -target.rect.x + int(width / 2)
y = -target.rect.y + int(height / 2)
x = min(0, x)
y = min(0, y)
x = max(-(mapwidth - width), x)
y = max(-(mapheight - height), y)
self.camera = pygame.Rect(x, y, self.width, self.height)
game = Game()
game.New()
I was really just looking for some general guidance on how it is normally done (eg. make 10 of these levels and link the entrances and exits). Then I would at least have a starting point.