[pygame] 메모리 퍼즐 - 3

서희찬·2021년 4월 6일
0

계속 이어서 하겠다..

getShapeAndColor(board,boxx,boxy)

def getShapeAndColor(board,boxx,boxy): 
    #x,y 위치의 아이콘 형태의 값은 board[x][y][0]
    #x,y 위치의 아이콘 색의 값은 board[x][y][1]
    return board[boxx][boxy][0], board[boxx][boxy][1]

이런 식 간단한 함수를 짜주어서 코드를 읽기가 더 쉬워지게 한다.

drawBoxCovers(board,boxes,coverage)

def drawBoxCovers(board,boxes,coverage):
    # 닫히거나 열린 상태의 상자를 그린다. 
    # 상자는 아이템 2개짜리 리스트이며 상자의 x,y 위치를 가진다.
    for box in boxes:
        left, top = leftTopCoordsOfBox(box[0],box[1])
        pygame.draw.rect(DISPLAYSURF,BGCOLOR,(left,top,BOXSIZE,BOXSIZE))
        shape, color = getShapeAndColor(board, box[0], box[1])
        drawIcon(shape,color,box[0],box[1])
        if coverage>0: # 닫힌 상태이면 덮개만 그린다. 
            pygame.draw.rect(DISPLAYSURF,BOXCOLOR,(left,top,coverage,BOXSIZE))
    pygame.display.update()
    FPSCLOCK.tick(FPS)

게임판의 데이터구조, 커버를 그려야 하는 상자 각각의 리스트, 그려야 하는 상자의 양을 파라미터로 받는다.

cover/revealBoxAnimation()

def revealBoxesAnimation(board,boxesToReveal):
  #상자가 열리는 애니메인션 수행
  for coverage in range(BOXSIZE,(-REVEALSPEED)-1,-REVEALSPEED):
      drawBoxCovers(board,boxesToReveal,coverage)
      #coverage가 REVEALSPEED 의 속도에 따라 이뤄진다 ! 

def coverBoxesAnimation(board,boxesToCover):
  #상자가 닫히는 애니메이션 수행
  for coverage in range(0,BOXSIZE+REVEALSPEED,REVEALSPEED):
      drawBoxCovers(board,boxesToCover,coverage)

drawBoard(board,revealed)

def drawBoard(board,revealed):
 #모든 상자를 상태에 맞게 그리기
 for boxx in range(BOARDWIDTH):
     for boxy in range(BOARDHEIGHT):
         left, top = leftTopCoordsOfBox(boxx,boxy)
         if not revealed[boxx][boxy]:
             #닫힌 상자를 그린다.
             pygame.draw.rect(DISPLAYSURF,BOXCOLOR,(left,top,BOXSIZE,BOXSIZE))
         else:
             #열린 상자, 즉 아이콘을 그린다.
             shape, color = getShapeAndColor(board,boxx,boxy)
             drawIcon(shape,color,boxx,boxy)

drawIcon 호출 하여 열린상자는 아이콘,닫혀 있는 상자는 하얀색 상자를 그린다.

drawHighlightBox(boxx,boxy)

def drawHighlightBox(boxx,boxy):
  left,top = leftTopCoordsOfBox(boxx,boxy)
  pygame.draw.rect(DISPLAYSURF,HIGHLIGHTCOLOR,(left-5,top-5,BOXSIZE+10,BOXSIZE+10),4)
  

플레이어가 닫혀 있는 상자를 클릭해서 열고자 할 때 상자 주변에 파란색 하이라이트 효과를 준다.

startGameAnimation(board)

def startGameAnimation(board):
    # 무작위로 한 번에 8 개씩 상자를 열어서 보여준다.
    coveredBoxes = generateRevealedBoxesData(False)
    boxes = []
    for x in range(BOARDWIDTH):
        for y in range(BOARDHEIGHT):
            boxes.append((x,y))
    random.shuffle(boxes)
    boxGroups = splitIntoGroupsOf(8,boxes)
    
    drawBoard(board,coveredBoxes)
    for boxGroup in boxGroups:
        revealBoxesAnimation(board,boxGroup)
        coverBoxesAnimation(board,boxGroup)

이를 통해서 8개씩 시작할때 아이콘들을 순차적으로 보여주는 힌트가 진행된다 !

gameWonAnimation(board)

def gameWonAnimation(board):
 #플레이어가 승리하면 배경색을 깜빡인다. ! 
 coveredBoxes = generateRevealedBoxesData(True)
 color1 = LIGHTBGCOLOR
 color2 = BGCOLOR

 for i in range(13):
     color1,color2 = color2,color1 #색을 바꾼다.
     DISPLAYSURF.fill(color1)
     drawBoard(board,coveredBoxes)
     pygame.display.update()
     pygame.time.wait(300)

player가 승리 하였을때 축하 하기위해서 color1 color2를 번갈아가면서 화면에 그린다.

hasWon(revealedBoxes)

def hasWon(revealedBoxes):
    #모든 상자를 열었으면 True 아니면 False
    for i in revealedBoxes:
        if False in i:
            return False # 닫힌 상자가 있으면 False
    return True

이를 통해 플레이어가 승리했는지 알아낼 수 있다.

왜 main 함수를 썼는가?

main() 함수를 작성하고 코드를 그안에 넣는 중요한 두가지가 있다.
1. 전역변수를 쓰는 대신 지역변수를 사용 할 수 있다.
2. 개별 함수를 테스트해 볼 수 있다.

__name(언더바언더바)

if __name__ == '__main__':
  main()

name을 보고 main 함수를 호출 했는지 알 수 있다.
이런 방법을 쓰면 작성한 프로그램의 개별 함수가 제대로 된 반환 값을 돌려주는지 편리하게 테스트해 볼수있다.

코드는 읽기 좋게!!! 쓰는것이 좋다

왜냐하면 소프트웨어가 그냥 그대로 남겨져 있는 일이 거의 없다는 것이다. 내가 게임을 하나 만들고 나서 그대로 두는 일은 거의없다.
게임을 고칠 새로운 아이디어가 생각날 수도 있고, 새로운 버그를 발견할 수 있기에 코드를 쉽게 읽을 수 있고 이해할 수 있게 작성하여야한다..

이제 마무리는 다음 게시글에서 하겠다...

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글