C语言里的方向键问题

ccnyou 2010-06-07 05:33:22
看到两捕获按键的程序,已知都是正确的,但键码却不一样(同机测试):

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
void main()
{
char key;
while(1)
{
key=getch();
switch(key)
{
case -32:
key=getch();
switch(key)
{
case 72:
printf("up\n");break;
case 80:
printf("down\n");break;
case 75:
printf("left\n");break;
case 77:
printf("right\n");break;
case -123:
printf("F11\n");break;
case -122:
printf("F12\n");break;
default:
printf("%x,%d,%c\n",t,t,t);break;
}
break;
default:
printf("%x,%d,%c\n",t,t,t);break;
}
}
}



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define KEY_UP 80
#define KEY_DOWN 72
#define KEY_LEFT 77
#define KEY_RIGHT 75
#define NEW_GAME 'n'

//省略无关代码
if(key!=-32) continue; //不是方向键
key=getch();
switch(key)
{
//测试按键
case KEY_DOWN: //按下
if(pos<=5) change(pos,pos+3);
break;
case KEY_UP: //按上
if(pos>=3) change(pos,pos-3);
break;
case KEY_LEFT: //按左
if(pos%3!=0) change(pos,pos-1);
break;
case KEY_RIGHT: //按右
if(pos%3!=2) change(pos,pos+1);

break;
}


为什么??
我用第一个的代码放到第二个反而出错!
...全文
624 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccnyou 2010-06-08
  • 打赏
  • 举报
回复
感谢9L和所有回帖的朋友!明白了!
cj83111 2010-06-07
  • 打赏
  • 举报
回复
UP!!!
happytang 2010-06-07
  • 打赏
  • 举报
回复
这不就对了嘛
实际上游戏程序的方向键输入与空格移动方向是相反的;程序中是标识空格移动方向和计算空格位置
pos

0 1 2
3 4 5
6 7 8
ccnyou 2010-06-07
  • 打赏
  • 举报
回复
哦,明白了点!可是他应该是左右不换上下换才对啊?
budweiser 2010-06-07
  • 打赏
  • 举报
回复
你看到的效果是正确的, 不是很奇怪。 在某些情况下,上下翻转是要相反处理的, 比如我要显示内存中的一屏图片或文本, 其坐标系是X向右,Y向上, 但是屏幕坐标系是Y向下的, 所以在处理滚动的时候是需要反向处理的。
ccnyou 2010-06-07
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
int getrand(int x,int y);
void gotoxy(int x,int y);
void NewGame();
int GetTheNull();
void Change(int a,int b);
void Update();
int IsSuccess();
#define KEY_UP 80
#define KEY_DOWN 72
#define KEY_LEFT 77
#define KEY_RIGHT 75
#define NEW_GAME 'n'
#define QUIT 'q'
int num[]={1,2,3,4,5,6,7,8,0};
//方块的数字
void main()
{
char key=0; //键盘码
int pos; //九格中,空格的位置
system("color 1f"); //设置背景为蓝,文字为白.
system("cls"); //清屏
NewGame();
while(1)
{
key=getch(); //获得键盘输入
if(key!=-32) continue; //不是方向键
pos=GetTheNull(); //得到空格
key=getch();
switch(key)
{
//测试按键
case KEY_DOWN: //按下
if(pos<=5) Change(pos,pos+3);
break;
case KEY_UP: //按上
if(pos>=3) Change(pos,pos-3);
break;
case KEY_LEFT: //按左
if(pos%3!=0) Change(pos,pos-1);
break;
case KEY_RIGHT: //按右
if(pos%3!=2) Change(pos,pos+1);
break;
case NEW_GAME: //按下‘n’新建游戏
NewGame();
break;
case QUIT:
return;
}
Update(); //更新
if(IsSuccess())
{
//看是否游戏成功
gotoxy(26,10); //成功了,输出一个写有Well done!的外框
printf("\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2"); //15个\x2.
gotoxy(26,11);
printf("\x2 \x2"); //12个空格+2个 \x2
gotoxy(26,12);
printf("\x2 Well Done! \x2");
gotoxy(26,13);
printf("\x2 \x2");
gotoxy(26,14);
printf("\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\n");
getch();
NewGame(); //新游戏
}
}
system("cls"); //清屏
}


void NewGame()
{
/*新建游戏,实际上就是把有数字的八个方格打散,
这种效果的实现就是随机的两两交换,而怎么不与空的那个交换呢?
这涉及有没有解的问题
不管怎么样,九格游戏最后的结果只有两个:
123 | 123
456 | 456
78 | 87 (证明从略)
而要两两交换而始终有解的话,(从原序列开始)必须:相邻交换的次数为偶
但我们用一种更有效的方法:
每一个总与其下第二个交换
第7,8个与0,1交换,只要交换次数多,仍可获得相同的效果
而这些的前提是其中的0不能与其第奇数个作奇数次交换
为了省事,不处理0..
其中产道理,请自己思考
*/
//以上是网上原文
int i,a,b;
for(i=0;i<8;i++) num[i]=i+1;
num[8]=0; //将数组复原
for(i=0;i<300;i++)
{
a=getrand(0,8); //产生随机数
b=(a+2)%8; //得到下第二个的数组下标
Change(a,b); //交换
}
Update();
}

void Update()
{
//在屏幕上画出整个九格图像,关于定位的问题自己分析
int i,j;
for(i=0;i<=2;i++)
{
gotoxy(24,8+i*3); //游戏中,用18*9以在控制台画成正方形
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2\x2\x2\x2\x2\x2");
else
printf(" ");
}
gotoxy(24,9+i*3);
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2 %d \x2",num[j+i*3]);
else
printf(" ");
}
gotoxy(24,10+i*3);
for(j=0;j<=2;j++)
{
if (num[j+i*3]!=0)
printf("\x2\x2\x2\x2\x2\x2");
else
printf(" ");
}
printf("\n");
}

}

int IsSuccess()
{
//判断是否游戏
int i;
for(i=0;i<8;i++)
{
if(!(num[i]==(i+1)))
return 0;
}
return 1;
}

int GetTheNull()
{
//获得空格的位置
int i;
for(i=0;i<=8;i++)
{
if (num[i]==0)
return i;

}
}

void Change(int a,int b)
{ //交换num[a],num[b]
int temp;
temp=num[a];
num[a]=num[b];
num[b]=temp;
}

int getrand(int x,int y)
{
long tmp ;
static f=0 ;
if(y<x)
printf("ERROR!\n");
if(!f)
{
srand((unsigned)time(NULL));
f=1 ;
}
tmp=rand()%(y-x+1) ;
tmp+=x;
return tmp ;
}

void gotoxy(int x,int y)
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}



ccnyou 2010-06-07
  • 打赏
  • 举报
回复
两个都对的,我把第二个贴上来吧,很长哦
yuhuaijun 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happytang 的回复:]

第一个是正确的
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77

第二个定义上下左右正好相反,可能功能实现上有什么目的
[/Quote]
顶楼上的,问一下LZ所说的出错是什么意思,是功能不对,还是别的?若功能不对楼上兄弟已说了
happytang 2010-06-07
  • 打赏
  • 举报
回复
第一个是正确的
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77

第二个定义上下左右正好相反,可能功能实现上有什么目的
z569362161 2010-06-07
  • 打赏
  • 举报
回复
我也up 一下!
ccnyou 2010-06-07
  • 打赏
  • 举报
回复
自己 up 回复太快,请先休息一下!

69,382

社区成员

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

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