2013-11-24 1 views
2

게임의 규칙에 따라 Python 3.3.3에서 Samegame/Candy Crush 복제를 만들고 있는데, 여러 셀이 지워졌을 때 위에 있었던 사람들은 빈 공간을 채우기 위해 "떨어지다".목록 아래에 공백이있는 모든 요소를 ​​한 줄에 놓으십시오.

는 기본적으로 I는 다음과 같습니다 뭔가가 있습니다

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
----------------------------------------------- 
1 |@ @ # & @ @ @ @ @ & & @ # @ & |1 
2 |@ # & @ & @ @ & @ # & & & @ & |2 
3 |@ & # @ & & @ @ & # & & # # & |3 
4 |  @ # & & # & # @ # @ @ @ & |4 
5 |  & @  & # # # @ & @ @ & |5 
6 |&    & & # & @ # @ # & @ |6 
7 |@ @  &  & & & @ @ & # & & |7 
8 |@  & @  & & & & @ @ # @ @ |8 
9 |@  @ @  & @ @ # # @ # # # |9 
10|# @ @ & & & # & # # & @ & # # |10 
----------------------------------------------- 
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

을 그리고는이처럼 보이게하려면 :

: 여기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
----------------------------------------------- 
1 |     @ @ @ & & @ # @ & |1 
2 |   &  @ & @ # & & & @ & |2 
3 |@  @  @ @ & # & & # # & |3 
4 |@  # @  # & # @ # @ @ @ & |4 
5 |@  & # @ @ & # # # @ & @ @ & |5 
6 |& @ # @ & @ & # & @ # @ # & @ |6 
7 |@ # @ & & & & & & @ @ & # & & |7 
8 |@ & & & & & & & & & @ @ # @ @ |8 
9 |@ @ @ @ @ & & @ @ # # @ # # # |9 
10|# @ @ & & & # & # # & @ & # # |10 
----------------------------------------------- 
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

내가 이것을 달성해야하는 코드
game = [ 
    ['@','@','#','&','@','@','@','@','@','&','&','@','#','@','&'], 
    ['@','#','&','@','&','@','@','&','@','#','&','&','&','@','&'], 
    ['@','&','#','@','&','&','@','@','&','#','&','&','#','#','&'], 
    ['#','#','@','#','&','&','#','&','#','@','#','@','@','@','&'], 
    ['#','#','&','@','#','#','&','#','#','#','@','&','@','@','&'], 
    ['&','#','#','#','#','&','&','#','&','@','#','@','#','&','@'], 
    ['@','@','#','&','#','#','&','&','&','@','@','&','#','&','&'], 
    ['@','#','#','&','@','#','&','&','&','&','@','@','#','@','@'], 
    ['@','#','@','@','#','#','&','@','@','#','#','@','#','#','#'], 
    ['#','@','@','&','&','&','#','&','#','#','&','@','&','#','#'] 
] # Of course during the game, this board won't stay the same 

def collapse_board(): 
    for i in range(1, 15): 
     empty = 9 
     full = empty 
     while empty >= 0 and full >= 0: 
      while empty >= 0 and game[empty][i] != ' ': 
       empty -= 1 
      if empty >= 0: 
       full = empty - 1 
       while full >= 0 and game[full][i] == ' ': 
        full -= 1 
       if full >= 0: 
        game[empty][i] = game[full][i] 
        game[full][i] 

결과 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
----------------------------------------------- 
1 |@ @ # & @ @ @ @ @ & & @ # @ & |1 
2 |@ # & @ & @ @ & @ # & & & @ & |2 
3 |@ & # @ & & @ @ & # & & # # & |3 
4 | & @ # & & # & # @ # @ @ @ & |4 
5 | & & @ & & & # # # @ & @ @ & |5 
6 |& & & # & & & # & @ # @ # & @ |6 
7 |@ @ & & & & & & & @ @ & # & & |7 
8 |@ @ & & @ & & & & & @ @ # @ @ |8 
9 |@ @ @ @ @ & & @ @ # # @ # # # |9 
10|# @ @ & & & # & # # & @ & # # |10 
----------------------------------------------- 
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

도움을 주시면 감사하겠습니다.

답변

0

사용중인 데이터 구조로 인해 문제가 악화되었습니다. 인쇄에 적합하지만 수행하려는 작업을 수행하는 데 특히 적합하지 않습니다.

행 및 열 작업을 지원하는 데이터 구조를 사용하거나 작성해야합니다. numpyarray을 사용하여이 데이터를 저장 한 다음 조각 작업으로 조작 할 수 있습니다.

0

언급 한 바와 같이 목록의 목록으로 인해 열을 쉽게 변경할 수는 없습니다. 한 가지 방법은 특히 효율적이지만 편리하지는 않지만 game을 조 변경하여 열이 행이되고 행을 변경 한 다음 다시 조 변경하는 것입니다. (열에 대해서만 이런 종류의 연산을 수행한다면 어쩌면 행렬을 옮겨 저장하는 것이 합리적 일 것입니다.) 여러분이 모든 것을 클래스로 감싸고 싶지 않더라도 get_columnset_column과 같은 유틸리티 함수를 작성할 수 있습니다 그래서 당신은 논리를 반복해서 지킬 필요가 없을 것입니다.

그 중 하나를 수행하지 않고,하지만, 붕괴 로직은 여전히 ​​많은 간단하게 만들 수 있습니다 :

def collapse(vec, empty_marker=' '): 
    nonempty = [x for x in vec if x != empty_marker] 
    padded = [empty_marker]*(len(vec)-len(nonempty)) + nonempty 
    return padded 

for col_ind in range(len(game[0])): 
    col = [row[col_ind] for row in game] 
    collapsed = collapse(col) 
    for row, to_set in zip(game, collapsed): 
     row[col_ind] = to_set   

collapse

모든 비어 있지 않은 세포를 수집 한 다음 시작 빈 마커의 오른쪽 숫자를 추가합니다 그것을 채우기 위해.

>>> collapse(list("ABC D EF")) 
[' ', ' ', 'A', 'B', 'C', 'D', 'E', 'F'] 

큰 격자의 경우 (알고리즘 적으로) 속도가 느려지더라도 정렬 할 수 있으며 너무 귀여울 수 있습니다. key 인수를 sortedFalse == 0True == 1에 전달할 수 있다는 이점이 있습니다. 그래서 당신은 당신이 먼저 원하는 것을 위해 False 인 조건 뭔가를 할 경우, 그것은 당신이 찾고있는 무엇을 줄 것이다 : 내가 볼

>>> sorted("ABC D EF", key=lambda x: x != " ") 
[' ', ' ', 'A', 'B', 'C', 'D', 'E', 'F'] 
+0

, 나는 더 많은 통해 내 데이터 구조를 생각해야했습니다. 도와 줘서 고마워, 많이 배웠어. – Mootjeuh

관련 문제