首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求高手解释上这段代码

2012-08-22 
求高手解释下这段代码代码详见:http://www.2cto.com/kf/201111/111182.html是一段C语言的俄罗斯方块,其中m

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

热点排行