Created
October 5, 2013 09:56
-
-
Save reyman/6839004 to your computer and use it in GitHub Desktop.
roguelike game example with problem of fitting
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cBlack = 0,0,0 | |
cWhite = 255,255,255 | |
cGrey = 150,150,0 | |
cGreen = 0,128,0 | |
cDark = 0,120,200 | |
cRed = 255,0,0 | |
cEmpty = 0 | |
cWall = -1 | |
cStartBloc = 1 | |
cEndBloc = 2 | |
cPaintedBloc = 3 | |
cBlockedBloc = 4 | |
cN = 1 | |
cS = 2 | |
cE = 4 | |
cW = 8 | |
cWay = 0 | |
cNoWay = 1 | |
square_pixels = 15 | |
base_offset = 30 | |
mazeColorRules = {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
Created on Sun Aug 26 14:52:20 2012 | |
@author: srey | |
""" | |
from random import randint | |
import os | |
import constants as c | |
import drawRogue as draw | |
import sys, pygame | |
from constants import * | |
from pygame.locals import * | |
mapLoaded = [ | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, | |
0, 0, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1], | |
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1]] | |
#def draw_msg_area(self, area, msg): | |
# """ | |
# Draws the message area above the game area. | |
# You must call update_screen to see the results! | |
# | |
# Keyword arguments: | |
# area -- The map from which to obtain dimensions | |
# msg -- Message object from which to obtain history | |
# """ | |
# font = pygame.font.Font(self.font_type, self.font_size - 4) | |
# clear_surface = pygame.Surface((TILE_SIZE_X*COLUMNS, TILE_SIZE_Y + 1)) # Create a blank black surface | |
# clear_surface.fill((0, 0, 0)) | |
# history = msg.get_history() | |
# for i in range(min(len(history), 5)): | |
# sign = font.render(history[i], 1, (250, 250, 250), (0, 0, 0)) | |
# pos = (0, i*TILE_SIZE_Y) | |
# self.background.blit(clear_surface, pos) # Erase old | |
# self.background.blit(sign, pos) | |
class Map(object): | |
def __init__(self, map): | |
self.size = len(map) | |
self.tilemap = self.load(map) | |
self.movingObject = [] | |
def load(self,mymap): | |
tileMap = [] | |
for line in mymap: | |
tileLine = [] | |
for value in line: | |
if value == 1: | |
tileLine.append(Case("#", True)) | |
else: | |
tileLine.append(Case(".", False)) | |
tileMap.append(tileLine) | |
return tileMap | |
def moveObject(self,dx,dy): | |
for objToMove in self.movingObject: | |
print (self.tilemap[36][19].char) | |
print(objToMove.x + dx, " / " , objToMove.y + dy ," / ", self.tilemap[objToMove.x + dx][objToMove.y + dy].blocked) | |
if not self.tilemap[objToMove.x + dx][objToMove.y + dy].blocked: | |
print("move " ,dx , " / " , dy) | |
objToMove.move(dx,dy) | |
def draw_maze(self,screen): | |
for row in xrange(self.size): | |
for column in xrange(self.size): | |
screen.fill(mazeColorRules[self.tilemap[row][column].char], get_cell_rect(row, column)) | |
def draw_personnages(self,screen): | |
for personnage in self.movingObject: | |
# surface of size up to 20 and resize the rect considering size of cell rect | |
surfPersonnage = personnage.render(20) | |
print(" size of surface " , surfPersonnage.get_size(), " fitted to ", get_cell_rect(personnage.x, personnage.y).size) | |
rectFitted = surfPersonnage.get_rect().fit(get_cell_rect(personnage.x, personnage.y)) | |
print(" size of rect fitted " , rectFitted.size) | |
rectFitted.center = get_cell_rect(personnage.x, personnage.y).center | |
screen.blit(surfPersonnage, rectFitted) | |
class Object(object): | |
def __init__(self, x, y, char, color): | |
self.x = x | |
self.y = y | |
self.char = char | |
self.color = color | |
def move(self, dx, dy): | |
self.x = self.x + dx | |
self.y = self.y + dy | |
def render(self,size): | |
return pygame.font.Font(None, size).render(self.char ,False, self.color) | |
class Case(object): | |
#a tile of the map and its properties | |
def __init__(self, char, blocked): | |
self.blocked = blocked | |
self.char = char | |
def main(): | |
pygame.init() | |
# y, x | |
player = Object(37,20,"@",(155,255,0)) | |
world = Map(mapLoaded) | |
world.movingObject = [player] | |
size = width, height = (2*base_offset)+(world.size*square_pixels), (2*base_offset)+(world.size*square_pixels) | |
screen = pygame.display.set_mode(size) | |
clock = pygame.time.Clock() | |
addColorRules("#", c.cWhite) | |
addColorRules(".", c.cBlack) | |
screen.fill(c.cBlack) | |
while True: | |
for event in pygame.event.get(): | |
if event.type == KEYDOWN: | |
key = event.key | |
if key == K_UP: | |
world.moveObject(-1,0) | |
print("UP") | |
elif key == K_RIGHT: | |
world.moveObject(0, 1) | |
elif key == K_DOWN: | |
world.moveObject(1, 0) | |
elif key == K_LEFT: | |
world.moveObject(0, -1) | |
elif event.type == QUIT: | |
return | |
world.draw_maze(screen) | |
world.draw_personnages(screen) | |
#draw the outer border | |
border_rect = (base_offset, base_offset, (world.size*square_pixels), (world.size*square_pixels)) | |
pygame.draw.rect(screen, c.cGrey, border_rect, 2) | |
#pygame.display.flip() | |
pygame.display.update() | |
clock.tick(40) | |
def get_cell_rect( row, col): | |
off_x = base_offset + col * square_pixels | |
off_y = base_offset + row * square_pixels | |
return pygame.Rect(off_x+4, off_y+4, square_pixels - 6, square_pixels - 6) | |
def addColorRules(char, color): | |
mazeColorRules[char] = color | |
clear = lambda: os.system('clear') | |
if __name__ == "__main__": | |
main() | |
pygame.quit() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment