dポイントプレゼントキャンペーン実施中!

プログラミングについておききしたいのですが、
ライントレースで左右のカーブを曲がる際に
変数を使って、「さっきは右に曲がったので次は右から曲がる」や

「さっきは左に曲がったから左から曲がる」といったプログラムは
どのようにつくったらいいのでしょうか?
まだ初心者なので変数をうまく使えなくて悩んでいます。
よろしくお願いします。

今のところ下記のような感じにできているのですが
修正点や加えた方がいい点、省略できる点はありますでしょうか?
よろしくお願いします。

mainの上は省略させて頂きました。

int main(void)
{
 int R = 0;

while(1) {
 if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです
 while(GetTouch(CH_2) == 0);
 MotorPower(CH_B|CH_C, 0);
 while(GetTouch(CH_2) == 1);
 while(GetTouch(CH_2) == 0);
 MotorPower(CH_B|CH_C, 40);
 while(GetTouch(CH_2) == 1);

}else{  //ここからライントレースの内容です
 clock_t start,end;
 clock_t start2,end2;

if (GetSensor(CH_3) > kuro && R == 0) {
 start = clock();
 migi(CH_B|CH_C);
 while(GetSensor(CH_3) > kuro){
 end = clock();
 start2 = clock();

if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){
 hidari(CH_B|CH_C);
 while(GetSensor(CH_3) > kuro);
 end2 = clock();
 MotorPower(CH_B|CH_C,40);
 R = 1;
 break;
}
while( R == 1 ){
if(GetSensor(CH_3) > kuro){
hidari(CH_B|CH_C);
while(GetSensor(CH_3) > kuro);
MotorPower(CH_B|CH_C,40);
R = 0;
break;

}else {
if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){
migi(CH_B|CH_C);
while(GetSensor(CH_3) > kuro);
MotorPower(CH_B|CH_C,40);

}//ifのカッコ
}//whileのカッコ
}//elseのカッコ
}//whileのカッコ
}//ifのカッコ
}//elseのカッコ
}//whileのカッコ
}//mainのカッコ

A 回答 (1件)

○コメントが少ない


 何が目的で、どんな考えでこう書いてあるのか、よくわかりません。
 よくわからないので、改善点の提案もできません。
 例えば if(GetSensor(CH_3) > kuro){ ですが。
 kuro と判定してるので、黒かどうかを判定していることは予想できます。
 ですが、この判定は 黒のときTrueなのか、黒でないときTrueなのか、どちらの意味かがわかりません。

○同じ処理を何度も書いている
 「同じことを3度書いたら、マクロか関数にしろ」という格言があります。
 例えば、何度も出てくる GetSensor(CH_3) > kuro)ですが、この判定をマクロや関数にして
 if ( isBlack() ) (もしかしたらはisWhite?) 等と書けば、次のメリットがあります。
 ・文字が減らせる。
 ・意味がわかる。→コメント代りになる
   さらに抽象的にして onLine() (線上にいる) 等とすると、何を意味するかがはっきりする
 ・判定方法が変わっても、一箇所直すだけで全体に反映させることができる
   例えば、 精度向上のためにセンサーを増やして、複合的に判定させようとします。
   「CH_3のセンサーが>kuro かつ CH_4のセンサーが<kuro」になったとして現状どこを変更すればいいか、わかりますか?

○main関数に全部の処理を書く
 mainプログラムには、全体の流れだけを書くようにします。
int main(){
 while(1) { // メインループ
  動作スイッチ待ち();
  if ( 交差点 ) {
   前回曲った方向記録 = 曲がる(前回曲った方向記録) ;
  } else {
   直進する();
  }
 }
}

// さっき曲がった方向を指定→実際に曲った方向を返す関数
左右記録型 曲がる(さっき曲がった方向) {
  if ( さっき曲がった方向=左 ) {
   左に曲がる();
   return 左;
  } else {
   右に曲がる();
   return 左;
  }
}

あってるかどうかわかりませんが、例えば、こんな感じになると思います。
これだと、何をしているか、よくわかるのではないでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!