我用c语言编一个箭头运动的程序,我想用键盘控制箭头运动的方向,该怎么办,向各位高手求救 C语言 关于用键盘的上下左右箭头控制移动的问题

c\u8bed\u8a00\u4e2d\uff0c\u6211\u60f3\u5b9e\u73b0\u7528\u7bad\u5934\u6765\u9009\u62e9\u3002\u6bd4\u59821.->\u653b\u51fb\u3002\u6211\u63a7\u5236\u8fd9\u4e2a\u7bad\u5934\u5230\u653b\u51fb\u8fd9\u91cc\uff0c\u600e\u4e48\u5199\u5e26\u5417\u624d\u80fd\u505a\u5230\u548c\u76f4

\u8fd9\u95ee\u9898\u63cf\u8ff0\u4e0d\u6e05\uff0c\u65e0\u6cd5\u7406\u89e3\u672c\u610f\u662f\u4ec0\u4e48\u3002C\u8bed\u8a00\u4e2d\u7684->\u64cd\u4f5c\u7b26\u53ea\u80fd\u7528\u4e8e\u7ed3\u6784\u4f53\u6307\u9488\u8bbf\u95ee\u6210\u5458\u64cd\u4f5c\u3002

int x=1,y=1,i; // \u7528 1\uff0c\u4e0e\u4f60\u7684\u6761\u4ef6\u8bed\u53e5\u5339\u914d
int cmd\uff0ckeyCode; // \u7528 int \u578b

if(keyCode==75){x=x-1;if (x<=0)x=1;}
else if(keyCode==77){++x;}
else if(keyCode==72){y=y-1;if (y<=0) y=1;}
else if(keyCode==80){++y;}

通过使用getch()函数接受键盘输入的字符控制移动,然后再刷屏,就这么简单
下面给一个参考程序
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 6
int x=1, y=1;
int current_value=0;
int map[N][N]={ {1,1,1,1,1,1},{1,0,0,0,0,1},{1,0,0,0,0,1},{1,0,0,0,0,1},{1,0,0,0,0,2},{1,1,1,1,1,1} };

void print()
{
int i, j;

for(i=0; i<N; i++)
{ for(j=0; j<N; j++)
{
if(i==y && j==x)
{printf("#");
continue;
}
if(map[i][j]==1)
printf("*");
if(map[i][j]==0)
printf("-");
if(map[i][j]==2)
printf("$");
}
printf("\n");
}

}

int control(char ch)
{
switch(ch)
{
case 'a':
{ if(map[y][x-1]==0 || map[y][x-1]==2)
{
x--;
current_value=map[y][x];
return 1;
}
else
return 0;

}

case 'd':
{ if(map[y][x+1]==0 || map[y][x+1]==2)
{
x++;
current_value=map[y][x];
return 1;
}
else
return 0;

}

case 's':
{ if(map[y+1][x]==0 || map[y+1][x]==2)
{
y++;
current_value=map[y][x];
return 1;
}
else
return 0;

}
case 'w':
{ if(map[y-1][x]==0 || map[y-1][x]==2)
{
y--;
current_value=map[y][x];
return 1;
}
else
return 0;

}
default :return 0;
}
}

int main()
{
int i, j;
int done=0;
int success=0;
char ch;

print();
while (!success)
{

ch=getch();
if(ch=='0')
break;
done=control(ch);
if(done)
{
system("cls");
print();
}
if(map[y][x]==2)
{success=1;
break;
}

}
if(success)
printf("恭喜你闯关成功!!、\n");
else
printf("再接再厉~~\n");

return 0;
}

最常用的一个捕获按键的函数:getch()
前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:
char c = getch();
然后再做判断即可。
不过程序执行到 getch() 是会阻塞的,直到用户有按键才能继续执行。可游戏中总不能因为等待按键而停止游戏执行吧?所以,要有一个函数,判断是否有用户按键:kbhit()
这个函数返回当前是否有用户按键,如果有,再用 getch() 获取即可,这样是不会阻塞的。
即:
char c;
if (kbhit())
c = getch();
举一个简单的例子,如果有按键,就输出相关按键。否则,输出“.”。每隔 100 毫秒输出一次。按 ESC 退出。
注:ESC 的 ASCII 码是 27。
完整代码如下:
#include <graphics.h>
#include <stdio.h>
#include <conio.h>

void main()
{
char c = 0;
while(c != 27)
{
if (kbhit())
c = getch();
else
c = '.';

printf("%c", c);
Sleep(100);
}
}
结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现 a s 控制圆的左右移动:
#include <graphics.h>
#include <conio.h>

