[前へ]   [目次へ]   [次へ]

CUIミニゲーム(高低当て)デバッグ編(C/C++)

今回は、前回作ったゲームのデバッグ編です。

前回、ヒントとして「何度もプレイする」と書きましたが、
場合によっては一回でも気付きますね(笑)

答えは「最後の成功数表示が実際の成功数より1多い」です。
初回で失敗しても1回成功したことになっているので、これは妙です。
簡単ですか?最初に混ぜるの忘れてたんですよ(汗)

何故成功数が増えてしまったのか?
これは最後の do から for に置換えた時に入ったバグです。
for の処理順序を思い出してください。
続行式は継続条件判定が入るよりも先に処理されます。
つまり、選択に失敗している時にも続行式によって成功数がカウントアップされてしまうのが原因です。

ということは、ループ終了時に loopcnt は成功数+1になっているわけであり、
場当たり的な対処ではありますが、最後に loopcnt を-1すれば辻褄は合わせられます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
< 25>
< 26>
< 27>
< 28>
< 29>
< 30>
< 31>
< 32>
< 33>
< 34>
< 35>
< 36>
< 37>
< 38>
< 39>
< 40>
< 41>
< 42>
< 43>
< 44>
< 45>
< 46>
< 47>
< 48>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void){
   
int now;//現在値
   
int sel=0;//プレイヤーの選択(選択結果)
   
int next;//次回値
   
int loopcnt;//成功回数
   
char buf[256]="";//入力バッファ
   
int cmpres=0;//現在値と次回値の比較結果
   //randを初期化
   
srand(time(NULL));
   
//初期値を生成
   
now=rand()%10;
   
//ループ
   
for(loopcnt=0;sel==cmpres;loopcnt++){
      printf(
"現在の値:%d\n"
         "1:現在値<次回値 2:現在値==次回値 3:現在値>次回値\n"
         "次回はどうなると思いますか?:"
,now);
      fgets(buf,255,stdin);
      
if((buf[0]>='1')&&(buf[0]<='3')){
         sel=buf[0]-
'0';
      }
      next=rand()%10;
      
if(now<next){
         cmpres=1;
      }
      
else if(now==next){
         cmpres=2;
      }
      
else{
         cmpres=3;
      }
      now=next;
      
if(sel==cmpres){
         printf(
"成功!%dでした。\n\n",now);
      }
   }
   
//辻褄あわせ
   
loopcnt--;//(1)
   //成功数表示
   
printf("失敗!%dでした。\n"
      "%d回成功しました。\n"
,now,loopcnt);
   
//終了待ち
   
getchar();
   
return 0;
(1)41行目には -- 演算子が初登場です。
--(後置デクリメント)演算子は単独で使った場合は目標の変数に-1します。
つまり、 loopcnt=loopcnt-1 と同様です。


今回用意したバグはこれで全部です。
そろそろ ++ や -- について解説しておきたいので、
次回はこれらの演算子についての予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17