課題の質問
課題の質問
初めて投稿させていただきます。
早速なんですが、課題が分からず質問させていただきます。
[1本の道に,食べ物が多数落ちている.
ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.
<仕様>
「道」は要素数20程度の1次元配列で表現する.
「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする.
「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる.
「動物」の訪れた場所のエサは食べられたものとする.
「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する.
繰り返し処理中は,毎回数十~数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.
余力があれば,cursesライブラリを使用して,毎回コンソール内の同じ箇所にスクロール無しで表示できるようにする.]
という問題なんですが、どうぞよろしくお願いします。
ちなみに配列まで習っており、標準ライブラリはまだ習ってません。
早速なんですが、課題が分からず質問させていただきます。
[1本の道に,食べ物が多数落ちている.
ランダムに動く動物が,それらを全て食べ尽くすと終了するようなプログラムを作成せよ.
<仕様>
「道」は要素数20程度の1次元配列で表現する.
「食べ物」は,上記配列の各要素に値1があればその場所に存在し,値0であればその場所には存在しないものとする.
「動物」は,1回の移動で配列中の1つ左または1つ右に移動できる.
「動物」の訪れた場所のエサは食べられたものとする.
「道のうち食べ物のない箇所」,「道のうち食べ物のある箇所」,「動物」は,それぞれ -, *, O で表現する.それらを横一列の文字で表示する.
繰り返し処理中は,毎回数十~数百ミリ秒程度の時間,実行を一時停止させることで,状態の推移を見やすくする.
余力があれば,cursesライブラリを使用して,毎回コンソール内の同じ箇所にスクロール無しで表示できるようにする.]
という問題なんですが、どうぞよろしくお願いします。
ちなみに配列まで習っており、標準ライブラリはまだ習ってません。
Re:課題の質問
いろいろなヒントを元に、
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define TABEMONO 20
int main(void)
{
int miti[TABEMONO];
int i,n,doubutu, tabemono=TABEMONO;
time_t t1,t2;
srand(time(NULL));
/*毒饅頭を全体に置く、毒が弱いので20個食べないと死なない*/
for(n=0;n<TABEMONO;n++) miti[n]=1;
/*動物を放す*/
doubutu=(rand()%19);
i=1;
while(tabemono>0){/*毒饅頭置いてある間は続ける*/*/
/*現在の状況を表示、動物に居る所に毒饅頭があれば食べる(毒饅頭が1個減る)。*/
printf("%5d:",i++);
for(n=0;n<TABEMONO;n++){
if(n==doubutu){
if(miti[n]!=0){
tabemono--;
miti[n]=0;
}
printf("○");
miti[n]=0;
}
else if(miti[n]==1)printf("*");
else printf("-");
}
if(doubutu==0)doubutu++;/*左端だから右にしかいけない*/
else if(doubutu==TABEMONO)doubutu--;/*右端だから以下省略*/
else if(rand()%2==0) doubutu++;/*端じゃないなら乱数で行く方向を決める*/
else doubutu--;
printf("\n");
/*------------*------------------*---------------*----------
ここに一時停止するコードを入れる
---------------------------*---------------*--------------*/
}
return 0;
}
といった感じまでは仕上がったんですが、「一時停止するコード」がどうしても分かりませんでした。
この部分を何とかお願いしたいのですが・・・
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define TABEMONO 20
int main(void)
{
int miti[TABEMONO];
int i,n,doubutu, tabemono=TABEMONO;
time_t t1,t2;
srand(time(NULL));
/*毒饅頭を全体に置く、毒が弱いので20個食べないと死なない*/
for(n=0;n<TABEMONO;n++) miti[n]=1;
/*動物を放す*/
doubutu=(rand()%19);
i=1;
while(tabemono>0){/*毒饅頭置いてある間は続ける*/*/
/*現在の状況を表示、動物に居る所に毒饅頭があれば食べる(毒饅頭が1個減る)。*/
printf("%5d:",i++);
for(n=0;n<TABEMONO;n++){
if(n==doubutu){
if(miti[n]!=0){
tabemono--;
miti[n]=0;
}
printf("○");
miti[n]=0;
}
else if(miti[n]==1)printf("*");
else printf("-");
}
if(doubutu==0)doubutu++;/*左端だから右にしかいけない*/
else if(doubutu==TABEMONO)doubutu--;/*右端だから以下省略*/
else if(rand()%2==0) doubutu++;/*端じゃないなら乱数で行く方向を決める*/
else doubutu--;
printf("\n");
/*------------*------------------*---------------*----------
ここに一時停止するコードを入れる
---------------------------*---------------*--------------*/
}
return 0;
}
といった感じまでは仕上がったんですが、「一時停止するコード」がどうしても分かりませんでした。
この部分を何とかお願いしたいのですが・・・
Re:課題の質問
私なら、こうするというものを載せてみます。変数名等も全て私の好みでつけましたので、参考程度に…
Windows上での動作は確認しましたが、Linuxでは分かりません。標準関数しか使っていないので、多分大丈夫だとは思いますけど…(^_^;)
Windows上での動作は確認しましたが、Linuxでは分かりません。標準関数しか使っていないので、多分大丈夫だとは思いますけど…(^_^;)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define WAIT 100 /* ミリ秒単位で一時停止時間を指定する */ int main(void) { char szWay[21]; int i, nAnimal, nFood, nWay[20]; clock_t ctStart, ctEnd; /* 乱数生成の為の前準備 */ srand((unsigned)time(NULL)); /* 道の上に食べ物を配置する */ for (i = 0; i < 20; i++) nWay = 1; /* 食べ物の数を初期化する */ nFood = 20; /* 動物の初期位置の決定 */ nAnimal = rand() % 20; /* 食べ物の数が0以上の間、ループさせる */ do { /* 動物の位置と同じ位置に食べ物がある場合には、食べ物のカウントを1つ減らす */ if (nWay[nAnima[/url] == 1) nFood--; /* 道の配列へ動物が居る位置を格納する */ nWay[nAnima[/url] = 2; /* 道の表示用の文字列を作成する */ for (i = 0; i < 20; i++) { switch (nWay) { case 0: szWay = '_'; break; case 1: szWay = '*'; break; case 2: szWay = 'O'; break; } } /* 文字列の終端に終端記号を追加する */ szWay[20] = '\0'; /* 道を表示する */ printf("%s\r", szWay); /* 動物の移動処理 */ nWay[nAnima[/url] = 0; if (rand() % 2 == 0) { nAnimal++; } else { nAnimal--; } if (nAnimal < 0) nAnimal = 19; if (nAnimal > 19) nAnimal = 0; /* 一時停止処理用タイマー */ ctStart = clock(); do { ctEnd = clock(); } while (ctEnd - ctStart <= WAIT); } while (nFood > 0); return 0; }
Re:課題の質問
ごめん。インデント崩れた。あと最後にmoveが無かった。
良ければ上のをけしといて。
良ければ上のをけしといて。
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <curses.h> void init_load(int* load, int size) { int i; for (i = 0; i < size; ++i) { load = rand() / (RAND_MAX / 2); } } void print_load(int* load, int size) { int i; static char disp[/url] = {'-', '*', '0'}; for (i = 0; i < size; ++i) { printw("%c", disp[load]); } printw(" food: %d\n", count_food(load, size)); } int move_animal(int* load, int size, int pos) { load[pos] = 0; if (rand() / (RAND_MAX / 2)) ++pos; else --pos; if (pos < 0) pos = size -1; else if (pos > size -1) pos = 0; load[pos] = 2; return pos; } int count_food(int* load, int size) { int i; int food = 0; for (i = 0; i < size; ++i) { if (load == 1) ++food; } return food; } int main(int argc, char* argv[/url]) { int *load; int size; int pos; WINDOW* win; if (argc != 2) { printf("%s num\n", argv[0]); return 1; } size = strtol(argv[1], NULL, 10); if (!size) return 1; load = (int*)calloc(size, sizeof(int)); if (!load) return 1; win = initscr(); srand(time(NULL)); init_load(load, size); pos = rand() / (RAND_MAX / size); while (count_food(load, size) != 0) { move(1, 1); print_load(load, size); pos = move_animal(load, size, pos); wrefresh(win); usleep(100000); } move(1, 1); print_load(load, size); wrefresh(win); usleep(100000); endwin(); return 0; }