void main()
{
initgraph(640, 480);

int x = 320;

// 画初始图形
setcolor(YELLOW);
setfillstyle(GREEN);
fillcircle(x, 240, 20);

char c;
while(c != 27)
{
// 获取按键
c = getch();

// 先擦掉上次显示的旧图形
setcolor(BLACK);
setfillstyle(BLACK);
fillcircle(x, 240, 20);

// 根据输入,计算新的坐标
switch(c)
{
case 'a': x-=2; break;
case 'd': x+=2; break;
case 27: break;
}

// 绘制新的图形
setcolor(YELLOW);
setfillstyle(GREEN);
fillcircle(x, 240, 20);

// 延时
Sleep(10);
}

closegraph();
}

代码很长....

  • 鎴戠敤c璇█缂栦竴涓澶磋繍鍔ㄧ殑绋嬪簭,鎴戞兂鐢ㄩ敭鐩樻帶鍒剁澶磋繍鍔ㄧ殑鏂瑰悜,璇ユ庝箞...
    绛旓細include<stdio.h> include<stdlib.h> include<conio.h> define N 6 int x=1, y=1;int current_value=0;int map[N][N]={ {1,1,1,1,1,1},{1,0,0,0,0,1},{1,0,0,0,0,1},{1,0,0,0,0,1},{1,0,0,0,0,2},{1,1,1,1,1,1} };void print(){ int i, j;f...
  • 鍒╃敤c璇█瀹炵幇缂栫▼ 鐢涓涓澶
    绛旓細C璇█涓浣跨敤鐨勭澶绗﹀彿涓->銆傝鎿嶄綔绗﹀苟闈炴槸涓涓绗﹀彿锛岃屾槸鐢卞噺鍙(-)鍜屽ぇ浜庡彿(>)鍏卞悓缁勬垚鐨勩傛墍浠ュ湪鎵->鏃讹紝闇瑕佸厛鎵-,浣嶄簬閿洏鍙充笂瑙掞紝0鍜=涔嬮棿锛岀洿鎺ョ偣鍑诲嵆鍙傜劧鍚庡啀杈撳叆>鍙凤紝鍦ㄩ敭鐩樺彸涓嬭锛屽彸shift宸﹁竟锛岄楀彿鍜屾枩绾/涔嬮棿锛屼笌鍙ュ彿鍦ㄥ悓涓涓寜閿笂锛岃緭鍏ユ椂闇瑕佹寜shift鍚屾椂鎸夎閿->浣滅敤涓猴紝...
  • 鎬庝箞鐢╟璇█缂栧啓,杈撳嚭涓皬绠ご
    绛旓細include <stdio.h>int main(){int i;for(i=16;i<=31;++i){printf("%c \n",i); }return 0;}鍚勭绗﹀彿
  • 姹傗滀竴绠┛蹇冣 C璇█缂栫▼
    绛旓細include<math.h> define FNX(x1) (int)(x+(x1)*sl)define FNY(y1) (int)(MAXY-(y+(y1)*sl))define R(theta) 1-pow(cos(1*theta),1)int sl=50,MAXY;float x1,y1,xs,ys,r,theta;/*鐢诲績*/ void draw(int x,int y){ for(theta=0;theta<2*3.14;theta+=0.01){r=R(thet...
  • C璇█缂栧啓鐨璁$畻鍣鐨勭▼搴 瑕佸疄鐜伴紶鏍囨搷浣滃摝
    绛旓細if(c=='Q')exit(0); /*濡傛灉閫夋嫨浜唓鍥炶溅,缁撴潫璁$畻绋嬪簭*/ } putimage(x,y,rar,XOR_PUT); /*鍦ㄩ鍑轰箣鍓嶆秷鍘诲厜鏍绠ご*/ return; /*杩斿洖*/}/*绐楀彛鍑芥暟*/void mwindow( char *header ){ int height; cleardevice(); /* 娓呴櫎鍥惧舰灞忓箷 */ setcolor( MaxColors - 1 ); /* 璁剧疆褰撳墠棰滆壊涓虹櫧鑹*/ se...
  • C璇█涓负浠涔堣鐢ㄥ埌绠ご杩欎釜杩愮畻绗?
    绛旓細绠ご鍦C璇█涓绉颁负鈥滅粨鏋勪綋鎸囬拡杩愮畻绗︹濓紝瀹冩槸鐢ㄦ潵璁块棶缁撴瀯浣撴寚閽堟墍鎸囧悜鐨勭粨鏋勪綋涓殑鎴愬憳鍙橀噺鐨勩傜粨鏋勪綋鏄疌璇█涓嚜瀹氫箟鐨勪竴绉嶆暟鎹被鍨嬶紝瀹冨寘鍚簡鑻ュ共涓笉鍚岀殑鏁版嵁鎴愬憳锛岃繖浜涙垚鍛樺彲浠ユ槸浠绘剰绫诲瀷鐨勬暟鎹紝渚嬪int銆乧har銆乫loat鎴栬呭叾浠栫殑缁撴瀯浣撶瓑銆傞氳繃缁撴瀯浣撴寚閽堝彲浠ユ柟渚垮湴璁块棶杩欎簺鎴愬憳銆绠ご鐨浣滅敤鏄皢...
  • c璇█绋嬪簭,瀹炵幇涓婁笅閿鐨鎿嶄綔,楂樻墜杩
    绛旓細瀵逛簬閿洏杈撳叆锛岄兘鏄湁鎿嶄綔绯荤粺鏉ュ鐞嗙殑鎺ュ彈锛屽苟浼犵粰绋嬪簭鐨勶紝瀵逛簬鏅鐨刢璇█绋嬪簭绯荤粺浼犲叆锛屽浜庢帶鍒堕敭娑堟伅涓鑸兘琚郴缁熸埅鍙栧苟澶勭悊 锛屼綘鎯虫帴鍙楀鐞嗘帶鍒堕敭锛岄渶瑕佺郴缁熻皟鐢ㄨ幏寰楁秷鎭紝杩欐椂闇瑕佷竴浜涗腑闂村簱鎴栬呯壒娈婄殑绯荤粺璋冪敤锛屽windows鐨刴fc 閽╁瓙鍑芥暟绛夌瓑锛宭inux鐨勪竴浜涚幇鎴愮殑搴撳拰read select绯荤粺璋冪敤绛夌瓑 ...
  • C璇█,杩欎釜绋嬪簭,绠ご鎸鐨璇彞鍒嗗埆鏄粈涔堟剰鎬濆憿?姹傝愬績瑙i噴銆俖鐧惧害鐭 ...
    绛旓細a=077锛涘氨鏄妸a璧嬪77 b=a&3; &鏄寜浣嶄笌锛77鐨2杩涘埗涓100 1101銆3鐨2杩涘埗涓11锛屾寜浣嶄笌鍚庯紝缁撴灉涓01銆傛墍浠=01 b &=7; 鐩稿綋浜巄 = b & 7 ;杩欓噷b=01,07鐨勪簩鍒舵暟涓111锛屾寜浣嶄笌鍚庯紝b=1
  • 杩欎釜C璇█绋嬪簭鏈绠ご鐨閭i噷閿欏湪鍝噷鍟
    绛旓細閿欒淇℃伅閲屽凡缁忚浜嗭紝鍥犱负st[i]鏄寚閽堬紝鎵浠ヨ浣跨敤-锛炶屼笉鑳戒娇鐢ㄥ渾鐐广
  • 浼C璇█鐨鏈嬪弸甯釜蹇欏晩 甯鎴戠紪涓皬绋嬪簭
    绛旓細鎴戠殑 浼C璇█鐨勬湅鍙嬪府涓繖鍟 甯垜缂栦釜灏忕▼搴 涓銆佹讳綋瑕佹眰1銆佸瀹為檯闂杩涜鍒嗘瀽銆佸啓鍑虹畻娉曞垎鏋愩2銆佽璁$▼搴忕粨鏋3銆佺粰鍑鸿璁$殑鍚勬ā鍧椼4銆佹彁浜ゅ悇搴旂敤绋嬪簭鐨勬簮绋嬪簭娓呭崟銆6銆佽绋嬭璁¢夋嫨turboc浜屻佽绋嬭璁$殑鍐呭鍜屽叿浣撹姹備富瑕佸寘... 涓銆佹讳綋瑕佹眰1銆佸瀹為檯闂杩涜鍒嗘瀽銆佸啓鍑虹畻娉曞垎鏋愩2銆佽璁$▼搴忕粨鏋3銆佺粰...
  • 扩展阅读:运动品牌logo一览表 ... c入门教程视频 ... 100个运动品牌商标 ... 箭头朝下的衣服品牌 ... 一个像箭头的衣服品牌 ... 三个下箭头的衣服 ... 类似三叉戟的衣服品牌 ... 一个箭头的运动品牌 ... 运动品牌标志大全三个箭头 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网