在C中使用kbhit控制机器人的BGI绘图
Using kbhit in C to control a BGI drawing of a robot
我一直在尝试 if 和 do while 语句的各种组合,但无法使其正常工作。我们使用 Visual Studio 2015 并使用 C 代码。该代码的总体目标是使用BGI图形模拟一个二维机器人(一个圆和一条线来指示方向)并使其执行各种任务。有人告诉我;
Modify your program so that you can control your robot with your keyboard.
To do this, you should initialise the initial velocities to 0 and add appropriate statements to your program in order to modify the velocities based on which key is being pressed. For instance, you could
- increment v of a fixed constant quantity when the UP key is pressed
- decrement v of a fixed constant quantity when the DOWN key is pressed
- decrement w of a fixed constant quantity when the RIGHT key is pressed
- increment w of a fixed constant quantity when the LEFT key is pressed
- use another key to stop the robot
#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;
}
您需要调用 kbhit() 一次。假设是常规功能,它会告诉您在调用时是否按下了某个键。所以你只想在你的循环中调用它一次。
if(kbhit())
{
./* action to alter robot */
}
else
{
/* no user moves, maybe robot still has momentum */
}
也尝试将一些逻辑移出 main()。
我一直在尝试 if 和 do while 语句的各种组合,但无法使其正常工作。我们使用 Visual Studio 2015 并使用 C 代码。该代码的总体目标是使用BGI图形模拟一个二维机器人(一个圆和一条线来指示方向)并使其执行各种任务。有人告诉我;
Modify your program so that you can control your robot with your keyboard.
To do this, you should initialise the initial velocities to 0 and add appropriate statements to your program in order to modify the velocities based on which key is being pressed. For instance, you could
- increment v of a fixed constant quantity when the UP key is pressed
- decrement v of a fixed constant quantity when the DOWN key is pressed
- decrement w of a fixed constant quantity when the RIGHT key is pressed
- increment w of a fixed constant quantity when the LEFT key is pressed
- use another key to stop the robot
#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;
}
您需要调用 kbhit() 一次。假设是常规功能,它会告诉您在调用时是否按下了某个键。所以你只想在你的循环中调用它一次。
if(kbhit())
{
./* action to alter robot */
}
else
{
/* no user moves, maybe robot still has momentum */
}
也尝试将一些逻辑移出 main()。