2013-10-07 2 views
0

저는 첫 번째 파이썬 게임을 작업 중이지만 시작하기 전에 자습서를 통해 수정하려고합니다. 나는 하나의 문제를 겪고 있지만 위대한 "보석으로 장식 한"스타일의 게임을 발견했다.Python 임의 조건

게임에는 일반적으로 7 개의 이미지가 사용되었습니다. 게임이 시작될 때, 그것은 보석을 다소 무작위 순서로 놓았을 것이지만, 같은 보석을 서로 옆에 놓지 않았는지 확인했습니다.

내가하고 싶은 일은 이미지 수를 17 개로 크게 늘리는 것입니다. 모든 이미지가 올바르게로드되지만 일부 이미지는 표시 횟수를 제한하려고합니다. 예를 들어, gem1부터 gem3까지를보다 일반적인 보석으로 만들고, 다른 모든 것들은 자주 표시하지 않습니다. 나는 무작위를 사용하는 것과 같은 것을하려고 생각하고있다. 1-5 사이의 번호를 선택하십시오. 1-4가 선택되면 gem1, gem2 또는 gem3 중 하나가 선택됩니다. 5가 선택되면 다른 보석 중 하나가 표시되지만 동일한 이미지의 묶음이 서로 옆에 나타나지 않도록 항상 가능한 보석 코드를 따라야합니다. 이 방법을 만드는 방법에 대한 아이디어가 있습니까?

나는 보석에 가장 중요한 장소에 자습서 코드를 포함시켰다. Google에서 gemgem.py를 검색하여 전체 소스 코드를 검색 할 수도 있습니다.

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 그것은 자주 (단지 하나의 주파수를 갖는) 항목 (8)의 약 10 배 나타나야 주파수 10로 표시 하였다. 이들의 총 가중치는 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

나는이 접근법을 좋아하지만 파이썬에 완전히 익숙하지 않으며 전체적으로 프로그래밍에 익숙하지 않으므로 수정하려고하는 튜토리얼에 속한 코드가 손실되었다. 코드는 각 보석 이미지를 GEMIMAGES 목록에 저장하고 각 이미지에 숫자를 할당합니다. 그런 다음이 숫자를 사용하여 3 개 (또는 그 이상)의 정확한 일치가 발생했는지 확인합니다. 이 방법을 사용하여 튜토리얼 게임에 추가하는 방법을 이해할 수 없습니다. 이 코드를 튜토리얼에 삽입하여 실행하는 방법에 대한 조언이 있으십니까? – Badge

관련 문제