|
|
La Taberna Un lugar para conversar sobre casi cualquier tema |
![]() |
|
Thread Tools | Display Modes |
![]() |
#1 |
Count
![]() ![]() ![]() ![]() ![]() Join Date: May 2007
Posts: 1,452
![]() ![]() ![]() |
![]() Code:
import curses FOV_RADIUS = 10 dungeon = ["###########################################################", "#...........#.............................................#", "#...........#........#....................................#", "#.....................#...................................#", "#....####..............#..................................#", "#.......#.......................#####################.....#", "#.......#...........................................#.....#", "#.......#...........##..............................#.....#", "#####........#......##..........##################..#.....#", "#...#...........................#................#..#.....#", "#...#............#..............#................#..#.....#", "#...............................#..###############..#.....#", "#...............................#...................#.....#", "#...............................#...................#.....#", "#...............................#####################.....#", "#.........................................................#", "#.........................................................#", "###########################################################"] class Map(object): # Multipliers for transforming coordinates to other octants: mult = [ [1, 0, 0, -1, -1, 0, 0, 1], [0, 1, -1, 0, 0, -1, 1, 0], [0, 1, 1, 0, 0, -1, -1, 0], [1, 0, 0, 1, -1, 0, 0, -1] ] def __init__(self, map): self.data = map self.width, self.height = len(map[0]), len(map) self.light = [] for i in range(self.height): self.light.append([0] * self.width) self.flag = 0 def square(self, x, y): return self.data[y][x] def blocked(self, x, y): return (x < 0 or y < 0 or x >= self.width or y >= self.height or self.data[y][x] == "#") def lit(self, x, y): return self.light[y][x] == self.flag def set_lit(self, x, y): if 0 <= x < self.width and 0 <= y < self.height: self.light[y][x] = self.flag def _cast_light(self, cx, cy, row, start, end, radius, xx, xy, yx, yy, id): "Recursive lightcasting function" if start < end: return radius_squared = radius*radius for j in range(row, radius+1): dx, dy = -j-1, -j blocked = False while dx <= 0: dx += 1 # Translate the dx, dy coordinates into map coordinates: X, Y = cx + dx * xx + dy * xy, cy + dx * yx + dy * yy # l_slope and r_slope store the slopes of the left and right # extremities of the square we're considering: l_slope, r_slope = (dx-0.5)/(dy+0.5), (dx+0.5)/(dy-0.5) if start < r_slope: continue elif end > l_slope: break else: # Our light beam is touching this square; light it: if dx*dx + dy*dy < radius_squared: self.set_lit(X, Y) if blocked: # we're scanning a row of blocked squares: if self.blocked(X, Y): new_start = r_slope continue else: blocked = False start = new_start else: if self.blocked(X, Y) and j < radius: # This is a blocking square, start a child scan: blocked = True self._cast_light(cx, cy, j+1, start, l_slope, radius, xx, xy, yx, yy, id+1) new_start = r_slope # Row is scanned; do next row unless last square was blocked: if blocked: break def do_fov(self, x, y, radius): "Calculate lit squares from the given location and radius" self.flag += 1 for oct in range(8): self._cast_light(x, y, 1, 1.0, 0.0, radius, self.mult[0][oct], self.mult[1][oct], self.mult[2][oct], self.mult[3][oct], 0) def display(self, s, X, Y): "Display the map on the given curses screen (utterly unoptimized)" dark, lit = curses.color_pair(8), curses.color_pair(7) | curses.A_BOLD for x in range(self.width): for y in range(self.height): if self.lit(x, y): attr = lit else: attr = dark if x == X and y == Y: ch = '@' attr = lit else: ch = self.square(x, y) s.addstr(y, x, ch, attr) s.refresh() def color_pairs(): c = [] for i in range(1, 16): curses.init_pair(i, i % 8, 0) if i < 8: c.append(curses.color_pair(i)) else: c.append(curses.color_pair(i) | curses.A_BOLD) return c if __name__ == '__main__': try: s = curses.initscr() curses.start_color() curses.noecho() curses.cbreak() color_pairs() s.keypad(1) x, y = 36, 13 map = Map(dungeon) while True: map.do_fov(x, y, FOV_RADIUS) map.display(s, x, y) k = s.getch() if k == 27: break elif k == 259: y -= 1 elif k == 258: y += 1 elif k == 260: x -= 1 elif k == 261: x += 1 finally: s.keypad(0) curses.echo() curses.nocbreak() curses.endwin() print "Normal termination."
__________________
⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺ |
![]() |
![]() |
![]() |
#2 |
Pledge
Join Date: Jul 2008
Posts: 17
![]() |
![]()
eeing??????? p-p-perdon-n??????
__________________
tel'nar, Cazador nv 40 retirado temporalmente ZAS EN TODA LA BOCA!- Oh! un caramelo "Estas VERDE de envidia? ROJO de odio?. Resignate, solo algunos tenemos la sangre AZUL "ALSIUS:TU LUGAR, POCOS, PERO BUENOS" ![]() |
![]() |
![]() |
![]() |
#3 |
Banned
![]() ![]() ![]() Join Date: Mar 2008
Location: Traficando con chimerin
Posts: 264
![]() |
![]()
Yo lo haria pero no quiero (?)
![]() |
![]() |
![]() |
![]() |
#4 |
Banned
![]() ![]() ![]() ![]() ![]() Join Date: Mar 2008
Location: Everywhere even in your dreams :p
Posts: 1,032
![]() |
![]()
Si no es lenguaje C le pego en el palo.
P.D: Lo hago a la noche y despues les cuento si me salio |
![]() |
![]() |
![]() |
#5 | |
Initiate
![]() ![]() Join Date: Nov 2007
Location: Cerca de la casa de Dvl
Posts: 189
![]() |
![]() Quote:
![]()
__________________
Hallr - Tirador
|
|
![]() |
![]() |
![]() |
#6 |
Duke
![]() ![]() Join Date: Jan 2007
Posts: 3,939
![]() ![]() ![]() |
![]()
jajaj que chulo está! eso es uno de los roguelike esos? ahora lo miró con detenimiento
![]()
__________________
"Nunca un científico ha quemado a un religioso por afirmar a Dios sin pruebas". Manuel Toharia "uno empieza a darse cuenta que eso de no hacer ejercicio, comer y beber como si fuese la ultima cena y mantener la figura ya no existe...". Maryan |
![]() |
![]() |
![]() |
#7 | |
Count
![]() ![]() ![]() ![]() ![]() Join Date: May 2007
Posts: 1,452
![]() ![]() ![]() |
![]() Quote:
ssh crawl.akrasiac.org -l joshua La contraseña es joshua, ahí podes jugar online.
__________________
⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺ |
|
![]() |
![]() |
![]() |
#8 | |
Initiate
![]() ![]() Join Date: Nov 2007
Location: Cerca de la casa de Dvl
Posts: 189
![]() |
![]() Quote:
__________________
Hallr - Tirador
|
|
![]() |
![]() |
![]() |
#9 | |
Pledge
Join Date: Jul 2008
Posts: 17
![]() |
![]() Quote:
__________________
tel'nar, Cazador nv 40 retirado temporalmente ZAS EN TODA LA BOCA!- Oh! un caramelo "Estas VERDE de envidia? ROJO de odio?. Resignate, solo algunos tenemos la sangre AZUL "ALSIUS:TU LUGAR, POCOS, PERO BUENOS" ![]() |
|
![]() |
![]() |
![]() |
#10 |
Banned
![]() ![]() Join Date: Mar 2008
Location: Vivo en el foro.¡¡Que alguien me pase una almohada!!
Posts: 100
![]() |
![]()
Es un HOYGAN + L4MM3R, Voy a intentar comunicarme.
0|4 HYB3CyNJ, Z0i r0|Dy3r, 4|gvn0z n0 3nt3nD3m0z 3zt3 p0Zt, 3Xplyk4n0zl0 kv4nD0 Pv3D4z X f4b0r ![]() |
![]() |
![]() |
![]() |
|
|