もどる aの日記

プレイヤーデータプロフィール日記最近の出来事ダンジョンスコア紹介リンク
記事一覧新着ブログ人気ブログ

3×3マップ平均歩数 2013-12-07 10:46 a ★0★ 644 pv
以前やった時([リンク])はBASICだったが、Cを勉強したのでそちらで改めて計算。

平均だけじゃなく、分布も書けるよ!

◎実験条件とか
・プレイヤーは黄金つるはし+つるはしで完全直線移動
・階段、プレイヤーの配置位置は完全ランダム
→実際には画面の境界上に階段が来ることはない?
・プレイヤーは以下の優先順位で動く
1.見える範囲に階段があるなら最短距離で移動
2.現在位置から一番近い、まだ行ってない画面へ移動



1000万回シミュレーションして、平均は25.1135631歩
分布はこんなかんじ[リンク]で意外と変な形


以下プログラム

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10000000

int check(int *a){
int i,y=0,s;
for(i=0;i<2;i++){
if(a[i]<=10&&a[i+2]<=10){y++;continue;}
if(a[i]>=20&&a[i+2]>=20){y++;continue;}
if(a[i]>=10&&a[i]<=20&&a[i+2]>=10&&a[i+2]<=20){y++;continue;}
}
s=(y==2)?abs(a[0]-a[2])+abs(a[1]-a[3]):-1;
return s;
}
int main(void){
srand(time(NULL));
FILE *file;
int a[67]={},x[6],n,i,s,t,p[2],f;

for(n=0;n<N;n++){
for(i=0;i<4;i++)x[i]=rand()%29+1;
t=check(x);if(t!=-1){a[t]++;continue;}
for(i=0;i<2;i++){if(x[i]<15)x[i+4]=10;else(x[i+4]=20);}
for(i=0;i<2;i++)p[i]=abs(x[i]-x[i+4]);
if(p[0]<p[1]){f=0;s=p[0];x[0]=x[4];}else{f=1;s=p[1];x[1]=x[5];}
t=check(x);if(t!=-1){a[t+s]++;continue;}
s+=p[1-f];x[1-f]=x[5-f];
t=check(x);if(t!=-1){a[t+s]++;continue;}
x[0]=30-x[0];s+=10;t=check(x);if(t!=-1){a[t+s]++;continue;}
x[1]=30-x[1];s+=10;t=check(x);if(t!=-1){a[t+s]++;continue;}
x[0]=30-x[0];s+=10;t=check(x);if(t!=-1){a[t+s]++;continue;}
}
s=0;
file=fopen("test.txt","w");
for(n=0;n<67;n++){s+=a[n];fprintf(file,"%d %d\n",n,a[n]);}
fprintf(file,"%d\n",s/N);
fclose(file);
}

プレイヤー:
パスワード:
コメント: