2017-03-01 75 views
1

我一直在尝试各种组合的if和do语句,但无法使其正常工作。我们使用Visual Studio 2015并使用C代码。代码的总体目标是使用BGI图形来模拟2D机器人(一个圆圈和一条线来指示方向),并使其执行各种任务。我被告知;在C中使用kbhit来控制机器人的BGI绘图

修改您的程序,以便您可以用键盘控制您的机器人。

要做到这一点,您应该初始化初始速度为0,并添加适当的语句到您的程序,以修改基于哪个键被按下的速度。举例来说,你可以

  • 固定不变量的增量v当UP键被按下固定不变量的
  • 递减v当DOWN键被按下
  • 递减W A固定不变量当右键被按下
  • 增量瓦特固定恒定量的当左键被按下
  • 使用另一个键来停止机器人
#include <graphics.h> // includes BGI functions 
#include <conio.h> 
#include <math.h> 
#include <stdio.h> 

int main() 
{ 
// this is a line of comment 
// initialise a 500 X 300 pixels viewport (2D graphic window) 
// don't modify the following lines of code 
int gd, gm; 
gd = CUSTOM; 
gm = CUSTOM_MODE(500, 300); 
initgraph(&gd, &gm, ""); 
int kbhit(), c = 0; 
float c1, c2, c3, c4, alpha, theta; 
int x, y, radius = 40, A, B; 
int xvTL = 0, yvTL = 0, xvBR = 500, yvBR = 300; 
int xTL = 0, yTL = 0, xBR = 50, yBR = 50; 
int xv, yv, W, H; 
float v, w, dt, beta, sigma; 
printf("Pixels of graph window (Bottom Right) = 500, 300. World coordinates (Bottom Right) set to 50, 50 \n");     
printf("Enter a number for x: \n"); 
scanf("%d", &x); 
printf("Enter a number for y: \n"); 
scanf("%d", &y); 
W = xBR - xTL; 
H = yTL - yBR; 
xv = (x - xTL) * (500/W); 
yv = (yTL - y) * (300/H); 
printf("Coordinates(in viewport) = %d, %d \n", xv, yv); 
printf("Enter an angle (in degrees) : \n"); 
scanf("%f", &alpha); 
theta = (float)alpha * 3.1416/180; 
printf("Angle (in radians) = %f \n", theta); 
A = cos(theta) * radius; 
B = sin(theta) * radius; 
if ((alpha = 90), (0 < alpha < 90), (90 < alpha < 180), (180 < alpha < 270), (alpha = 270), (270 < alpha < 360)) 
    (B = sin(theta) * -radius); 
else 
    (B = sin(theta) * radius); 
circle(xv, yv, radius); 
line(xv, yv, xv + A, yv + B); 
v = 0; 
w = 0; 
do { 
    clearviewport(); 
    dt = 2; 
    xv = xv + v * dt * cos(theta); 
    yv = yv + v * dt * sin(theta); 
    sigma = theta + dt * w; 
    beta = sigma * 180/3.1416; 
    A = cos(sigma) * radius; 
    B = sin(sigma) * radius; 
    if ((beta = 90), (0 < beta < 90), (90 < beta < 180), (180 < beta < 270), (beta = 270), (270 < beta < 360)) 
     (B = sin(sigma) * -radius); 
    else 
     (B = sin(sigma) * radius); 
    circle(xv, yv, radius); 
    line(xv, yv, xv + A, yv + B); 
    delay(200); 
    if (_kbhit()) { 
     (c = _getch()); 
    } 
    if (_kbhit()) { 
     c1 = ++v; 
     v = c1; 
    } 
    if (_kbhit()) { 
     c2 = --v; 
     v = c2; 
    } 
    if (_kbhit()) { 
     c3 = ++w; 
     w = c3; 
    } 
    if (_kbhit()) { 
     c4 = --w; 
     w = c4; 
    } 
} while (c != KEY_ESCAPE); (c1 = KEY_UP); (c2 = KEY_DOWN); (c3 = KEY_LEFT); (c4 = KEY_RIGHT); 

return 0; 
} 

回答

0

你想要一个调用kbhit()。假设传统功能,它会告诉你在通话时是否按下了一个按键。所以你只想在你的循环中调用它一次。

if(kbhit()) 
{ 
    ./* action to alter robot */ 
} 
else 
{ 
    /* no user moves, maybe robot still has momentum */ 
} 

尝试将某些逻辑移出main()以及。