int blocks[7] =
{
011100040, 010010402, 011110000, 011102000, 011010040, 011014000, 011100020,
};
int block_masks[] =
{
000000001, 000000002, 000000004, 000000010,
000004000, 000010000, 000100000, 000000020,
000002000, 010000000, 001000000, 000000040,
000001000, 000000400, 000000200, 000000100,
};
void rotate_cw(int& block)
{
block = ((block << 3) & 011107770) | ((block >> 9) & 000010007);
}
void rotate_ccw(int& block)
{
block = ((block >> 3) & 001110777) | ((block << 9) & 010007000);
}
void draw_block(int block)
{
for(int y = 0; y < 4; ++y)
for(int x = 0; x < 4; ++x)
if(block_masks[x + y * 4] & block)
put_tile(x, y, clWhite);
}
이거보다 간단한 코드 본 사람? 블럭 하나에 24비트 쓴다. 8진수들 잼. 역시 난 좀 기발한듯.
ㅋㅋㅋㅋ - DCW
ㅋㅋㅋ 숏코딩의 달인 인정
제목 웃기다에욬ㅋㅋㅋ - DCW
악ㅋㅋㅋㄱ - DCW
블럭배열 원소부터 이해되질않는데 저게 어째서 일련의 테트리스블럭인지 설명해주지않으시면 미워할겁니다 ㅠㅠ
2진수에서 1비트 움직인 걸 시계방향으로 1칸 회전한 것과 같게 하려고 저런 짓을 한 거임.
엄마 이거 뭐야 무서워.
쉬프트 연산으로 블럭 회전 간단하게 구현하려고.
블럭은 총 7가지.
3비트가 한방향 90도 이동한거야.
그래서 3비트 회전한 건 시계방향으로 90도 회전한 것과 같은데, 그래서 가운데 2x2 블럭은 3비트씩 차이나게 한 거임.
0 1 2 3
코세 성님 다우신 코드네요 ㅋㄷㅋㄷ
11 12 13 4
10 15 14 5
9 8 7 6
ㅇㅇ 달팽이 배열이죠.
이렇게 달팽이 배열처럼 배치를 해서
ㅇㅇ 그걸 3비트 좌우로 돌리면 회전이 되는데 문제는 안쪽이지
안쪽은 270도 돌아버리잖아.
그래서 3비트 단위로 1씩 할당했지.
그래서 3비트 격차를 둔 거겠죠. 저는 보자마자 이해했어요 ㅋㅋ
즉 외부 8개의 블럭에 12비트, 내부 4개의 블럭에 12비트 인거임 똑같이.
보자마자 이해하는 건 쉽지만 저걸 생각해냈다는 거 자체가 아무나 할 수 있는 일은 아닌 듯.
뭐 안쪽은 1비트씩 쉬프트 하게 해줘도 되는뎅 그러면 연산량이 많아지니깐
block_mask 가 달팽이 배열의 x, y 좌표에 해당하는 비트의 위치를 가지고 있어용.
뒤의 & 는 필요없어 지움~
아 바깥쪽 8개 블럭이 아니라 바깥쪽 12개 블럭. 말을 잘못했넹.
00110770인가 블락은 뭘 뜻하는건가여- 자바 장작노예
3비트 쉬프트 << 이방향으로 쉬프트 시키면 왼쪽으로 밀려나갈 비트들을 오른쪽에 채워넣어야 하는데, 그러기 위해서 3비트 시켰을때 유효한 비트들만 마스킹하기 위한 값이야.
& 011107770 은 안쪽 점 111 세개와 바깥쪽 점 111 111 111 9개만 남겨놓고 안쪽 점 1개와 바깥쪽 점 3개 부분은 비우겠다는거지
즉 가로 4칸 세로 4칸의 16개 영역에 블럭이 가득 차 있을때가 011117777 이거든. 거기서 안쪽 1개 바깥쪽 3개 뺀거야. (8비트 octal 표현임)
8비트래 8진수
아하 그렇군요- 자바 장작노예
플밍 배운지 4일됐는데 이해안가면 빠르게 때려치고 다른길찾아야함?
http://autogram.tk/이
중고차 어플리케이션 어떤가요?