質問ってわけではないんですが

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クロノクル

質問ってわけではないんですが

#1

投稿記事 by クロノクル » 18年前

お久しぶりです。おかげさまで期末の課題は何とかなりました。
ところで疑問に思ったのですが、C言語でいわゆるミニゲーム集というのは作れるんですか?
もちろんアルゴリズムの構成がわかり、基本的な文章構成がわかっている状態を前提としていますが。

ちなみに進級課題は、簡単なシューティングにしようかと。RPG系はまだ無理っぽいので(笑)<!--2

holmes

二分木で簡易人工知能??

#2

投稿記事 by holmes » 18年前

#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(★★★★);
}

Yuki

Re:二分木で簡易人工知能??

#3

投稿記事 by Yuki » 18年前

★★★★の部分を埋めろということなのかな?

holmes

Re:二分木で簡易人工知能??

#4

投稿記事 by holmes » 18年前

学校の授業で、二分木を使って(超)簡易人工知能を作ろうとしています。
たとえば、初期状態のコンピュータは犬と猫の情報しかもっていないと仮定して、(人間は"象"と答えてほしい)
COMP>4本足ですか?
USER>yes
COMP>ワンと鳴きますか?
USER>no
COMP>それは猫ですね?
USER>no
--------------------コンピュータはここまでの情報しか知りません。
ですが、コンピュータが知らない情報を人間が教えていくというプログラムを作ろうとしています。
続きで
COMP>それは何ですか?
USER>象です
COMP>象は猫とどこがちがいますか?
USER>鼻が長いです

"それは何ですか?"以降に入力した情報を利用して新たな二分木を自動で作成していきたいのです。
プログラムを終了したあとも情報を保持したいので、ファイル処理も利用しています。
学校で配られたプリントを参考にして上記の状態までは作ったのですが、★★★★となっている箇所には何を入れていいかわかりません。これだけの情報で埋めることができますか??
よろしくお願いします。

holmes

Re:二分木で簡易人工知能??

#5

投稿記事 by holmes » 18年前

>Yukiさん
早速のコメントありがとうございます。
件名を入力する際、Enterを2回押してしまい、中途半端な状態で書き込んでしまいました;
上にも書いたとおり、★★★★を埋めて欲しいのです。
よろしくお願いします。


この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??

Yuki

Re:二分木で簡易人工知能??

#6

投稿記事 by Yuki » 18年前

>この掲示板でプログラムを投稿する際にTabをちゃんと表示させる方法とかありますか??

<pre>タグでくくると良いですよ。
※<>は半角でお願いします。

holmes

Re:二分木で簡易人工知能??

#7

投稿記事 by holmes » 18年前

tab失敗しちゃいました;;
やっぱり素人はダメですね><
やってくださる方いましたらよろしくお願いします。。。

Yuki

Re:二分木で簡易人工知能??

#8

投稿記事 by Yuki » 18年前

<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>

このようにくくります。

わかりやすいように★に番号をつけました。

Yuki

Re:二分木で簡易人工知能??

#9

投稿記事 by Yuki » 18年前

>root=in(★★1★★);
>★★7★★(fp,★★8★★);

この箇所は、何をしたいかと、内部関数の仕様を見ればわかると思います。

管理人

Re:二分木で簡易人工知能??

#10

投稿記事 by 管理人 » 18年前

<pre>と</pre>でソースコードを囲みます。
<>は半角で入力してください。
コードは編集しておきました。

holmes

Re:二分木で簡易人工知能??

#11

投稿記事 by holmes » 18年前

管理人さん、Yukiさんありがとうございます!!


やはりこれだけの情報では穴埋めは厳しいですかね;

Yuki

Re:二分木で簡易人工知能??

#12

投稿記事 by Yuki » 18年前

#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しないとダメですよ。

holmes

Re:二分木で簡易人工知能??

#13

投稿記事 by holmes » 18年前

Yukiさん本当にありがとうございます!!
おかげで、何とかプログラムを完成させることができました。
本当にありがとうございました。

holmes

Re:二分木で簡易人工知能??

#14

投稿記事 by holmes » 18年前

マーク間違えました;解決!です!!

管理人

Re:二分木で簡易人工知能??

#15

投稿記事 by 管理人 » 18年前

holmesさん、ありがとうございます。
記事やマークを間違えた時は「編集」から直す事が出来ますよ。

閉鎖

“C言語何でも質問掲示板” へ戻る