求高手解释下这段代码

hnust_CLP 2012-07-22 10:22:50
代码详见: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的呢?我看了好久都没懂。。。。求指教啊。。
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Coder_Y_Jao 2012-07-23
  • 打赏
  • 举报
回复
getch在读取一个功能键或者箭头(方向)键盘时,函数会返回两次,第一次调用返回0或者0xE0,第二次调用返回实际的键值

所以如果你按了向上的方向键,就会得到一个0xE0,再次执行到getch的时候就会得到一个0x48(向上方向键的键值,非ASCII码),其中0x48也就是72, 0xE0就是224,在char中也就是-32,原因:

存储在key(char类型)中后高位被当做符号位,那么将0xE0(11100000)去反加一后为100000(32),符号位为1,所以就是-32

另外:既然要换回两次,所以后面用key1=key;将先前的-32存起来。
赵4老师 2012-07-23
  • 打赏
  • 举报
回复
//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);
}
}
hnust_CLP 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
另外:既然要返回两次,所以后面用key1=key;将先前的-32存起来。
[/Quote]
嗯,还想问一下,既然要用到的只是第二次输入的数据,那么做个计数直接忽略第一次的输入不就好了么?在每一个if条件中都加一个(key1==-32 )是不是有点多此一举呢?将-32存起来有什么意义么?是应该理解为特意要循环两次还是做个计数也可以呢?
hnust_CLP 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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 mus……
[/Quote]
谢谢,学习了。
x363635334 2012-07-22
  • 打赏
  • 举报
回复
我的意思是key1来自上一轮getch()的key
hnust_CLP 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

while(1)本轮末key1=key;下一轮key=getch();
是不是这么执行的?
[/Quote]
好像是。。。然后呢?
x363635334 2012-07-22
  • 打赏
  • 举报
回复
while(1)本轮末key1=key;下一轮key=getch();
是不是这么执行的?
hnust_CLP 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
我的意思是key1来自上一轮getch()的key
[/Quote]
可是通过getch()得到赋值的key可以有复数么?况且我只输入了上下左右四个方向键,key为什么会是-32呢?

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