[군대 사이버 지식 정보방 프로젝트]Pygame Tetris

윤태웅·2021년 12월 24일
1

프로젝트

목록 보기
4/12

개요

때는 2020년 7월, 내가 공군 상병 3호봉이었을 시절에 나는 엄청나게 코딩이 하고싶었다.
하지만, 군인 신분으로 코딩을 하기에는 많은 제약 사항이 있다.
1. 시간 부족, 평일에 일과를 마치고 주어지는 자유시간은 기본 3시간에 연등시간을 합치면 5시간정도 된다.
2. 툴 사용 제약, 사이버 지식 정보방에서만 pc를 사용할 수 있는데, 이 pc는 pc방 pc처럼 사용이 끝나면 c드라이브가 싹 밀려버린다.. 그래서 d드라이브에 몰래 코딩용 툴을 설치했다가 그것도 걸려가지고 삭제당한 사건이 있다..

이런 제약사항을 고려해서 어떻게 코딩을 할 수 있을지 깊은 생각을 했다.
시간 부족->(python이라는 쉬운 언어를 이용해서 생산성을 높여보자)
툴 사용 제약->(온라인 IDE사이트에서 개발을 해보자)
이런 결론에 이르러 repl.it라는 사이트에서 python언어로 pygame모듈을 이용하여 tetris게임 개발을 시작했다.

프로젝트 소개


깃허브 링크
약 일주일동안 하루 2-3시간씩 만든것 치고 결과물이 꽤 잘나왔다. 테트리스로서 들어가야할 필수 기능들도 모두 구현했다.

핵심기능

테트로미노 가방

테트로미노는 테트리스에서 4개의 정사각형으로 이루어진 7가지 종류의 블럭형태를 말한다. 이 테트로미노는 랜덤하게 대기열에 추가되는 것이 아닌 특정 규칙에 의해 추가된다. 테트리스 게임에서는 이 규칙을 '가방'이라고 한다. 이 규칙은 플레이할때 7번 테트로미노를 쌓는다면 모든 테트로미노가 한번씩 사용되어야 한다는 규칙이다. 7개의 테트로미노를 가진 'bag'이라는 배열을 만들고 배열의 요소를 1개씩 pop()하고 만약 'bag'이 비어있다면 새로 7개의 테트로미노를 추가하고 shuffle()하는 방식으로 이 규칙을 구현했다.

홀드

테트리스는 현재 미노를 사용하기 싫을때 킵해놓을수 있는 '홀드' 기능이 존재한다. 테트로미노의 순서를 queue로 만들고 queue의 맨앞 미노와 홀드미노를 교체하는 식으로 이 기능을 구현했다.

SRS(Super Rotating System)

링크
SRS는 테트로미노가 회전한 후 어느 좌표에 테트로미노가 존재해야 하는지에 대한 규칙이다. 이 규칙에 의해 T스핀 더블,T스핀 트리플,L스핀 등 다양한 고인물 기술로 파생된다. 나는 공식 사이트의 문서를 천천히 읽고 SRS를 모두 만족하는 코드를 짜는데 성공했다. 문서화되어있는 규칙을 코드로 옮기는 작업은 처음이라 신선했다. 핵심 알고리즘은 'Wall-Kick'이다. 미노를 원래 의도대로 회전했을때 이미 회전할 공간이 다른 미노에 의해 막혀있다면? SRS문서에 작성된 표대로 좌표를 이동하는 알고리즘이 작동한다. 벽에 막혔을때 빈곳을 찾는다는 뜻에서 'Wall-Kick'이라는 이름이 붙은 것 같다.

DAS(Delayed Auto Shift),ARR(Auto Repeat Rate)

DAS(Delayed Auto Shift)는 게임이 왼쪽 이동/오른쪽 이동 키를 길게 누른 것으로 판정할 때까지 키를 눌러야 하는 시간이다.
ARR(Auto Repeat Rate)는 왼쪽 이동/오른쪽 이동 키를 길게 누르면 블록이 자동으로 왼쪽/오른쪽으로 이동하는데, 이때 블록이 다음 칸으로 이동할 때까지 걸리는 시간이다.
pygame은 프레임단위로 게임을 업데이트 하기에 DAS,ARR용 Const변수를 만들어서 업데이트문에 분기를 생성해서 간단하게 기능을 구현했다.

결론

군대에서 코딩하고 싶다는 열정으로 진행했던 프로젝트였던 만큼 동기부여가 정말 엄청났던 생각이 든다. 언젠가 슬럼프가 왔을때 이 글을 보고 이 때의 열정을 다시 느끼게 되면 정말 좋을 것 같다.

0개의 댓글