Nov-16-2019, 01:15 AM
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.