トピック
受付中
bはかせ kojimadaiti

一番大きい数を探す

複数の数の中から 一番大きいものを探す命令って ありませんかね? キャラクタを素早さ順に行動させる 処理に欲しいんです。
4そうだね
プレイ済み
返信[1]
親投稿
bはかせ kojimadaiti
いつか見た気がするんだよなぁ
0そうだね
プレイ済み
返信[2]
親投稿
max() でも、返り値は「一番大きい値」自体なので「一番大きい値がどこにあるか」を直接知ることができない。
3そうだね
プレイ済み
返信[3]
親投稿
というか素早さとかパラメータが配列ならRSORTで良い気がするけど・・
3そうだね
プレイ済み
返信[4]
親投稿
ほしけん Hosiken
MAXで最大の値を知って FOR回しでどれが最大の値と同じか調べるとシンプルかなあと思ったり。
4そうだね
プレイ済み
返信[5]
親投稿
SilverBlue Corei72630QM
SORTだと同じ素早さの場合、不公平は発生するので、ほしけんさんの方法がいいかもしれません。
4そうだね
プレイ済み
返信[6]
親投稿
素早さ*1000+固有IDみたいな配列を作っておけば、SORTでも「同じ素早さの順番がコロコロ変わる」のを防げるけど、面倒かな…
2そうだね
プレイ済み
返信[7]
親投稿
固有IDというか「添字」の値ね。 こうすれば疑似的に安定ソートになるはずなんだけど(*1000というのは1000体以上いない前提)
1そうだね
プレイ済み
返信[8]
親投稿
素早さが同じなる頻度がどれだけあるかにもよる。 よくあることなら対策は要るけど、そうじゃなければしなくても良い。
2そうだね
プレイ済み
返信[9]
親投稿
bはかせ kojimadaiti
MAXを使って 一番大きいのを見つけることが できるようになりました! これにあと少し手を加えて一番だけでなく 全部の順番がわかるようにしてみます。 重複してしまったのはランダムで 順番を決めます。
1そうだね
プレイ済み
返信[10]
親投稿
すばやさ順に全員が行動するなら、最大値を求めるのもそうだけど順番付けしないといけないので、プチコンの命令を使うだけではなく、自分で並び替え(「ソート」アルゴリズム)の処理をしないといけなかったりも。 すばやさ順に全員が行動するプログラムの作り方としてもいろいろあるけど、このターンに行動した人は最大値を求める計算からは対象外にする、ってやりかたもアリだったりします。 すばやさパラメータ用の配列とは別に「すばやさ計算用配列」にすばやさをコピーしておいて、 そこから最大値を求めて(同じ人がいればランダムなどでどっちか決めるななど)その人の配列番目から行動のパラメータをいろいろ使ってゲームの処理をして、 行動しおわったらその人の配列版目の「すばやさ計算用配列」に0を入れて、全員が0になったらターン終わり。 みたいな処理をすれば無理にソートしなくてもいけたりも。
6そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
こんなやりかたも def f(dex[]) var n = len(dex), tmp[n], index[n] copy tmp, dex for i = 0 to n - 1 index[i] = i next rsort tmp, index return index end var n=10, dex[n], index[n], i, j for i = 0 to n - 1: dex[i] = rnd(10): next index = f(dex) for i = 0 to n - 1: j = index[i]: ? format$("dex[%d]=%d", j, dex[j]): next
6そうだね
プレイ済み
返信[12]
親投稿
れい rei-nntnd
すばやさはdexではなくagi!
4そうだね
プレイ済み
返信[13]
親投稿
bはかせ kojimadaiti
コメントありがとうございます。 行動順を計算する用に 素早さをそのままコピーした配列を使う方が 良さそうですね。 MIKI さんのプログラムも試してみます。
1そうだね
プレイ済み
返信[14]
親投稿
MIKI ifconfig
>すばやさはdexではなくagi! そ、そうだった?? Wizardry では AGILITY?? Ultima では DEX だったような・・・
2そうだね
プレイ済み
返信[15]
親投稿
(私の作品だと「スピード」でSPDだったり)
4そうだね
プレイ済み
返信[16]
親投稿
自分はすばやさは、SかSPEED、S Dで表します。 どういう話になっているのかわからないんですけど。 外れてたらすいません。 ちなみにぽけもんのHABCDSから来てます。
2そうだね
プレイ済み
返信[17]
親投稿
SD→SPDです。 間違えて改行を押してたよーです。
1そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
素早さが同じ場合に順番が固定化されるのが嫌であれば素早さに乱数を加えた値でソートすれば簡単に解決ができます。 RNDFを使うと良いでしょう。
4そうだね
プレイ済み
返信[19]
親投稿
TERA(LL) tera0413
素早さが同じであれば、プログラム的にはいずれかの順で処理するにしても、ゲーム的には同時にそれが起こった事として処理した方が自然な気がするし処理順を考慮しなくても良くなるかと思います。 例えばAとBが同じ素早さの場合、まずAのとった行動とその結果を判定しておき、次にBにその結果を反映する前にBのとった行動とその結果を判定し、それぞれの結果を同時に反映する。 そうすれば、相打ちになることもあれば、Bの攻撃によってAは倒されるけど同時にAの放っていた攻撃でCが倒される みたいなゲーム的に熱い(?)展開になるかと。
4そうだね
プレイ済み
返信[20]
親投稿
bはかせ kojimadaiti
素早さにランダム要素をつけてみても いいかもしれませんね。 必ずしも先手をとれるとは限らないという。 同時に動かしてしまうのも面白そうですね。 他のゲームでもあまり見掛けない(と思う) 要素ですね。 今は考えがまとまらないから土日に 取りかかろうかなぁ
3そうだね
プレイ済み
返信[21]
親投稿
MIKIさんのプログラムを動かせたら、どんな処理をしているか1行ずつ解析していくといろいろ勉強になったりします。 ・def f で定義された関数(ユーザ定義命令)は 素早さ配列を引数に渡すと、素早さ配列の何番目が早いかの配列を返してくれる。 ・def f の中の var で宣言された index と、 def f の外で var で宣言された index は別の変数で宣言される(最後に代入されて同じ内容になるけど) ・rsort tmp, index は、tmpの並び替え結果で index も同じ並び替えをしてくれる このへんを意識しておけば、動きはみえてくるかも。 解析して分かったことをプログラムにコメントで書いたり、紙に書いたり、この変数にこの値が入ってるとすると結果はこう動くはず、って感じで考えると理解しやすくなるかもです。
5そうだね
プレイ済み
返信[22]
親投稿
bはかせ kojimadaiti
やる気ゲージがたまるのが遅い自分です。 今日まで延びるとは… たんじぇ さんにいろいろヒントを書いて もらっていましたが、もう一度自分で 命令の説明とか読みながら とりあえず理解できたと思います。 行動順の判断はこのあとに適当にプログラムを 組んで、もうすぐ一番作りたかったところに 取りかかれると思います。 素早さが被ったときはまず作り易そうな 乱数で調整をすることにして、 同時攻撃なども作品が大体仕上がってきたら 挑戦してみようと思います。
1そうだね
プレイ済み