from PIL import Image from random import random class Dungeon: def __init__(self, width, height): self.WIDTH = width self.HEIGHT = height self.LENGTH = width * height self.N_REVIVE = 5 self.N_DIE = 2 self.LIFE_CHANCE = 0.4 self.reset() def generate(self): while self.__nextGeneration(): pass def saveAsImage(self, filename): wall = (0, 0, 0) floor = (200, 200, 200) factor = 4 img = Image.new("RGB", (self.WIDTH, self.HEIGHT)) for point in range(self.LENGTH): picPoint = (point % self.WIDTH, point // self.WIDTH) img.putpixel(picPoint, wall if self.map[point] else floor) img = img.resize((self.WIDTH * factor, self.HEIGHT * factor)) img.save(filename) def reset(self): self.map = [random() < self.LIFE_CHANCE for point in range(self.LENGTH)] def __str__(self): res = "" for point in range(self.LENGTH): res += "#" if self.map[point] else "." res += "\n" if point % self.WIDTH == 0 else "" return res def __nextGeneration(self): tmp = [False] * self.LENGTH for point in range(self.LENGTH): neighbors = self.__countNeighbors(point) if self.map[point]: tmp[point] = neighbors > self.N_DIE else: tmp[point] = neighbors >= self.N_REVIVE self.map, tmp = tmp, self.map return self.map != tmp def __countNeighbors(self, point): cnt = 0 for i in range(-1, 2): for j in range(-1, 2): neighPoint = point + i + j * self.WIDTH if point == neighPoint: continue if 0 <= point % self.WIDTH + i < self.WIDTH and \ 0 <= point // self.WIDTH + j < self.HEIGHT: cnt += self.map[neighPoint] else: cnt += 1 return cnt print("Dungeon is generated...") dungeon = Dungeon(100, 100) dungeon.generate() dungeon.saveAsImage("dungeon.png") print("DONE")