Optimized pick-random-elements-from-list method.

This commit is contained in:
Niels Serup
2012-08-10 11:27:36 +02:00
parent 9860036860
commit 1f552640e5
4 changed files with 31 additions and 22 deletions

View File

@@ -33,6 +33,7 @@ import random
import itertools
from robotgame.logic.direction import *
import robotgame.logic.rollingstone as rstone
import robotgame.misc as misc
class Mirror(object):
pass
@@ -81,18 +82,16 @@ def generate_simple_playfield(nmirrors):
succs = (lambda s: lambda d: succ(s(d)))(succs)
source_direc = succ(source_direc)
emptys = set(itertools.product(range(12), range(12))) \
- set(playfield.keys())
emptys = set([(0, y) for y in range(12)]
+ [(11, y) for y in range(12)]
+ [(x, 0) for x in range(12)]
+ [(x, 11) for x in range(12)])
for _ in range(nlevers):
if not emptys:
raise Exception("Not enough space for all levers!")
pos = random.choice(list(emptys))
emptys = list(
set([(0, y) for y in range(12)]
+ [(11, y) for y in range(12)]
+ [(x, 0) for x in range(12)]
+ [(x, 11) for x in range(12)])
- set(playfield.keys()))
if len(emptys) < nlevers:
raise Exception("Not enough space for all levers!")
for pos in misc.pick_random_elements(emptys, nlevers):
playfield[pos] = Lever
emptys.remove(pos)
return playfield
def _adjust(source_direc, w, h, x, y):