エンカウント
Re:エンカウント
>エンカウント率 (%) = 100 / 戦闘後、次の敵に遭遇するまでの平均歩数
この式は、あくまでエンカウント率ですのでエンカウント処理に使う事自体間違ってます。
もしエンカウント率20%で計算していたら、ほぼ100%5歩でエンカウントします。
だって、1歩20%の確率なら5歩で100%じゃないですか。
※実際には違いますが、体感上はほぼ100%のはずです。
そうですね。一番楽な方法は、次のエンカウントまでの歩数を先に計算してしまうことです。
バトル終了時にエンカウントするまでの歩数を決めてしまいましょう。
エンカウントする歩数 = 3 + 乱数(0~4)
とすれば平均5歩でエンカウントするはずです。
※ちなみに3は、短い歩数でエンカウントしないための底上げ歩数です。
他にもエンカウント計算は色々工夫しがいのあるポイントです。
プログラムのアルゴリズムの勉強にもなるので色々考えてみて下さい。
私のアイデアを書いておきます。
・一歩ごとにエンカウント率が上がっていくエンカウントシステム。
・見えない敵のいるポイントを乱数で決めておいて接触したらエンカウント。
・直進するとエンカウント率が下がり、曲がった直後だけエンカウント率が上がるシステム。
ただ、5歩はエンカウント率が高すぎる気がすますね。
実際に作って調整してみてくださいとしか言えませんが。
この式は、あくまでエンカウント率ですのでエンカウント処理に使う事自体間違ってます。
もしエンカウント率20%で計算していたら、ほぼ100%5歩でエンカウントします。
だって、1歩20%の確率なら5歩で100%じゃないですか。
※実際には違いますが、体感上はほぼ100%のはずです。
そうですね。一番楽な方法は、次のエンカウントまでの歩数を先に計算してしまうことです。
バトル終了時にエンカウントするまでの歩数を決めてしまいましょう。
エンカウントする歩数 = 3 + 乱数(0~4)
とすれば平均5歩でエンカウントするはずです。
※ちなみに3は、短い歩数でエンカウントしないための底上げ歩数です。
他にもエンカウント計算は色々工夫しがいのあるポイントです。
プログラムのアルゴリズムの勉強にもなるので色々考えてみて下さい。
私のアイデアを書いておきます。
・一歩ごとにエンカウント率が上がっていくエンカウントシステム。
・見えない敵のいるポイントを乱数で決めておいて接触したらエンカウント。
・直進するとエンカウント率が下がり、曲がった直後だけエンカウント率が上がるシステム。
ただ、5歩はエンカウント率が高すぎる気がすますね。
実際に作って調整してみてくださいとしか言えませんが。
Re:エンカウント
いや、それほど難しくないですよ。
まず、
エンカウントする歩数 = 3 + 乱数(0~4)
でエンカウントする歩数を求めます。
あとは、一歩歩くごとにエンカウントする歩数から1を引いていって0になればエンカウント成立でバトル開始です。
残念ですが炒飯さんのプログラムがどうなっているか分からない以上は、これ以上のコードは書けません。
それと初心者が一番挑戦してはいけないゲーム開発はRPGと戦略シミュレーションだと思います。
なにせ作るプログラムが多い&前提とする知識が多い&ツールを作らないと手作業ではやることが多すぎるのでツール作れる技量が必要。と言う2D系ゲームで難易度最上級のプログラミング開発力が必要です。
私は経験からアクションゲーム、シューティングゲーム、アドベンチャーゲームを全て自力で作れない人にはRPGは難しすぎると思いますよ。作りたいのは止めはしませんが、地道に力を付けないと挫折します。
挫折している例(技量不足で挫折したのでは無いと思いますが。やることが多くて挫折した例かな?)。
http://inu.harisen.jp/top.html
まず、
エンカウントする歩数 = 3 + 乱数(0~4)
でエンカウントする歩数を求めます。
あとは、一歩歩くごとにエンカウントする歩数から1を引いていって0になればエンカウント成立でバトル開始です。
残念ですが炒飯さんのプログラムがどうなっているか分からない以上は、これ以上のコードは書けません。
それと初心者が一番挑戦してはいけないゲーム開発はRPGと戦略シミュレーションだと思います。
なにせ作るプログラムが多い&前提とする知識が多い&ツールを作らないと手作業ではやることが多すぎるのでツール作れる技量が必要。と言う2D系ゲームで難易度最上級のプログラミング開発力が必要です。
私は経験からアクションゲーム、シューティングゲーム、アドベンチャーゲームを全て自力で作れない人にはRPGは難しすぎると思いますよ。作りたいのは止めはしませんが、地道に力を付けないと挫折します。
挫折している例(技量不足で挫折したのでは無いと思いますが。やることが多くて挫折した例かな?)。
http://inu.harisen.jp/top.html
Re:エンカウント
では一番簡単そうなDixqさんの考え方で書いてみます。
僕もどちらかというと初心者なので、softyaさんの回答があればきっとソッチの方がスマートです。
キャラの構造体の中に歩数をカウントする変数を追加する。
char.pedometer = 0;
マジックナンバーになりそうなエンカウント率をdefine(マクロ使いたくないけど、とりあえず)
#define ENCOUNT 5
といっても、これが歩数になるわけではないので、あくまで目安
ついでにエンカウントしない歩数は決めておく(これは確定)
大体これだと5、6歩に一回エンカウントするくらいですね。
#追記
コード書いてる間にsoftyaさんの投稿がありましたが、確かにエンカウントする歩数を先に決めた方が断然わかりやすいと僕は思うので、そっちで書いた方がよさそうですね。

