[川渡りゲーム]
・舟に乗せられるのは農夫の他に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;
}