ページ 1 / 1
質問ってわけではないんですが
Posted: 2007年2月19日(月) 12:57
by クロノクル
お久しぶりです。おかげさまで期末の課題は何とかなりました。
ところで疑問に思ったのですが、C言語でいわゆるミニゲーム集というのは作れるんですか?
もちろんアルゴリズムの構成がわかり、基本的な文章構成がわかっている状態を前提としていますが。
ちなみに進級課題は、簡単なシューティングにしようかと。RPG系はまだ無理っぽいので(笑)<!--2
二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:07
by holmes
#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:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:10
by Yuki
★★★★の部分を埋めろということなのかな?
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:22
by holmes
学校の授業で、二分木を使って(超)簡易人工知能を作ろうとしています。
たとえば、初期状態のコンピュータは犬と猫の情報しかもっていないと仮定して、(人間は"象"と答えてほしい)
COMP>4本足ですか?
USER>yes
COMP>ワンと鳴きますか?
USER>no
COMP>それは猫ですね?
USER>no
--------------------コンピュータはここまでの情報しか知りません。
ですが、コンピュータが知らない情報を人間が教えていくというプログラムを作ろうとしています。
続きで
COMP>それは何ですか?
USER>象です
COMP>象は猫とどこがちがいますか?
USER>鼻が長いです
"それは何ですか?"以降に入力した情報を利用して新たな二分木を自動で作成していきたいのです。
プログラムを終了したあとも情報を保持したいので、ファイル処理も利用しています。
学校で配られたプリントを参考にして上記の状態までは作ったのですが、★★★★となっている箇所には何を入れていいかわかりません。これだけの情報で埋めることができますか??
よろしくお願いします。
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:25
by holmes
>Yukiさん
早速のコメントありがとうございます。
件名を入力する際、Enterを2回押してしまい、中途半端な状態で書き込んでしまいました;
上にも書いたとおり、★★★★を埋めて欲しいのです。
よろしくお願いします。
この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:30
by Yuki
>この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??
<pre>タグでくくると良いですよ。
※<>は半角でお願いします。
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:41
by holmes
tab失敗しちゃいました;;
やっぱり素人はダメですね><
やってくださる方いましたらよろしくお願いします。。。
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 17:52
by Yuki
<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:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 18:02
by Yuki
>root=in(★★1★★);
>★★7★★(fp,★★8★★);
この箇所は、何をしたいかと、内部関数の仕様を見ればわかると思います。
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 18:11
by 管理人
<pre>と</pre>でソースコードを囲みます。
<>は半角で入力してください。
コードは編集しておきました。
Re:二分木で簡易人工知能??
Posted: 2007年2月27日(火) 18:25
by holmes
管理人さん、Yukiさんありがとうございます!!
やはりこれだけの情報では穴埋めは厳しいですかね;
Re:二分木で簡易人工知能??
Posted: 2007年2月28日(水) 09:44
by Yuki
#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しないとダメですよ。
Re:二分木で簡易人工知能??
Posted: 2007年2月28日(水) 23:20
by holmes
Yukiさん本当にありがとうございます!!
おかげで、何とかプログラムを完成させることができました。
本当にありがとうございました。
Re:二分木で簡易人工知能??
Posted: 2007年2月28日(水) 23:20
by holmes
マーク間違えました;解決!です!!
Re:二分木で簡易人工知能??
Posted: 2007年2月28日(水) 23:23
by 管理人
holmesさん、ありがとうございます。
記事やマークを間違えた時は「編集」から直す事が出来ますよ。