僕もどちらかというと初心者なので、softyaさんの回答があればきっとソッチの方がスマートです。
キャラの構造体の中に歩数をカウントする変数を追加する。
char.pedometer = 0;
マジックナンバーになりそうなエンカウント率をdefine(マクロ使いたくないけど、とりあえず)
#define ENCOUNT 5
といっても、これが歩数になるわけではないので、あくまで目安
ついでにエンカウントしない歩数は決めておく(これは確定)
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ENCOUNT 5 #define DES_ENCOUNT 2 int main(){ int petometor =0; int count =0; int ave = 0;//平均計算用 srand((unsigned)time(NULL)); for(count=1;count<100;count++){ if(petometor>=ENCOUNT + DES_ENCOUNT || rand()%ENCOUNT == (petometor-DES_ENCOUNT)){ puts("encount!!"); petometor = 0; ave++; //平均計算用 continue; } puts("..walking..."); petometor++ ; } printf("エンカウント率は%d\%\n",ave); printf("大体%d歩に一回エンカウントします",100/ave); }というわけでテスト用です。
大体これだと5、6歩に一回エンカウントするくらいですね。
#追記
コード書いてる間にsoftyaさんの投稿がありましたが、確かにエンカウントする歩数を先に決めた方が断然わかりやすいと僕は思うので、そっちで書いた方がよさそうですね。

Re:エンカウント
うーん。
それを聞いてくるC言語の知識レベルだと、多分書いても自分のプログラムに反映出来ないんじゃないかと思うんですけどね。
今話しに出ているエンカウントの方法だとスマートとか、そんな問題じゃないんですよ。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ENCOUNT 5
#define DES_ENCOUNT 3
int main(){
int petometor =0;
int count =0;
int ave = 0;//平均計算用
srand((unsigned)time(NULL));
// エンカウントする歩数 = 3 + 乱数(0~4)
petometor = DES_ENCOUNT + rand()%ENCOUNT;
for(count=1;count<100;count++){
if(petometor==0) {
puts("encount!!");
// エンカウントする歩数 = 3 + 乱数(0~4)
petometor = DES_ENCOUNT + rand()%ENCOUNT;
ave++; //平均計算用
continue;
}
puts("..walking...");
petometor--;
}
printf("エンカウント率は%d\%%\n",ave);
printf("大体%f歩に一回エンカウントします",100.0f/(float)ave);
}
それを聞いてくるC言語の知識レベルだと、多分書いても自分のプログラムに反映出来ないんじゃないかと思うんですけどね。
今話しに出ているエンカウントの方法だとスマートとか、そんな問題じゃないんですよ。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ENCOUNT 5
#define DES_ENCOUNT 3
int main(){
int petometor =0;
int count =0;
int ave = 0;//平均計算用
srand((unsigned)time(NULL));
// エンカウントする歩数 = 3 + 乱数(0~4)
petometor = DES_ENCOUNT + rand()%ENCOUNT;
for(count=1;count<100;count++){
if(petometor==0) {
puts("encount!!");
// エンカウントする歩数 = 3 + 乱数(0~4)
petometor = DES_ENCOUNT + rand()%ENCOUNT;
ave++; //平均計算用
continue;
}
puts("..walking...");
petometor--;
}
printf("エンカウント率は%d\%%\n",ave);
printf("大体%f歩に一回エンカウントします",100.0f/(float)ave);
}
Re:エンカウント
クールとかスマートとかあいまいな表現が多く、結局丸投げぽい投稿ですね^^;
rand()%5
で0だったらエンカウント
でいいじゃないですか。
1歩目からエンカウントしたっていいじゃないですか。
製作中のRPGはクリアまでにエンカウントフィールドを何歩くらい歩く想定なのでしょうか?
1万歩?
100万歩?
種をいろいろ変えて100万回ずつ検証してみてはいかがでしょう。
きっとそれなりになると思いますよ。
そもそも20%で遭遇する確率が適正なのかというところも考えたほうがいいのかも。
今のトピ主さんの発言から推測するレベルではsoftyaさんも指摘しているとおり、ここで得た回答を反映させようとしても余計なトラブル(バグ)を招きかねません。
しんぷるいずべすと
です。
自分の理解できるレベルで望みましょう。
>Wikipediaにあるような『エンカウント率 (%) = 100 / 戦闘後、次の敵に遭遇するまでの平均歩数』
でコーディングしてしまうと思ったような結果が得られません。
>平均5歩歩いた時にエンカウントするようにしたいのですが、
上の式を使用すると、ほぼ3歩目までにはエンカウントしてしまいます。
で作成したソースをさらしてみてはいかがでしょう?
あなたのレベルにあった回答が得られやすくなるでしょう。
rand()%5
で0だったらエンカウント
でいいじゃないですか。
1歩目からエンカウントしたっていいじゃないですか。
製作中のRPGはクリアまでにエンカウントフィールドを何歩くらい歩く想定なのでしょうか?
1万歩?
100万歩?
種をいろいろ変えて100万回ずつ検証してみてはいかがでしょう。
きっとそれなりになると思いますよ。
そもそも20%で遭遇する確率が適正なのかというところも考えたほうがいいのかも。
今のトピ主さんの発言から推測するレベルではsoftyaさんも指摘しているとおり、ここで得た回答を反映させようとしても余計なトラブル(バグ)を招きかねません。
しんぷるいずべすと
です。
自分の理解できるレベルで望みましょう。
>Wikipediaにあるような『エンカウント率 (%) = 100 / 戦闘後、次の敵に遭遇するまでの平均歩数』
でコーディングしてしまうと思ったような結果が得られません。
>平均5歩歩いた時にエンカウントするようにしたいのですが、
上の式を使用すると、ほぼ3歩目までにはエンカウントしてしまいます。
で作成したソースをさらしてみてはいかがでしょう?
あなたのレベルにあった回答が得られやすくなるでしょう。