質問ってわけではないんですが
質問ってわけではないんですが
お久しぶりです。おかげさまで期末の課題は何とかなりました。
ところで疑問に思ったのですが、C言語でいわゆるミニゲーム集というのは作れるんですか?
もちろんアルゴリズムの構成がわかり、基本的な文章構成がわかっている状態を前提としていますが。
ちなみに進級課題は、簡単なシューティングにしようかと。RPG系はまだ無理っぽいので(笑)<!--2
ところで疑問に思ったのですが、C言語でいわゆるミニゲーム集というのは作れるんですか?
もちろんアルゴリズムの構成がわかり、基本的な文章構成がわかっている状態を前提としていますが。
ちなみに進級課題は、簡単なシューティングにしようかと。RPG系はまだ無理っぽいので(笑)<!--2
二分木で簡易人工知能??
#include <stdio.h> #include <stdlib.h> #define NIL 0 #define YES 1 #define NO 0 struct OBJECT{ struct OBJECT *yn[2]; char *item; }; typedef struct OBJECT NODE; NODE *node_malloc(); NODE *add_node(NODE *kotae); void out(FILE *fp,NODE *thing); NODE *in(FILE *fp); main(){ NODE *root,*p,*thing; char ans[/url]="y",ansyn,file[256]; FILE *fp; printf("ファイルからデータを読み込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='n'){ root=node_malloc(); printf("最初の質問は何ですか?\n"); scanf("%s",root->item); thing=node_malloc(); root->yn[YES]=thing; printf("'YES'の時の答えは何ですか?\n"); scanf("%s",thing->item); thing=node_malloc(); root->yn[NO]=thing; printf("'NO'の時の答えは何ですか?\n"); scanf("%s",thing->item); } else{ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"r"))==NULL){ printf("%sを開けません\n",file); exit(0); } root=in(★★★★); fclose(fp); } ans[0]='y'; while(ans[0]=='y'){ thing=★★★★; while(thing->yn[0]!=NIL&&thing->yn[1]!=NIL){ ☆☆☆☆=thing; printf("%sか?[y/n]",thing->item); scanf("%s",ans); ansyn=★★★★; thing=thing->yn[ansyn]; } printf("それは%sか?[y/n]",thing->item); scanf("%s",ans); if(ans[0]=='n')★★★★->yn[★★★★]=add_node(thing); printf("続けますか?[y/n]"); scanf("%s",ans); } printf("データをファイルに書き込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='y'){ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"w"))==NULL){ printf("%sをオープンできない\n",file); exit(0); } ★★★★(fp,★★★★); fclose(fp); } } /*データの領域を確保する関数*/ NODE *node_malloc(){ NODE *n; if((n=malloc(sizeof(NODE)))==NULL){ printf("MEMORY ERROR\n"); exit(0); } if((n->item=malloc(sizeof(char)*256))==NULL){ printf("MEMORY ERROR\n"); exit(0); } n->[★★★★]=n->yn[★★★★]=NIL; return(n); } /*新しいデータを追加する関数*/ NODE *add_node(NODE *kotae){ NODE *quest,*child; child=node_malloc(); printf("それは何ですか?\n"); scanf("%s",child->item); printf("%sは%sとどこが違うのですか?\n",child->item,kotae->item); quest=node_malloc(); scanf("%s",quest_item); quest->yn[NO]=★★★★; quest->yn[YES]=★★★★; return(★★★★); } /*ファイルへ書き込む関数*/ void out(FILE *fp,NODE *thing){ fprintf(fp,"%d %s\n",thing->yn[YES]==NIL&&thing->yn[NO]==NIL,★★★★); if(thing->yn[YES]!=NIL)out(fp,★★★★); if(thing->yn[NO]!=NIL)out(fp,★★★★); } /*ファイルから入力する関数*/ NODE *in(FILE *fp){ int n; NODE *thing; thing=node_malloc(); fscanf(fp,"%d %s",&n,★★★★); if(n==0){ thing->yn[★★★★]=★★★★(fp); thing->yn[★★★★]=★★★★(fp); } return(★★★★); }
Re:二分木で簡易人工知能??
学校の授業で、二分木を使って(超)簡易人工知能を作ろうとしています。
たとえば、初期状態のコンピュータは犬と猫の情報しかもっていないと仮定して、(人間は"象"と答えてほしい)
COMP>4本足ですか?
USER>yes
COMP>ワンと鳴きますか?
USER>no
COMP>それは猫ですね?
USER>no
--------------------コンピュータはここまでの情報しか知りません。
ですが、コンピュータが知らない情報を人間が教えていくというプログラムを作ろうとしています。
続きで
COMP>それは何ですか?
USER>象です
COMP>象は猫とどこがちがいますか?
USER>鼻が長いです
"それは何ですか?"以降に入力した情報を利用して新たな二分木を自動で作成していきたいのです。
プログラムを終了したあとも情報を保持したいので、ファイル処理も利用しています。
学校で配られたプリントを参考にして上記の状態までは作ったのですが、★★★★となっている箇所には何を入れていいかわかりません。これだけの情報で埋めることができますか??
よろしくお願いします。
たとえば、初期状態のコンピュータは犬と猫の情報しかもっていないと仮定して、(人間は"象"と答えてほしい)
COMP>4本足ですか?
USER>yes
COMP>ワンと鳴きますか?
USER>no
COMP>それは猫ですね?
USER>no
--------------------コンピュータはここまでの情報しか知りません。
ですが、コンピュータが知らない情報を人間が教えていくというプログラムを作ろうとしています。
続きで
COMP>それは何ですか?
USER>象です
COMP>象は猫とどこがちがいますか?
USER>鼻が長いです
"それは何ですか?"以降に入力した情報を利用して新たな二分木を自動で作成していきたいのです。
プログラムを終了したあとも情報を保持したいので、ファイル処理も利用しています。
学校で配られたプリントを参考にして上記の状態までは作ったのですが、★★★★となっている箇所には何を入れていいかわかりません。これだけの情報で埋めることができますか??
よろしくお願いします。
Re:二分木で簡易人工知能??
>Yukiさん
早速のコメントありがとうございます。
件名を入力する際、Enterを2回押してしまい、中途半端な状態で書き込んでしまいました;
上にも書いたとおり、★★★★を埋めて欲しいのです。
よろしくお願いします。
この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??
早速のコメントありがとうございます。
件名を入力する際、Enterを2回押してしまい、中途半端な状態で書き込んでしまいました;
上にも書いたとおり、★★★★を埋めて欲しいのです。
よろしくお願いします。
この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??
Re:二分木で簡易人工知能??
>この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??
<pre>タグでくくると良いですよ。
※<>は半角でお願いします。
<pre>タグでくくると良いですよ。
※<>は半角でお願いします。
Re:二分木で簡易人工知能??
<pre>
このようにくくります。
わかりやすいように★に番号をつけました。
#include <stdio.h> #include <stdlib.h> #define NIL 0 #define YES 1 #define NO 0 struct OBJECT{ struct OBJECT *yn[2]; char *item; }; typedef struct OBJECT NODE; NODE *node_malloc(); NODE *add_node(NODE *kotae); void out(FILE *fp,NODE *thing); NODE *in(FILE *fp); main(){ NODE *root,*p,*thing; char ans[/url]="y",ansyn,file[256]; FILE *fp; printf("ファイルからデータを読み込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='n'){ root=node_malloc(); printf("最初の質問は何ですか?\n"); scanf("%s",root->item); thing=node_malloc(); root->yn[YES]=thing; printf("'YES'の時の答えは何ですか?\n"); scanf("%s",thing->item); thing=node_malloc(); root->yn[NO]=thing; printf("'NO'の時の答えは何ですか?\n"); scanf("%s",thing->item); } else{ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"r"))==NULL){ printf("%sを開けません\n",file); exit(0); } root=in(★★1★★); fclose(fp); } ans[0]='y'; while(ans[0]=='y'){ thing=★★2★★; while(thing->yn[0]!=NIL&&thing->yn[1]!=NIL){ ★★3★★=thing; printf("%sか?[y/n]",thing->item); scanf("%s",ans); ansyn=★★4★★; thing=thing->yn[ansyn]; } printf("それは%sか?[y/n]",thing->item); scanf("%s",ans); if(ans[0]=='n')★★5★★->yn[★★6★★]=add_node(thing); printf("続けますか?[y/n]"); scanf("%s",ans); } printf("データをファイルに書き込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='y'){ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"w"))==NULL){ printf("%sをオープンできない\n",file); exit(0); } ★★7★★(fp,★★8★★); fclose(fp); } } /*データの領域を確保する関数*/ NODE *node_malloc(){ NODE *n; if((n=malloc(sizeof(NODE)))==NULL){ printf("MEMORY ERROR\n"); exit(0); } if((n->item=malloc(sizeof(char)*256))==NULL){ printf("MEMORY ERROR\n"); exit(0); } n->[★★9★★]=n->yn[★★10★★]=NIL; return(n); } /*新しいデータを追加する関数*/ NODE *add_node(NODE *kotae){ NODE *quest,*child; child=node_malloc(); printf("それは何ですか?\n"); scanf("%s",child->item); printf("%sは%sとどこが違うのですか?\n",child->item,kotae->item); quest=node_malloc(); scanf("%s",quest_item); quest->yn[NO]=★★11★★; quest->yn[YES]=★★12★★; return(★★13★★); } /*ファイルへ書き込む関数*/ void out(FILE *fp,NODE *thing){ fprintf(fp,"%d %s\n",thing->yn[YES]==NIL&&thing->yn[NO]==NIL,★★14★★); if(thing->yn[YES]!=NIL)out(fp,★★15★★); if(thing->yn[NO]!=NIL)out(fp,★★16★★); } /*ファイルから入力する関数*/ NODE *in(FILE *fp){ int n; NODE *thing; thing=node_malloc(); fscanf(fp,"%d %s",&n,★★17★★); if(n==0){ thing->yn[★★18★★]=★★19★★(fp); thing->yn[★★20★★]=★★21★★(fp); } return(★★22★★); }</pre>
このようにくくります。
わかりやすいように★に番号をつけました。
Re:二分木で簡易人工知能??
#include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <stdlib.h> #define NIL 0 #define YES 1 #define NO 0 struct OBJECT{ struct OBJECT *yn[2]; char *item; }; typedef struct OBJECT NODE; NODE *node_malloc(); NODE *add_node(NODE *kotae); void out(FILE *fp,NODE *thing); NODE *in(FILE *fp); main(){ NODE *root,*p,*thing; char ans[/url]="y",ansyn,file[256]; FILE *fp; printf("ファイルからデータを読み込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='n'){ root=node_malloc(); printf("最初の質問は何ですか?\n"); scanf("%s",root->item); thing=node_malloc(); root->yn[YES]=thing; printf("'YES'の時の答えは何ですか?\n"); scanf("%s",thing->item); thing=node_malloc(); root->yn[NO]=thing; printf("'NO'の時の答えは何ですか?\n"); scanf("%s",thing->item); } else{ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"r"))==NULL){ printf("%sを開けません\n",file); exit(0); } // root=in(★★★★); root=in(fp); fclose(fp); } ans[0]='y'; while(ans[0]=='y'){ // thing=★★★★; thing=root; while(thing->yn[0]!=NIL&&thing->yn[1]!=NIL){ // ☆☆☆☆=thing; p=thing; printf("%sか?[y/n]",thing->item); scanf("%s",ans); // ansyn=★★★★; if(ans[0] == 'y'){ ansyn=YES; } else{ ansyn=NO; } thing=thing->yn[ansyn]; } printf("それは%sか?[y/n]",thing->item); scanf("%s",ans); // if(ans[0]=='n')★★★★->yn[★★★★]=add_node(thing); if(ans[0]=='n')p->yn[NO]=add_node(thing); printf("続けますか?[y/n]"); scanf("%s",ans); } printf("データをファイルに書き込みますか?[y/n]"); scanf("%s",ans); if(ans[0]=='y'){ printf("ファイル名:"); scanf("%s",file); if((fp=fopen(file,"w"))==NULL){ printf("%sをオープンできない\n",file); exit(0); } // ★★★★(fp,★★★★); out(fp,root); fclose(fp); } } /*データの領域を確保する関数*/ NODE *node_malloc(){ NODE *n; if((n=malloc(sizeof(NODE)))==NULL){ printf("MEMORY ERROR\n"); exit(0); } if((n->item=malloc(sizeof(char)*256))==NULL){ printf("MEMORY ERROR\n"); exit(0); } // n->[★★★★]=n->yn[★★★★]=NIL; n->yn[YES]=n->yn[NO]=NIL; return(n); } /*新しいデータを追加する関数*/ NODE *add_node(NODE *kotae){ NODE *quest,*child; child=node_malloc(); printf("それは何ですか?\n"); scanf("%s",child->item); printf("%sは%sとどこが違うのですか?\n",child->item,kotae->item); quest=node_malloc(); // scanf("%s",quest_item); // quest_itemが何かわからないのでコメントアウト // quest->yn[NO]=★★★★; quest->yn[NO]=quest; // quest->yn[YES]=★★★★; quest->yn[YES]=kotae; return(child); } /*ファイルへ書き込む関数*/ void out(FILE *fp,NODE *thing){ // fprintf(fp,"%d %s\n",thing->yn[YES]==NIL&&thing->yn[NO]==NIL,★★★★); fprintf(fp,"%d %s\n",thing->yn[YES]==NIL&&thing->yn[NO]==NIL,thing->item); // if(thing->yn[YES]!=NIL)out(fp,★★★★); if(thing->yn[YES]!=NIL)out(fp,thing->yn[YES]); // if(thing->yn[NO]!=NIL)out(fp,★★★★); if(thing->yn[NO]!=NIL)out(fp,thing->yn[NO]); } /*ファイルから入力する関数*/ NODE *in(FILE *fp){ int n; NODE *thing; thing=node_malloc(); // fscanf(fp,"%d %s",&n,★★★★); fscanf(fp,"%d %s",&n,thing->item); if(n==0){ // thing->yn[★★★★]=★★★★(fp); thing->yn[YES]=in(fp); // thing->yn[★★★★]=★★★★(fp); thing->yn[NO]=in(fp); } return(thing); }とりあえず埋めてみました。
quest_itemが何かわからないのでコメントアウトしました。
mallocした領域は使い終わったらfreeしないとダメですよ。