Last active
April 1, 2018 07:49
-
-
Save anirudh-chhangani/9989292 to your computer and use it in GitHub Desktop.
Reformatted Tiny 2048.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
M[16],X=16,W,k; | |
main(){ | |
T(system("stty cbreak")); | |
puts(W&1?"WIN":"LOSE"); | |
} | |
K[]={2,3,1}; | |
s(f,d,i,j,l,P){ | |
for(i=4;i--;) | |
for(j=k=l=0;k<4;) | |
j<4?P=M[w(d,i,j++)],W|=P>>11,l*P&&(f?M[w(d,i,k)]=l<<(l==P):0,k++),l=l?P?l-P?P:0:l:P:(f?M[w(d,i,k)]=l:0,++k,W|=2*!l,l=0); | |
} | |
w(d,i,j){ | |
return d?w(d-1,j,3-i):4*i+j; | |
} | |
T(i){ | |
for(i=X+rand()%X;M[i%X]*i;i--); | |
i?M[i%X]=2<<rand()%2:0; | |
for(W=i=0;i<4;)s(0,i++); | |
for(i=X,puts("\e[2J\e[H");i--;i%4||puts("")) | |
printf(M[i]?"%4d|":" |",M[i]); | |
W-2||read(0,&k,3)|T(s (1,K[(k>>X)%4])); | |
} | |
//[2048] reformated | |
Original Version : https://gist.github.com/justecorruptio/9967738 | |
by : Jay Chan |
The reason why 3 characters are read is that arrow keys generate 3-byte sequences.
Key | bytes | Hex value |
---|---|---|
arrow left | 0x1b, '[', 'D' | 0x1b5b44 |
arrow right | 0x1b, '[', 'C' | 0x1b5b43 |
arrow up | 0x1b, '[', 'A' | 0x1b5b41 |
arrow down | 0x1b, '[', 'B' | 0x1b5b42 |
When the characters are read, the 3-byte sequence actually is reversed.
So for instance, in the last case ('arrow down'), k is assigned 0x425b1b.
k is then used to decide which of the K-array value to use.
k is right-shifted by 16 bits, reducing it to 0x42, so we have K [ 0x042 % 4 ], which is equivalent to K[2], the 3rd element of K[].
Thus, the statement after the read (0, &k, 3) evaluates to calling s (1, 1).
I wonder why K[] does not have 4 values, one for each arrow key.
What is this mate i dont understand this code can u pls help me? I think w,a,s,d doesnt work for example i put w but numbers doesnt went up why?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I don't understand, why read(0,&k,3), the arrow keys only need 2 bytes.