Fix typos and optimizations

This commit is contained in:
Nguyễn Gia Phong 2019-10-09 11:15:55 +07:00
parent 622df8c361
commit ef70806a48
3 changed files with 23 additions and 30 deletions

View File

@ -20,7 +20,7 @@
__doc__ = 'Brutal Maze module for hero and enemy classes'
from collections import deque
from math import atan, atan2, sin, pi
from math import atan, atan2, gcd, sin, pi
from random import choice, randrange, shuffle
from sys import modules
@ -28,7 +28,7 @@ from .constants import (
TANGO, HERO_HP, SFX_HEART, HEAL_SPEED, MIN_BEAT, ATTACK_SPEED, ENEMY,
ENEMY_SPEED, ENEMY_HP, SFX_SLASH_HERO, MIDDLE, WALL, FIRANGE, AROUND_HERO,
ADJACENTS, EMPTY, SQRT2, MINW)
from .misc import sign, cosin, randsign, regpoly, fill_aapolygon, choices, play
from .misc import sign, randsign, regpoly, fill_aapolygon, choices, play
from .weapons import Bullet
@ -206,7 +206,7 @@ class Enemy:
if self.awake: self.maze.map[self.x][self.y] = ENEMY
@property
def spawn_volumn(self):
def spawn_volume(self):
"""Volumn of spawning sound effect."""
return 1 - self.distance / self.maze.get_distance(0, 0) / 2
@ -217,24 +217,18 @@ class Enemy:
has just woken it, False otherwise.
"""
if self.awake: return None
startx = starty = MIDDLE
stopx, stopy, distance = self.x, self.y, self.maze.distance
if startx > stopx: startx, stopx = stopx, startx
if starty > stopy: starty, stopy = stopy, starty
dx = (self.x-MIDDLE)*distance + self.maze.centerx - self.maze.x
dy = (self.y-MIDDLE)*distance + self.maze.centery - self.maze.y
mind = cosin(abs(atan(dy / dx)) if dx else 0) * distance
def get_distance(x, y): return abs(dy*x - dx*y) / (dy**2 + dx**2)**0.5
for i in range(startx, stopx + 1):
for j in range(starty, stopy + 1):
if self.maze.map[i][j] != WALL or i == stopx and j == stopy:
continue
x, y = self.maze.get_pos(i, j)
if get_distance(x - self.maze.x, y - self.maze.y) <= mind:
return False
srcx, destx = self.x, MIDDLE
if abs(destx - srcx) != 1: srcx += sign(destx - srcx) or 1
srcy, desty = self.y, MIDDLE
if abs(desty - srcy) != 1: srcy += sign(desty - srcy) or 1
m, n = destx - srcx, desty - srcy
lcm = abs(m * n // gcd(m, n))
w, u = lcm // m, lcm // n
for i in range(lcm):
if self.maze.map[srcx+i//w][srcy+i//u] == WALL: return False
self.awake = True
self.maze.map[self.x][self.y] = ENEMY
play(self.maze.sfx_spawn, self.spawn_volumn, self.get_angle() + pi)
play(self.maze.sfx_spawn, self.spawn_volume, self.get_angle()+pi)
return True
def fire(self):

View File

@ -314,7 +314,7 @@ class Maze:
enemy = new_enemy(self, gridx, gridy)
enemy.awake = True
self.map[gridx][gridy] = ENEMY
play(self.sfx_spawn, enemy.spawn_volumn, enemy.get_angle())
play(self.sfx_spawn, enemy.spawn_volume, enemy.get_angle())
enemy.hit(wound)
self.enemies.append(enemy)
continue
@ -466,7 +466,7 @@ class Maze:
return True
# Forest Fire algorithm with step count
queue = defaultdict(list, {0: [(self.destx, self.desty)]})
queue = [[(self.destx, self.desty)]]
visited, count, distance = set(), 1, 0
while count:
if not queue[distance]: distance += 1
@ -483,8 +483,12 @@ class Maze:
return False
for i, j in around(x, y):
if self.map[i][j] == EMPTY and check(i, j):
queue[distance + 1].append((i, j))
count += 1
try:
queue[distance + 1].append((i, j))
except IndexError:
queue.append([(i, j)])
finally:
count += 1
# Failed to find way to move to target
self.stepx = self.stepy = 0

View File

@ -63,17 +63,12 @@ def sign(n):
def deg(x):
"""Convert angle x from radians to degrees casted to a nonnegative
integer.
"""Convert angle x from radians to degrees,
casted to a nonnegative integer.
"""
return round2((lambda a: a if a > 0 else a + 360)(degrees(x)))
def cosin(x):
"""Return the sum of cosine and sine of x (measured in radians)."""
return cos(x) + sin(x)
def join(iterable, sep=' ', end='\n'):
"""Return a string which is the concatenation of string
representations of objects in the iterable, separated by sep.