求高手解释下这段代码
代码详见:http://www.2cto.com/kf/201111/111182.html
是一段C语言的俄罗斯方块,其中main()里面有这么一段(最下面):
key=getch();
if(key1==-32 && key==72){
int tmp=id;
id++;
if( id%4==0 && id!=0 )id=id-4;
if(judge_in(cur_x,cur_y,id)!=1)id=tmp;
}
else if(key1==-32 && key==80 && judge_in(cur_x+1,cur_y,id)==1)cur_x++;
else if(key1==-32 && key==75 && judge_in(cur_x,cur_y-1,id)==1)cur_y--;
else if(key1==-32 && key==77 && judge_in(cur_x,cur_y+1,id)==1)cur_y++;
else if(key==27)return 0;
key1=key;
我的问题是,除了引用段之外,没有代码还涉及key和key1两个变量,引用代码中是如何让key1的值为-32的呢?我看了好久都没懂。。。。求指教啊。。
[解决办法]
- C/C++ code
//The _getch function reads a single character from the console without echoing.//Function can not be used to read CTRL+Break.//When reading a function key or an arrow key,//_getch must be called twice; the first call returns 0 or 0xE0,//and the second call returns the actual key code.#include <conio.h>#include <windows.h>void main() { unsigned short k; while (1) { Sleep(100); k=getch(); if (27==k) break;//按Esc键退出 if (0==k||0xe0==k) k|=getch()<<8;//非字符键 cprintf("%04x pressed.\r\n",k); }}
[解决办法]
getch在读取一个功能键或者箭头(方向)键盘时,函数会返回两次,第一次调用返回0或者0xE0,第二次调用返回实际的键值
所以如果你按了向上的方向键,就会得到一个0xE0,再次执行到getch的时候就会得到一个0x48(向上方向键的键值,非ASCII码),其中0x48也就是72, 0xE0就是224,在char中也就是-32,原因:
存储在key(char类型)中后高位被当做符号位,那么将0xE0(11100000)去反加一后为100000(32),符号位为1,所以就是-32
另外:既然要换回两次,所以后面用key1=key;将先前的-32存起来。