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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

902閲覧

clock関数を引数として使用する。また配列に使う。

houki

総合スコア22

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/19 08:58

前提・実現したいこと

迷路に時間制限の要素を加え、移動物体が一秒ごとに迷路に近づく、プログラムを作っています。
disp関数の一つ目のfor文もしくはその関数を呼び出すとき、またはその両方が間違っているようなのは確認しています。(=~.exeの動作を停止しました。)と出ますclock関数で時間を図り配列をズラシテいくやり方です。

発生している問題・エラーメッセージ

~.exeの動作を停止しました。

該当のソースコード

#include <stdio.h> #include <time.h> #define SIZE1 8 #define SIZE2 25 void disp_maze(int ar_x, int ar_y, int map[][SIZE2], int ar_time); clock_t t1, t2; int main(void) { char key, ch; int plx = 18, ply = 1; int map[SIZE1][SIZE2] = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1 }, { 0,0,0,0,3,0,0,3,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1 }, { 5,0,6,7,0,8,9,8,10,11,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1 }, { 0,0,0,0,6,12,13,12,11,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1 }, { 0,5,0,14,15,16,15,15,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,2,1 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 } }; printf("キーボードを入力した直後始まります.\n"); ch = getchar(); printf("よーいスタート!!\n\n"); t1 = clock(); while (1) { t2 = clock(); printf("Time:%d(s)\n\n",15-(t2-t1)); disp_maze(plx, ply, map, t2-t1); printf("←A →D ↑W ↓S>"); key = getchar(); ch = getchar(); t2 = clock(); if (t2-t1 >= 15) break;//ゲーム終了条件 if (key == 'a') { if (map[ply][plx - 1] == 1) { printf("×Miss!\n"); continue; } else { plx--; } } else if (key == 'd') { if (map[ply][plx + 1] == 1) { printf("×Miss!\n"); continue; } else { plx++; } } else if (key == 'w') { if (map[ply - 1][plx] == 1) { printf("×Miss!\n"); continue; } else { ply--; } } else if (key == 's') { if (map[ply + 1][plx] == 1) { printf("×Miss!\n"); continue; } else { ply++; } } else { printf("×Miss!\n"); continue; } if (map[ply][plx] == 2) break;//ゲーム終了条件 } if (t2 -t1 >= 15) { printf("Game Over\n"); } else printf("Stage Clear!!\n"); return 0; } void disp_maze(int ar_x, int ar_y, int ar_map[][SIZE2], int ar_time) { int counta; int countb; int count = ar_time; int position = 9;//ar_mapは常にリセットされるので、移動物の再右端は変わらない. if (ar_time >= 15) { ar_time = 15; } for (counta = 0; count < 8; counta++) { for (countb = position; countb >= 0; countb--) { ar_map[counta][countb + count] = ar_map[counta][countb];//右に時間数ずつ移動していく. } } for (counta = 0; counta < 8; counta++) { for (countb = 0; countb < 25; countb++) { if (counta == ar_y && countb == ar_x) { printf("○"); } else { switch (ar_map[counta][countb]) { case 1: printf("■"); break; case 2: printf("★"); break; case 0: printf(" "); break; case 3: printf("¥"); break; case 4: printf("_ "); break; case 5: printf("三"); break; case 6: printf(" ("); break; case 7: printf("`"); break; case 8: printf("・"); break; case 9: printf(" ω"); break; case 10: printf("´"); break; case 11: printf(") "); break; case 12: printf("O "); break; case 13: printf("T"); break; case 14: printf("- "); break; case 15: printf("◎"); break; case 16: printf("J"); break; } } } printf("\n"); } }

試したこと

clock関数でグローバル関数にした。

補足情報(FW/ツールのバージョンなど)

viual studio

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とりあえず、 disp_maze() の中のとある for 文が

c

1 for (counta = 0; count < 8; counta++) { 2 // ^^^^^ ここ counta でなくていいですか? 3 for (countb = position; countb >= 0; countb--) { 4 ar_map[counta][countb + count] = ar_map[counta][countb];//右に時間数ずつ移動していく. 5 6 } 7 }

となっていますので、修正すれば動作の停止は一旦なくなります。

投稿2018/07/19 09:08

編集2018/07/19 09:09
Eki

総合スコア429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

houki

2018/07/19 09:11

前回答者もおっしゃっていた通り、そうでした!
Eki

2018/07/19 09:18

すみません、書いている間に更新されていたようです... ちなみにですが、 clock() 関数の返す値の単位は秒ではないですよ (ご存知なら失礼しました。しきい値の 15 というのはあまりにも小さい気がしたので...) 。
houki

2018/07/19 09:21

厳密には秒として値をとる場合はどうするのが正しいいですか?
Eki

2018/07/19 09:29

clock() の返す値は 1 秒間で CLOCKS_PER_SEC だけ変化します。なので CLOCKS_PER_SEC で割ってやれば秒になります。 CLOCKS_PER_SEC というのは標準で定義されているものなのでそのまま使えます。 例 `15 * CLOCKS_PER_SEC` は 15 秒 精度や厳密さを求めるならいろいろ話は変わってきますが、とりあえずこの使い方で良いのではないでしょうか。
houki

2018/07/19 09:36

きちんと思った通りにいきました。ありがとうございました(笑顔)
guest

0

ベストアンサー

まず気のついたところを。

for (counta = 0; count < 8; counta++) {

条件のところがcount<8 になってます。これはcounta の間違いでしょうね

投稿2018/07/19 09:03

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

houki

2018/07/19 09:06

エラーメッセージがでなくなりました!
houki

2018/07/19 09:07

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問