疑問在程式的注解裡
程式:
//程式功能:
//撞到障礙物後會後退右轉20次然後反向在執行
//遇到踩空也會後退右轉
#include <ICCI-RV10.H>
//增加2個全域變數和一個函數
short direction = 1;
short hitCount = 1;
void turn(int tolerance, int hitPower);
int turnCount=0;
/*下面是我對於turn的定義*/
void turn(int tolerance, int hitPower)
{
hitCount += hitPower;
if (hitCount > tolerance)
{
direction = 1 - direction;
hitCount = 0;
}
if(hitCount==0)turnCount++;
if (direction)
RIGHT();
else
LEFT();
}
main()
{
while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(13);
//RIGHT();
turn(20, 1);
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(5);
//RIGHT();
turn(20, 1);
delay_100m(5);
}
if(turnCount==1&&hitCount==19)break;
/*這邊我讓他轉向1次加上碰撞19次則跳脫制下一指令!!!*/
else
FORWARD();
}
/*以下即為跳脫迴圈後得下一指令,如果我想讓下面的迴圈BUMPER+FALL的次數到達27次左右(或者28.29次)轉向為RIGHT,不管撞到或掉落,就是將下面的迴圈在達27次後,變為(2)*/
while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
LEFT();
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
LEFT();
delay_100m(2);
}
else
FORWARD();
}
}
while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
RIGHT();
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
RIGHT();
delay_100m(2);
}
else
FORWARD();
}
}
最後一段即為 (2) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } else FORWARD(); } }
我在想如果要讓第2個迴圈到達27次左右再跳至下一迴圈 是否還要再定義一個像turn的數值? 然後再用GOTO或者 BRAKE 去跳脫。。。WHILE 還是有更簡單的辦法- -
如果東邪大大 有空不知是否可以幫忙解答 我真的超崇拜你們兩位-/- 當時的幫忙 Jacob Lee之前先謝謝你的提醒 應該要提交投票而非刪除
東邪 謝謝你的回覆 : 首先我在統整一下 怕大大看不懂我表達很爛= . = 我先分3個部份的迴圈 (1).(2)這邊是在一起的 我要加進去的是(3) 下面我再解釋的更加清楚...以免誤會(上面我所發表的參考就好) --------------------------------------------------------------------------------------------------------
#include short direction = 1; short hitCount = 1; void turn(int tolerance, int hitPower); int turnCount=0;
void turn(int tolerance, int hitPower) { hitCount += hitPower; if (hitCount > tolerance) { direction = 1 - direction; hitCount = 0; } if(hitCount==0)turnCount++; if (direction) RIGHT(); else LEFT(); }
(1) main() { while(1) { if(BUMPER_IN()) { BACK(); delay_100m(13); //RIGHT(); turn(20, 1); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(5); //RIGHT(); turn(20, 1); delay_100m(5); } if(turnCount==1&&hitCount==19)break; else FORWARD(); }
(2) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); LEFT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); LEFT(); delay_100m(2); } else FORWARD(); } } -------------------------------------------------------------------------------------------------------
(3) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } else FORWARD(); } } (這邊和(2)只插在轉的方向left=>right)
一. (1) 20個障礙右轉 20個障礙左轉 二. (2) 25個障礙左轉 三. 二結束後跳脫(2)迴圈至(3)一直到結束
ANS. turn(20, 1); delay_100m(2); 這個delay的時間,是否剛好控制轉向90度? 若是如此,那麼delay_100m(4);時間拉長一些,是否等同轉了180度? 在第一個迴圈的 delay_100m(5) ,時間較長是故意安排的? 1. (1)部分執行20次會讓int turnCount=0; 變1做記數 delay 0.2秒是代表退後或者是轉向的時間 我的策略是讓它撞到牆就退後1.3秒右(左)轉0.2秒 讓他連中間區塊都可以清理到
例如: BACK(); delay_100m(2); 代表說他會退後0.2秒 RIGHT(); delay_100m(2); 右轉0.2秒
抱歉耽誤你的時間 因為下午我去觀看場地看是否和我所寫的程式是相符的 很抱歉耽誤到你||| 拍謝惹~
三. 我想讓(2)這邊25個障礙然後跳到(3)
(1)if(turnCount==1&&hitCount==19)break; 這個地方我是讓他共20+19=39個障礙後跳至(2) (2)功用:延著牆壁走,撞到障礙後退後0.2 秒左轉0.2秒 執行25次後跳脫至(3) 變成撞到障礙後退後0.2秒又轉0.2秒 (原本是說27次 現在我更正為25次)
先跟你說抱歉 讓你等這麼久 我數十分鐘後才做補充 sor~ 真的非常謝謝 東邪 我等等吃完飯會在馬上衝去學校 晚上要把這個寫好 弄懂 我會一直到明天早上我都會一直在學校 我大概快20:00會到學校測試 如果正常我會在告訴你 或者我對程式有疑問 想再請教你 因為老師都不太會交 只好求助你和Jacob 先前你有回答過我想說你應該會比較清楚 不然我PO出來都不大有人會回復! 謝謝\~
目前 測試一切OK 謝謝ˇ~ 我正再看一下大大的程式 等等沒問題我就選最佳解答惹~ ""完全有點傻眼 和原先寫的東西有一段差距 差真多-.-""