BASIC4MCU | 질문게시판 | 아두이노 테트리스 게임
페이지 정보
작성자 지욱애 작성일2023-03-02 15:24 조회418회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22339
첨부파일
본문
아두이노 우도 보드, max7219 8*32 도트 매트릭스와 조이스틱으로 테트리스 게임을 제작중인데,
행렬의 전치(Transpose)를 활용하여 게임을 제작하였습니다. 그런데 이로 인해, 오른쪽 벽에 가까워질수록 혹은 오른쪽 벽에 테트리스 블록이 닿는 경우
회전이 불가능하게 되었습니다. 이를 확인하고 오른쪽 벽에 블록이 닿아도 회전가능하게 하고 싶은데
어떻게 하면 될까요?
제 개인적인 생각으로는 블록이 양옆 벽과 맨 밑줄에서 더 나아가지않고 멈출 수 있도록 하게끔 설정한 함수를 수정하면 될 듯 싶은데 감이 안 잡힙니다.
(테트리스 블록에 대한 배열입니다.)
//piezes[7][4][4] >>> 4*4 배열이 7개int piezes[PIEZES][PIEZED][PIEZED] = {{{1,0,0,0},{1,0,0,0},{1,0,0,0},{1,0,0,0}, //ㅣ Shape Block},{{1,0,0},{1,1,0},{1,0,0}, //ㅜ Shape Block},{{1,1,0},{1,1,0},{0,0,0}, //ㅁ Shape Block},{{1,0,0},{1,0,0},{1,1,0}, //ㄴ Shape Block},{{0,1,0},{0,1,0},{1,1,0}, //Reverse ㄴ Shape Block},{{1,0,0},{1,1,0},{0,1,0}, //Reverse ㄹ Shape Block},{{0,1,0},{1,1,0},{1,0,0}, //ㄹ Shape Block},};(양 옆 벽과 맨 밑줄에서 막히게끔 하는 함수입니다. --> 현재 수정중인 부분이라 감안하고 확인 부탁드립니다 :))//Block's Positionbool validPosition(int mPieze[PIEZED][PIEZED], int destY, int destX){bool valid = true;int x = 0;int y = 0;//ㅜ모양 블록은 오른쪽 벽에서만 문제가 생긴다. (ㅏ와 ㅓ 모양일때)//ㅣ모양 블록은 중간 이후부터 회전이 불가//L모양 블록과 뒤집어진 L모양 블록은 오른쪽 벽에서만 문제가 생긴다.//ㄹ모양 블록과 뒤집어진 ㄹ모양 블록은 세워진 ㄹ형태로 오른쪽 벽에 붙었을 때 문제가 생긴다.//**결과적으로 모든 블록이 오른쪽 벽 근처에서 회전 불가의 문제가 생긴다.**for(int row=destY; row<(PIEZED+destY); row++){for(int col=destX; col<(PIEZED+destX); col++){if (mPieze[y][x] == 1){if(world[row][col] == 1){return false;}//1. 오른쪽 벽 너머로 넘어가는 경우--> 여기를 수정해야한다.if(col>COLS-1){//l모양 블록 //piezes[0][PIEZED][PIEZED]는 piezes[0][4][4]이기 때문에 l모양 블록 배열의 4행 4열 원소를 의미한다.for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[0][i][j]){return false;}}}//ㅜ모양 블록for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[1][i][j]){return false;}}}//L모양 블록for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[3][i][j]){return false;}}}//뒤집어진 L모양 블록for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[4][i][j]){return false;}}}//ㄹ모양 블록for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[5][i][j]){return false;}}}//뒤집어진 ㄹ모양 블록for(int i=0;i<PIEZED;i++){for(int j=0;j<PIEZED;j++){if(world[row][col] == piezes[6][i][j]){return false;}}}}//2. 왼쪽 벽 너머로 넘어가는 경우if(col < 0){return false;}//3. 아래로 뚫고 내려가는 경우if(row > ROWS-1){return false;}}x++;}x = 0;y++;}}
댓글 1
조회수 418master님의 댓글
master 작성일
//1. 오른쪽 벽 너머로 넘어가는 경우--> 여기를 수정해야한다.
회전 시 이 부분만 예를 들어보죠
//1. 오른쪽 벽 너머로 넘어가는 경우--> 몇개가 넘는지 체크해서 왼쪽으로 그 개수만큼 이동
이렇게하면 되지 않을까요?