winapi 배우자마자 테트리스로 예제를 만들어보는데 상당히 어렵네요....
api써서 그래픽 구현이나 그런 건 금방금방 했는데 이젠 그냥 c언어에서 턱하니 막히네요
여기저기 물어봐도 도저히 답이 안 나와서 마지막으로 오유에 글을 써봅니다...ㅠㅠ
오전 6시까진 덧글을 계속 확인할 수 있을 거 같습니다
소스코드 전문입니다, 문제가 되는 함수 부분만 아래 적어뒀습니다
https://gist.github.com/hanalen-/e39e0226c4a5409ed55f
참고를 많이 한 코드
http://soen.kr/lecture/win32api/lec9/lec9-1-1.htm
우선 코드를 설명 드리면
1. 기본 블럭 배열은 4차원 배열
block_shape[블럭 순서, random으로 출력][회전 모양, rot으로 구분][y][x] 이렇게 4차원 배열입니다
2. 기본 화면 배열인 main[y][x]는 구현 완료
3. 블럭 출력하고 돌리는 것까지 구현 완료, 그래픽 출력은 다 구현
4. 블럭의 위치는 전역변수 nowx, nowy로 관리
5. 블럭이 직접 배열에 들어가진 않고 그래픽만 보여주고 배열에는 끝에 다 가면 배열에 저장한다
문제점: 벽 인식을 못 함, 충돌 인식도 못 할 것으로 예상 됨
현재 screen.move_left()함수에서 해당 문제를 테스트 중
끝에 가면 left_fi라는 bool변수에 끝에 갔다는 것을 알리는 값을 넣었었으나
UP_KEY를 인식 했을 경우 left_fi를 초기화 해야하는 것을 알게 되었음
if(left_fi)
return 0;으로 빠져나오도록 조건을 걸었지만 위와 같은 이유로 무의미해짐
해결하려 한 것: 블럭을 다 struct로 만들어서 블럭은 모두 4개의 조합이니 각 블럭에 x,y좌표값을 갖도록 하고
위 키로 모양을 돌릴 떄마다 좌표값을 옮기는 코드를 넣는다
->코드가 비효율적인 거 같아서 폐기
if(j==4 && lieft_fi==0) 으로 작동하게 하려고도 했었으나 실패
int move_left()
{
//충돌체크, 끝인지 체크하는 함수 추가?
//if(nowx==0)
//return 0;
int i,j;
if(check_around(nowx, nowy))
return 0;
//if(main[nowy][nowx] == 0 && block_shape[random][rot][nowy][nowx]==0)
//nowx--;
if(left_fi)
return 0;
if(nowx==0)//왼쪽 끝까지 가면 블럭이 빈칸인지 확인
{
for(i=0; i<4 ; i++)
{
for(j=0; j<4; j++)
{//누를 때마다 for진입해서 nowx--가 무한정 걸리는 문제
if(block_shape[random][rot][j][i]==1)
{ left_fi=1; return 0; }
}
if(j==4 && left_fi==0)
nowx--;
}
return 0;
}
nowx--;
egaku_block(0);
egaku_block(1);
ReleaseDC(sc_hWnd,hdc); /*if(main[nowy][nowx]==0)
//함수 끝