Optimize maze regeneration and show score

This commit is contained in:
Nguyễn Gia Phong 2017-10-17 21:29:03 +07:00
parent 22bb77f918
commit e879dcf58d
4 changed files with 29 additions and 17 deletions

View File

@ -136,7 +136,8 @@ class Enemy:
def draw(self, distance, middlex, middley, color):
"""Draw the enemy, given distance between grids and the middle grid."""
square = regpoly(4, distance / SQRT2, self.angle,
radious = distance/SQRT2 - (self.awake and 2)
square = regpoly(4, radious, self.angle,
*self.pos(distance, middlex, middley))
fill_aapolygon(self.surface, square, color)

View File

@ -32,7 +32,8 @@ FPS = 30
SIZE = 400, 400
MAZE_SIZE = 10
ROAD_WIDTH = 5
MIDDLE = (MAZE_SIZE + (MAZE_SIZE&1) - 1)*ROAD_WIDTH + (ROAD_WIDTH >> 1)
CELL_WIDTH = ROAD_WIDTH * 2
MIDDLE = (MAZE_SIZE + MAZE_SIZE%2 - 1)*ROAD_WIDTH + ROAD_WIDTH//2
LAST_ROW = (MAZE_SIZE-1) * ROAD_WIDTH * 2
INIT_SCORE = 208.2016
MOVE_SPEED = 5 # step/grid

View File

@ -26,7 +26,6 @@ from .maze import Maze
def main():
"""Start game and main loop."""
pygame.init()
pygame.display.set_caption('Brutal Maze')
pygame.display.set_icon(ICON)
pygame.fastevent.init()
maze, going, clock = Maze(SIZE), True, pygame.time.Clock()

View File

@ -132,23 +132,13 @@ class Maze:
if x:
self.offsetx = 0
self.map.rotate(x)
self.rotatex = (self.rotatex+x) % (ROAD_WIDTH*2)
self.rotatex += x
if y:
self.offsety = 0
for d in self.map: d.rotate(y)
self.rotatey = (self.rotatey+y) % (ROAD_WIDTH*2)
if not self.rotatex and not self.rotatey:
for _ in range(ROAD_WIDTH * 2): self.map.pop()
self.map.extend(new_column())
for i in range(MAZE_SIZE):
b = getrandbits(1)
for j, grid in enumerate(cell(b)):
for k in range(ROAD_WIDTH):
self.map[i*2*ROAD_WIDTH+k][LAST_ROW + j] = grid
for j, grid in enumerate(cell(b, False)):
for k in range(ROAD_WIDTH):
self.map[(i*2+1)*ROAD_WIDTH+k][LAST_ROW + j] = grid
self.rotatey += y
# Respawn the enemies that fall off the display
killist = []
for i, enemy in enumerate(self.enemies):
enemy.place(x, y)
@ -158,6 +148,25 @@ class Maze:
for i in reversed(killist): self.enemies.pop(i)
self.add_enemy()
# Regenerate the maze
if abs(self.rotatex) == CELL_WIDTH:
self.rotatex = 0
for _ in range(CELL_WIDTH): self.map.pop()
self.map.extend(new_column())
for i in range(-CELL_WIDTH, 0):
self.map[i].rotate(self.rotatey)
if abs(self.rotatey) == CELL_WIDTH:
self.rotatey = 0
for i in range(MAZE_SIZE):
b, c = getrandbits(1), (i-1)*CELL_WIDTH + self.rotatex
for j, grid in enumerate(cell(b)):
for k in range(ROAD_WIDTH):
self.map[c + k][LAST_ROW + j] = grid
c += ROAD_WIDTH
for j, grid in enumerate(cell(b, False)):
for k in range(ROAD_WIDTH):
self.map[c + k][LAST_ROW + j] = grid
def slash(self):
"""Slash the enemies."""
unit, killist = self.distance/SQRT2 * self.hero.speed, []
@ -218,7 +227,9 @@ class Maze:
if d <= self.slashd:
self.hero.wound += (self.slashd-d) / self.hero.R / enemy.speed
pygame.display.flip()
if self.hero.wound + 1 >= len(self.hero.color): self.lose()
pygame.display.set_caption('Brutal Maze - Score: {}'.format(
int(self.score - INIT_SCORE)))
if self.hero.wound + 1 > len(self.hero.color): self.lose()
def resize(self, w, h):
"""Resize the maze."""