?? fun.c
字號:
int WhetherInView(Football *ball,Robot *dubu);
int WhetherInSide(Football *ball,Robot *dubu);
int TurnToBall(Football *ball,Robot *dubu);
int MoveToBall(Football *ball,Robot *dubu);
int DrawBall(Football *ball);
int DrawRobot(Robot *dubu);
int MeetBoundary(Football *ball,FootballPitch *pitch);
int MeetRobot(Football *ball,Robot *dubu);
int WhetherReverse(Robot *dubu);
int ReverseToGoal(Football *ball,Robot *dubu);
int ComputeShootAngle(Football *ball,Robot *dubu);
int ReverseFactor(Football *ball,Robot *dubu);
/*判斷球是否在機器人的正前方*/
int WhetherInView(Football *ball,Robot *dubu)
{
float x1,y1,x2,y2,a1,a2,b1,b2,c1,c2;
x1 = dubu->position_x + dubu->reverse_radius * cos(PI / 4 + dubu->direction_indicator);
y1 = dubu->position_y - dubu->reverse_radius * sin(PI / 4 + dubu->direction_indicator);
x2 = dubu->position_x + dubu->reverse_radius * cos(3 * PI / 4 + dubu->direction_indicator);
y2 = dubu->position_y - dubu->reverse_radius * sin(3 * PI / 4 + dubu->direction_indicator);
a1 = y2 - y1;
b1 = x1 - x2;
c1 = x2 * y1 - x1 * y2;
x1 = dubu->position_x + dubu->reverse_radius * cos(5 * PI / 4 + dubu->direction_indicator);
y1 = dubu->position_y - dubu->reverse_radius * sin(5 * PI / 4 + dubu->direction_indicator);
x2 = dubu->position_x + dubu->reverse_radius * cos(7 * PI / 4 + dubu->direction_indicator);
y2 = dubu->position_y - dubu->reverse_radius * sin(7 * PI / 4 + dubu->direction_indicator);
a2 = y2 - y1;
b2 = x1 - x2;
c2 = x2 * y1 - x1 * y2;
if((a1 * ball->ball_x + b1 * ball->ball_y + c1) * (a2 * ball->ball_x + b2 * ball->ball_y + c2) > 0)
return 0;
else return 1;
}
/*判斷球是否在機器人的側面*/
int WhetherInSide(Football *ball,Robot *dubu)
{
float x1,y1,x2,y2,a1,a2,b1,b2,c1,c2;
x1 = dubu->position_x + dubu->reverse_radius * cos(PI / 4 + dubu->direction_indicator);
y1 = dubu->position_y - dubu->reverse_radius * sin(PI / 4 + dubu->direction_indicator);
x2 = dubu->position_x + dubu->reverse_radius * cos(7 * PI / 4 + dubu->direction_indicator);
y2 = dubu->position_y - dubu->reverse_radius * sin(7 * PI / 4 + dubu->direction_indicator);
a1 = y2 - y1;
b1 = x1 - x2;
c1 = x2 * y1 - x1 * y2;
x1 = dubu->position_x + dubu->reverse_radius * cos(3 * PI / 4 + dubu->direction_indicator);
y1 = dubu->position_y - dubu->reverse_radius * sin(3 * PI / 4 + dubu->direction_indicator);
x2 = dubu->position_x + dubu->reverse_radius * cos(5 * PI / 4 + dubu->direction_indicator);
y2 = dubu->position_y - dubu->reverse_radius * sin(5 * PI / 4 + dubu->direction_indicator);
a2 = y2 - y1;
b2 = x1 - x2;
c2 = x2 * y1 - x1 * y2;
if((a1 * ball->ball_x + b1 * ball->ball_y + c1) * (a2 * ball->ball_x + b2 * ball->ball_y + c2) > 0)
return 0;
else return 1;
}
/*機器人向球的方向旋轉*/
int TurnToBall(Football *ball,Robot *dubu)
{
float angle;
if(ball->ball_x > dubu->position_x && ball->ball_y <= dubu->position_y)
{
dubu->direction = 0;
dubu->position_x += dubu->small_speed * cos(dubu->decline);
dubu->position_y -= dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor=ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
if(dubu->direction_indicator >= 2 * PI)
dubu->direction_indicator -= 2 * PI;
}
else if(ball->ball_x < dubu->position_x && ball->ball_y <= dubu->position_y)
{
dubu->direction = -PI;
dubu->position_x -= dubu->small_speed * cos(dubu->decline);
dubu->position_y -= dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor = ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
}
else if(ball->ball_x < dubu->position_x && ball->ball_y > dubu->position_y)
{
dubu->direction = -PI;
dubu->position_x -= dubu->small_speed * cos(dubu->decline);
dubu->position_y += dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor = ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
}
else if(ball->ball_x > dubu->position_x && ball->ball_y > dubu->position_y)
{
dubu->direction = -2*PI;
dubu->position_x += dubu->small_speed * cos(dubu->decline);
dubu->position_y += dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor = ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
if(dubu->direction_indicator < 0)
dubu->direction_indicator += 2 * PI;
}
else if(ball->ball_x == dubu->position_x && ball->ball_y < dubu->position_y)
{
dubu->direction = PI/2;
dubu->position_x -= dubu->small_speed * cos(dubu->decline);
dubu->position_y -= dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor = ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
}
else if(ball->ball_x == dubu->position_x && ball->ball_y > dubu->position_y)
{
dubu->direction = PI/2;
dubu->position_x -= dubu->small_speed * cos(dubu->decline);
dubu->position_y += dubu->small_speed * sin(dubu->decline);
dubu->reverse_factor = ReverseFactor(ball,dubu);
dubu->direction_indicator += dubu->reverse_factor * dubu->decline;
}
return 0;
}
/*當機器人對準了球時,正對著球前進*/
int MoveToBall(Football *ball,Robot *dubu)
{
float x,y,d1,d2;
x = dubu->position_x + dubu->forward_speed * cos(dubu->direction_indicator);
y = dubu->position_y - dubu->forward_speed * sin(dubu->direction_indicator);
d1 = (x - ball->ball_x) * (x - ball->ball_x) + (y - ball->ball_y) * (y - ball->ball_y);
d2 = (dubu->position_x - ball->ball_x) * (dubu->position_x - ball->ball_x) + (dubu->position_y - ball->ball_y) * (dubu->position_y - ball->ball_y);
if(d1 < d2)
{
dubu->position_x += dubu->forward_speed * cos(dubu->direction_indicator);
dubu->position_y -= dubu->forward_speed * sin(dubu->direction_indicator);
}
else
{
dubu->position_x -= dubu->forward_speed * cos(dubu->direction_indicator);
dubu->position_y += dubu->forward_speed * sin(dubu->direction_indicator);
}
return 0;
}
/*畫球的函數*/
int DrawBall(Football *ball)
{
setfillstyle(1,ball->color);
circle(ball->ball_x,ball->ball_y,ball->radius);
floodfill(ball->ball_x,ball->ball_y,ball->color);
return 0;
}
/*畫機器人的函數*/
int DrawRobot(Robot *dubu)
{
setcolor(dubu->color);
line(dubu->position_x + dubu->reverse_radius * cos ( PI / 4 + dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(PI/4+dubu->direction_indicator),dubu->position_x+dubu->reverse_radius*cos(3*PI/4+dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(3*PI/4+dubu->direction_indicator));
line(dubu->position_x + dubu->reverse_radius * cos ( 3 * PI / 4 + dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(3*PI/4+dubu->direction_indicator),dubu->position_x+dubu->reverse_radius*cos(5*PI/4+dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(5*PI/4+dubu->direction_indicator));
line(dubu->position_x + dubu->reverse_radius * cos ( 5 * PI / 4 + dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(5*PI/4+dubu->direction_indicator),dubu->position_x+dubu->reverse_radius*cos(7*PI/4+dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(7*PI/4+dubu->direction_indicator));
line(dubu->position_x + dubu->reverse_radius * cos ( 7 * PI / 4 + dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(7*PI/4+dubu->direction_indicator),dubu->position_x+dubu->reverse_radius*cos(PI/4+dubu->direction_indicator),dubu->position_y-dubu->reverse_radius*sin(PI/4+dubu->direction_indicator));
setfillstyle(1,dubu->color);
floodfill(dubu->position_x,dubu->position_y,dubu->color);
settextstyle(0,0,1);
settextjustify(1,1);
setcolor(WHITE);
if(dubu->number == 1)
outtextxy(dubu->position_x,dubu->position_y,"1");
if(dubu->number == 2)
outtextxy(dubu->position_x,dubu->position_y,"2");
return 0;
}
/*二人足球中,機器人面對球門時,先判斷是否是自己要射的門,再決定是否執行射門動作*/
int WhetherReverse(Robot *dubu)
{
int result;
float a1,a2;
if(dubu->direction_indicator >= 0 && dubu->direction_indicator < PI / 2)
dubu->direction_indicator += 2 * PI;
if(dubu->direction_indicator >= PI / 2 && dubu->direction_indicator < 3 * PI / 2)
{
a1 = PI + atan((dubu->position_y - 200) / (70 - dubu->position_x));
a2 = PI + atan((dubu->position_y - 250) / (70 - dubu->position_x));
if(dubu->direction_indicator > a1 && dubu->direction_indicator < a2 && dubu->number == 2)
result = 0;
else result = 1;
}
else
{
a1 = 2 * PI + atan((dubu->position_y - 250) / (570 - dubu->position_x));
a2 = 2 * PI + atan((dubu->position_y - 200) / (570 - dubu->position_x));
if(dubu->direction_indicator > a1 && dubu->direction_indicator < a2 && dubu->number == 1)
result = 0;
else result = 1;
}
if(dubu->direction_indicator > 2 * PI)
dubu->direction_indicator -= 2 * PI;
else if(dubu->direction_indicator < 0)
dubu->direction_indicator += 2 * PI;
return result;
}
/*射門動作的實現*/
int ReverseToGoal(Football *ball,Robot *dubu)
{
int i,size;
void *buffer;
for(i=0;i<3;i++)
{
if(i==250)
dubu->reverse_factor = -dubu->reverse_factor;
dubu->direction_indicator += 16 * dubu->reverse_factor * dubu->decline;
size = imagesize(dubu->position_x - dubu->reverse_radius,dubu->position_y - dubu->reverse_radius,dubu->position_x + dubu->reverse_radius,dubu->position_y + dubu->reverse_radius);
buffer = malloc(size);
getimage(dubu->position_x - dubu->reverse_radius,dubu->position_y - dubu->reverse_radius,dubu->position_x + dubu->reverse_radius,dubu->position_y + dubu->reverse_radius,buffer);
if(buffer==0)
{
printf("error");
exit(1);
}
DrawRobot(dubu);
delay(2);
putimage(dubu->position_x - dubu->reverse_radius,dubu->position_y - dubu->reverse_radius,buffer,COPY_PUT);
free(buffer);
}
return 0;
}
/*二人足球中,判斷機器人的旋轉方向*/
int ComputeShootAngle(Football *ball,Robot *dubu)
{
dubu->reverse_factor = -1;
if(dubu->number == 1)
{
if(ball->ball_y >= dubu->position_y)
dubu->reverse_factor = -1;
else if(ball->ball_y < dubu->position_y)
dubu->reverse_factor = 1;
}
if(dubu->number == 2)
{
if(ball->ball_y >= dubu->position_y)
dubu->reverse_factor = 1;
else if(ball->ball_y < dubu->position_y)
dubu->reverse_factor = -1;
}
return 0;
}
/*計算機器人的旋轉方向,順時針為-1,逆時針為1*/
int ReverseFactor(Football *ball,Robot *dubu)
{
int result;
float angle;
if(ball->ball_x > dubu->position_x && ball->ball_y <= dubu->position_y)
{
angle = atan((ball->ball_y - dubu->position_y) / (dubu->position_x - ball->ball_x));
if((dubu->direction_indicator > 3 * PI / 2) && (dubu->direction_indicator < 2 * PI))
result = 1;
else if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
else if(ball->ball_x < dubu->position_x && ball->ball_y <= dubu->position_y)
{
angle = PI + atan((ball->ball_y - dubu->position_y) / (dubu->position_x - ball->ball_x));
if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
else if(ball->ball_x < dubu->position_x && ball->ball_y > dubu->position_y)
{
angle = PI + atan((ball->ball_y - dubu->position_y) / (dubu->position_x - ball->ball_x));
if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
else if(ball->ball_x > dubu->position_x && ball->ball_y > dubu->position_y)
{
angle = 2 * PI + atan((ball->ball_y - dubu->position_y) / (dubu->position_x - ball->ball_x));
if((dubu->direction_indicator >= 0) && (dubu->direction_indicator < PI / 2))
result = -1;
else if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
else if(ball->ball_x == dubu->position_x && ball->ball_y < dubu->position_y)
{
angle = PI / 2;
if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
else if(ball->ball_x == dubu->position_x && ball->ball_y > dubu->position_y)
{
angle = 3 * PI / 2;
if(dubu->direction_indicator < angle)
result = 1;
else result = -1;
}
return result;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -