質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

printfで時々出力されないものが出てきます。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,309

Masalu_Kudou

score 34

お世話になっております。

現在カニ(これです-> V..V)を動かすソースを作成しています。
しかし、実際実行してみると、Vの右側が出力されないものが出てきます。

【出力結果】


V.. V.. V.. V..VV..V


昨日今日で調査をしていて、move_enemy関数に何かバグが潜んでいるんじゃないかなと思っているのですが、
まだ何となくの段階で原因も突き止められていません。

少々ソースが長く申し訳ありませんが、お分かりになる方、アドバイスをお願いいたします。

#include <stdio.h>
#define DISPLAYROWMAX (35)
#define DISPLAYCOLMAX (71)
#define ENEMYMAX      (5)

typedef struct{
   int row;
   int col;
}enemyposition_t ;
/***************************************************************************************************/
/* 呼び出し用 ***************************************************************************************/
void create_enemy(char display[DISPLAYROWMAX][DISPLAYCOLMAX], enemyposition_t position[] ,
int enemynum) ;

void move_enemy(char display[DISPLAYROWMAX][DISPLAYCOLMAX], enemyposition_t position[]);
/***************************************************************************************************/
void clear_screen(){
   int loopcnt_row ;

   for(loopcnt_row =0 ;loopcnt_row < DISPLAYROWMAX ;loopcnt_row++){
      printf("\x1b[2K");
      printf("\x1b[1F");
   }
}

void enemy_main(char display[DISPLAYROWMAX][DISPLAYCOLMAX], enemyposition_t position[],int *turncnt, char *enemycnt){
   int loopcnt_enemy ;

   *turncnt = 0;
   for(loopcnt_enemy = 0; loopcnt_enemy < ENEMYMAX ;loopcnt_enemy++){
      if(0 == position[loopcnt_enemy].row){
          if(' ' == display[1][3]){
             create_enemy(display, position, loopcnt_enemy);
          }
      }
         move_enemy(display, position);
   }
}

void create_enemy(char display[DISPLAYROWMAX][DISPLAYCOLMAX], enemyposition_t position[] ,int enemynum){

   position[enemynum].row = 1 ;
   position[enemynum].col = 0 ;

   display[position[enemynum].row][position[enemynum].col] = 'V' ;
   display[position[enemynum].row][position[enemynum].col +1] = '.' ;
   display[position[enemynum].row][position[enemynum].col +2] = '.' ;
   display[position[enemynum].row][position[enemynum].col +3] = 'V' ;
}

void move_enemy(char display[DISPLAYROWMAX][DISPLAYCOLMAX], enemyposition_t position[]){
   int loopcnt_enemy ;

   for(loopcnt_enemy = 0; loopcnt_enemy < ENEMYMAX ; loopcnt_enemy++){
      if(position[loopcnt_enemy].row != 0){
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col] = ' ' ;         //現在地クリア
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +1] = ' ' ;
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +2] = ' ' ;
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +3] = ' ' ;

         if(DISPLAYROWMAX -1 == position[loopcnt_enemy].row){
           ;
         }else if(66 == position[loopcnt_enemy].col){       //端まで来たら改行
            position[loopcnt_enemy].row += 1 ;
            position[loopcnt_enemy].col = 0 ;
         }else{                                   //それ以外は1マス進む
            position[loopcnt_enemy].col += 1 ;
         }

         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col] = 'V' ;
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +1] = '.' ;
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +2] = '.' ;
         display[position[loopcnt_enemy].row][position[loopcnt_enemy].col +3] = 'V' ;
      }
   }
}

int main(void){
   char display[DISPLAYROWMAX][DISPLAYCOLMAX] ;
   enemyposition_t position[ENEMYMAX]  = {0};
   int turncnt;
   char enemycnt;
   int loopcnt_row ;
   int loopcnt_col ;


   for(loopcnt_row = 0; loopcnt_row < DISPLAYROWMAX; loopcnt_row++){
      for(loopcnt_col = 0; loopcnt_col < DISPLAYCOLMAX; loopcnt_col++){
         if(loopcnt_row == 0 && loopcnt_col != DISPLAYCOLMAX -1){
            display[loopcnt_row][loopcnt_col] = '-';
         }else if(loopcnt_col == DISPLAYCOLMAX -1){
            display[loopcnt_row][loopcnt_col] = '\n';
         }else{
             display[loopcnt_row][loopcnt_col] = ' ';
         }
      }
   }

   while(1){
      if(0xFFFFFF == turncnt){
         enemy_main(display, position, &turncnt, &enemycnt) ;
         clear_screen();
         for(loopcnt_row = 0; loopcnt_row < DISPLAYROWMAX; loopcnt_row++){
            for(loopcnt_col = 0; loopcnt_col < DISPLAYCOLMAX; loopcnt_col ++){
               printf("%c", display[loopcnt_row][loopcnt_col]);
            }
         }
      }

   turncnt += 1;
   }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

カニを移動する際、

  • 現在位置に"    "(空白4つ)を置き
  • 位置をひとつズラして
  • そこに"V..V"を置く
    みたい。だとすると" V..V"(空白1つとカニ) が置かれる。
    それにより、カニの1つ手前を空白で書き潰すことになりゃせんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/06 15:07

    おっしゃるとおりでした!
    そこを修正したところ、待ち望んでいた動きをしてくれました!!
    本当にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る