川渡りゲーム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mamedama
記事: 2
登録日時: 5年前

川渡りゲーム

#1

投稿記事 by mamedama » 5年前

大学の課題のプログラムができなくて困っています。とあるプログラムを参考にしましたがうまく実行結果が表示できませんでした。自分なりにやってみたプログラムは下記にあります。C言語については習い始めの初心者です。追加や変更点のアドバイスがもらえると幸いです。コンパイラはcgwinになります。よろしくお願いします。
[川渡りゲーム] 
・舟に乗せられるのは農夫の他に1アイテムだけである(狼、山羊、キャベツのどれか)
・農夫がいない場所で、狼と山羊が一緒にいると、狼が山羊を食べてしまう。
・農夫がいない場所で、山羊とキャベツを一緒においておくと、山羊がキャベツを食べてしまう。
・舟は空(から)で動かしても構わない。(農夫だけが移動)
このゲームを以下の仕様で作成せよ。
①農夫が次に運ぶアイテムを番号で選ぶ。(0:農夫のみ 1:狼 2:山羊 3:キャベツ )
② ①で選択ミスがあった場合には選択をやり直させる。
③移動のたびに、現在の川のあっちとこっちの様子を画面に表示、さらにファイルに記録せよ。
(ファイルその1)
④移動に失敗する選択をした場合には、どんな失敗かを表示させゲームオーバーとする。
⑤何ステップでゲームクリアorオーバーになったかを記録せよ。(ファイルその2)
⑥それまでにどんな手をつかったかを記録し、まとめて表示、さらにファイルに記録せよ。(ファイルその2)

コード:

#include<stdio.h>
#include<stdlib.h>

#define MAN      0
#define WOLF     1
#define GOAT     2
#define CABBAGE  3  

#define SearchMax  20

int left_side [SearchMax] [ 4 ];  
int right_side [SearchMax] [ 4 ];  


void  print_state(int state [ 4 ])
{
	
	
	
	printf(" [ ");
	if(state [ 0 ] == 1){
		printf("農夫");
	}
	if(state [ 1 ] == 1){
		printf("狼");
	}
	if(state [ 2 ] == 1){
		printf("山羊");
	}
	if(state [ 3 ] == 1){
		printf("キャベツ");
	}
	printf(" ] ");
}

void  print_ans(int T)
{
	int t;
	

	for(t = 0 ; t <= T; t ++){
		
		printf("%d:",t);
		print_state(left_side [t]); 
		print_state(right_side [t]); 
		printf("\n"); 
	}
}


int  check_state(int T,int state [ 4 ],int past_state [SearchMax] [ 4 ]){
	int i,t;
	int count;

	
	if((state [ 1 ] && state [ 2 ])== 1 || (state [ 2 ] && state [ 3 ])== 1){
		 return 0;
	}


	
	for(t = 0 ; t <T; t ++){
		count = 0 ; 
		
		for(i = 0 ; i < 4 ; i ++){
			
			if(past_state [t] [i] == state [i]){
				count ++;
			}
		}
		if(count == 4){ 
			 return 0;
		}
		
	
	}
	
	 return 1 ;
}

void  search(int T,int src_side [SearchMax] [ 4 ],int dest_side [SearchMax] [ 4 ]){
	int i,j;

	int src_state [ 4 ];     
	int dest_state [ 4 ];     
	int new_src_state [ 4 ]; 
	int new_dest_state [ 4 ]; 

					
	for(i = 0 ; i < 4 ; i ++){
		src_state [i] = src_side [T] [i];
		dest_state [i] = dest_side [T] [i];
	}

	for(i = 0 ; i < 4 ; i ++){ 
		if(src_state [i] == 1){ 

			
			for(j = 0 ; j < 4 ; j ++){
				new_src_state [j] = src_state [j];
				new_dest_state [j] = dest_state [j];
			}
			
			new_src_state [ 0 ] = 0 ;
			new_dest_state [ 0 ] = 1 ;
			new_src_state [i] = 0 ;
			new_dest_state [i] = 1 ;

			if(check_state(T,new_src_state,src_side)){
				
				if(T%2 == 0){
					
					for(j = 0 ; j < 4 ; j ++){
					left_side [T + 1 ] [j] = new_src_state [j];
					right_side [T + 1 ] [j] = new_dest_state [j];
					}
				}
				
				else {
					for(j = 0 ; j < 4 ; j ++){
					right_side [T + 1 ] [j] = new_src_state [j];
					left_side [T + 1 ] [j] = new_dest_state [j];
					}
				}
				
				if(right_side [T + 1 ] [ 0 ] == 1 &&
					right_side [T + 1 ] [ 1 ] == 1 &&
					right_side [T + 1 ] [ 2 ] == 1 &&
					right_side [T + 1 ] [ 3 ] == 1){
					print_ans(T + 1);
					exit(0);
				}
				
				else{
					search(T + 1,dest_side,src_side);
				}
			}
		}
	}
}

int main()
{
	int i,t;

	for(t = 0 ; t <SearchMax; t ++){
		for(i = 0 ; i < 4 ; i ++){
			left_side [t] [i] = -1 ;
			right_side [t] [i] = -1 ;
		}
	}

	for(i = 0 ; i < 4 ; i ++){
		left_side [ 0 ] [i] = 1 ;
		right_side [ 0 ] [i] = 0 ;
	}

	search(0,left_side,right_side);

	 return 0;
}

アバター
あたっしゅ
記事: 667
登録日時: 15年前
住所: 東京23区
連絡を取る:

Re: 川渡りゲーム

#2

投稿記事 by あたっしゅ » 5年前

「川渡り」だったり「」だったり、「ゲーム」だったり「問題」だったり。


https://ja.wikipedia.org/wiki/%E5%B7%9D ... F%E9%A1%8C
川渡り問題 - ジャパリ図書館(ja)

http://www.slis.tsukuba.ac.jp/~hiraga.y ... c/#S_boat1
人工知能論プログラム例(ja)

viewtopic.php?t=7490
C言語での河渡りの問題 - プログラマ専用SNS ミクプラ(ja)

viewtopic.php?f=3&t=13624&p=109051&hili ... A0#p109051
川渡り問題 - プログラマ専用SNS ミクプラ(ja)

viewtopic.php?f=3&t=20948
川渡りゲーム - プログラマ専用SNS ミクプラ(ja)
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

mamedama
記事: 2
登録日時: 5年前

Re: 川渡りゲーム

#3

投稿記事 by mamedama » 5年前

あたっしゅ さん
情報提供ありがとうございます。
いただいた参考になるサイトを見て頑張ってやってみます。

アバター
あたっしゅ
記事: 667
登録日時: 15年前
住所: 東京23区
連絡を取る:

Re: 川渡りゲーム

#4

投稿記事 by あたっしゅ » 5年前

「『川渡り』だったり『』だったり」は、「『川渡り』だったり『河渡り』だったり」ね。
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

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