Skip to content

Instantly share code, notes, and snippets.

@veb
Created September 10, 2015 17:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save veb/1e49d8f43f1baac19b98 to your computer and use it in GitHub Desktop.
Save veb/1e49d8f43f1baac19b98 to your computer and use it in GitHub Desktop.
Random Cave Generator Pygame
import pygame
from collections import defaultdict
levelmap = defaultdict(dict)
class Player(pygame.sprite.Sprite):
def __init__(self, level):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((10,10))
self.image.fill((40,50,170))
self.rect = self.image.get_rect()
self.x, self.y = 0,0
def update(self, world):
spd = 2
keys = world.keys
if keys[pygame.K_a]:self.x+=spd
if keys[pygame.K_d]:self.x-=spd
if keys[pygame.K_w]:self.y+=spd
if keys[pygame.K_s]:self.y-=spd
world.update_camera()
self.rect.x, self.rect.y = world.position_transform(self)
def renderlevel(noiseimage, levelmap, screen, camerax, cameray):
mapsize = 10
for w in range(-1, screen.get_width() / mapsize):
for h in range(-1, screen.get_height() / mapsize):
x = int(w - camerax/mapsize)
y = int(h - cameray/mapsize)
if x in levelmap:
if y in levelmap[x]:
if levelmap[x][y] == 0:
continue
realx = x* mapsize + camerax
realy = y* mapsize + cameray
noiseimage.fill((40,150,60),(realx,realy,mapsize,mapsize))
class World():
seed = 7
def __init__(self, screen):
self.player = Player(levelmap)
self.sprites = pygame.sprite.LayeredUpdates()
self.sprites.add(self.player)
self.camerax = 0
self.cameray = 0
self.keys = 0
self.screen = screen
# random noise
size = 100
for i in range(size):
for j in range(size):
levelmap[i][j] = 0;
if self.seededRandom(2, 0) > 1:
levelmap[i][j] = self.seededRandom(2, 0);
# generate caves
smoothness = 6
for i in range(smoothness):
global levelmap
new_map = defaultdict(dict)
for x in range(size):
for y in range(size):
x_range = {'low': max(0, x - 1), 'high': min(size - 1, x + 1)}
y_range = {'low': max(0, y - 1), 'high': min(size - 1, y + 1)}
wall_count = 0
for a in range(x_range['low'], x_range['high']+1):
for b in range(y_range['low'], y_range['high']+1):
if ((a == x) and (b == y)):
continue;
wall_count += 1 - levelmap[a][b]
if (((levelmap[x][y] == 0) and (wall_count >= 4)) or
((levelmap[x][y] == 1) and (wall_count >= 5)) or
((x == 0) or (y == 0) or (x == size - 1) or (y == size - 1))):
new_map[x][y] = 0
else:
new_map[x][y] = 1
levelmap = new_map;
def position_transform(self, obj):
return -(obj.x - self.camerax), -(obj.y - self.cameray)
def update_camera(self):
self.camerax = self.player.x + self.screen.get_width()/2
self.cameray = self.player.y + self.screen.get_height()/2
def seededRandom (self, maxa, mina):
maxa = maxa or 1
mina = mina or 0
World.seed = (World.seed * 9301 + 49297) % 233280
rnd = World.seed / 233280.0
return mina + rnd * (maxa - mina)
def main():
pygame.init()
screen = pygame.display.set_mode((600, 480))
clock = pygame.time.Clock()
world = World(screen)
while 1:
world.keys=pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
world.sprites.update(world)
screen.fill((0,0,0))
renderlevel(screen, levelmap, screen, world.camerax, world.cameray)
world.sprites.draw(screen)
clock.tick(60)
pygame.display.flip()
pygame.display.update()
if __name__ =='__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment