读书人

求高手解释上这段代码

发布时间: 2012-08-22 09:50:34 作者: rapoo

求高手解释下这段代码
代码详见: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存起来。

读书人网 >C语言

热点推荐