2013-10-07 2 views
0

Я работаю над своей первой игрой на Python, но прежде чем я начну, я работаю над некоторыми учебниками и пытаюсь их модифицировать. Я нашел отличную игру в стиле «bejeweled», в которую я пытаюсь внести некоторые изменения, однако я столкнулся с одной проблемой.Python Случайные условия

В игре обычно используются семь разных изображений. Когда игра начнется, она поместит драгоценные камни в несколько случайный порядок, но она проверит, чтобы убедиться, что она не помещает тонну одних и тех же драгоценных камней рядом друг с другом.

Что я хочу сделать, это значительно увеличить количество изображений до семнадцати. Все изображения загружаются правильно, однако некоторые изображения я хочу ограничить количество раз, когда они появляются. Например, я хочу, чтобы gem1 через gem3 был более распространенным камнем, в то время как все остальные не появлялись так часто. Я думаю о том, чтобы делать что-то вроде случайного. Выберите номер между 1-5. Если выбрано 1-4, будут выбраны либо gem1, gem2, либо gem3. Если выбрать 5, появится любой из других драгоценных камней, но всегда нужно следовать по коду возможного кода, чтобы убедиться, что рядом с ними не появляются куча одних и тех же изображений. Любые идеи о том, как сделать эту работу?

Я включил некоторый код учебника в места, которые являются самыми важными для драгоценных камней. Вы также можете найти полный исходный код, выполнив поиск gemgem.py в google.

possibleGems = list(range(len(GEMIMAGES))) 
      for offsetX, offsetY in ((0, -1), (1, 0), (0, 1), (-1, 0)): 
       # Narrow down the possible gems we should put in the 
       # blank space so we don't end up putting an two of 
       # the same gems next to each other when they drop. 
       neighborGem = getGemAt(boardCopy, x + offsetX, y + offsetY) 
       if neighborGem != None and neighborGem in possibleGems: 
        possibleGems.remove(neighborGem) 

      newGem = random.choice(possibleGems) 
      boardCopy[x][y] = newGem 
      dropSlots[x].append(newGem) 

код для загрузки изображений

# Load the images 
GEMIMAGES = [] 
for i in range(1, NUMGEMIMAGES+1): 
    gemImage = pygame.image.load('gem%s.png' % i) 
    if gemImage.get_size() != (GEMIMAGESIZE, GEMIMAGESIZE): 
     gemImage = pygame.transform.smoothscale(gemImage, (GEMIMAGESIZE, GEMIMAGESIZE)) 
    GEMIMAGES.append(gemImage) 

ответ

0

проще всего было бы что-то вроде этого. В принципе, вместо создания списка, такого как [0,1,2], вы повторяете каждый элемент столько раз, сколько хотите относительной вероятности.

gem_frequency = [10, 8, 7, 3, 1, 1, 1, 1, 1] 
gem_lists = [] 
for index, gf in enumerate(gem_frequency): 
    gem_lists.append([index] * gf) 

gem_prob = chain(*gem_lists) 

gem_prob 
[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,4,5,6,7,8] 

len(gem_prob) 
33 

random.choice(gem_prob) 
0 
1 
0 
3 
1 
3 
8 
0 
2 
4 

Так, вход 2 был указан в качестве частоты 10. Он должен появиться примерно в 10 раз чаще, чем записи 8 (который имеет частоту только 1). Общий вес для них равен 33, а 0 будет выбрано приблизительно 10/33 времени.

Если список слишком длинный, он может потреблять много памяти, но обычно этого достаточно.

или использовать взвешенный выбор так:

A weighted version of random.choice

0

я рекомендую что-то вроде этого, для поддержания распределения аккуратно и легко изменяемые:

gemOptions = [] 
gemOptions += ['red'] * 4 
gemOptions += ['blue'] * 3 
gemOptions += ['green'] * 2 

In [6]: gemOptions 
Out[6]: ['red', 'red', 'red', 'red', 'blue', 'blue', 'blue', 'green', 'green'] 

Тогда вы можете просто сделать

random.choice(gemOptions) 

и у вас есть простой w средний. Вы можете сделать все необходимые проверки ошибок, чтобы гарантировать, что соответствующие драгоценные камни не находятся рядом друг с другом, и если вам нужно выбрать другой случайный камень, вы можете это сделать.

+0

Мне нравится этот подход, но я совершенно не знаком с python и довольно новичок в программировании в целом, поэтому я потерялся, поскольку код такой, как это, принадлежит учебнику, которое я пытаюсь изменить. Кажется, что код хранит каждое изображение драгоценного камня в списке GEMIMAGES и присваивает каждому номеру. Затем он использует эти цифры для проверки правильности совпадения трех (или более). Я не могу понять, как применить этот подход и добавить его в учебную игру, не делая много изменений, которые, скорее всего, закончится тем, что я что-то сломаю. Любые советы о том, как поместить этот код в учебник, чтобы он работал? – Badge

Смежные вопросы