whileでendを繰り返す(質問掲示板)
投稿: ikosami
投稿:2010/03/28 00:53:28(最新:2010/03/29 00:51:29)
whileでendを繰り返すことはできないでしょうか?
下のスクリプトをまとめようとすると
どうしても決められた回数分
後ろにendをつける必要が出てくるのですが・・・
それでもやはり無理のような気がしますが・・・
↑で普通にまとめられるものは
だけで、
二次元配列を使っても
単純に書くスピードから考えても
あまり省略にならないような気がしてきたのですが・・・
今までの方法だと
一マスの設定を作るのに約10分ぐらいかかるので
640分(10時間40分)もかかってしまうので、
何とか短くしたいのですが・・・
省略できないのは僕が下手なだけでしょうか?
ツイート
i = 0 while i < 8 end i = i + 1 end
下のスクリプトをまとめようとすると
どうしても決められた回数分
後ろにendをつける必要が出てくるのですが・・・
それでもやはり無理のような気がしますが・・・
if getVariable("a")[7][0] == getVariable("koma") if getVariable("a")[1][0] == getVariable("koma2") if getVariable("a")[2][0] == getVariable("koma2") if getVariable("a")[3][0] == getVariable("koma2") if getVariable("a")[4][0] == getVariable("koma2") if getVariable("a")[5][0] == getVariable("koma2") if getVariable("a")[6][0] == getVariable("koma2") getVariable("a")[1][0] = getVariable("koma") getVariable("a")[2][0] = getVariable("koma") getVariable("a")[3][0] = getVariable("koma") getVariable("a")[4][0] = getVariable("koma") getVariable("a")[5][0] = getVariable("koma") getVariable("a")[6][0] = getVariable("koma") setFlag("置ける", true) end end end end end end end
↑で普通にまとめられるものは
getVariable("a")[1][0] = getVariable("koma") getVariable("a")[2][0] = getVariable("koma") getVariable("a")[3][0] = getVariable("koma") getVariable("a")[4][0] = getVariable("koma") getVariable("a")[5][0] = getVariable("koma") getVariable("a")[6][0] = getVariable("koma")
だけで、
i = 1 while i < 7 getVariable("a")[i][0] = getVariable("koma") i = i + 1 end
二次元配列を使っても
単純に書くスピードから考えても
あまり省略にならないような気がしてきたのですが・・・
今までの方法だと
一マスの設定を作るのに約10分ぐらいかかるので
640分(10時間40分)もかかってしまうので、
何とか短くしたいのですが・・・
省略できないのは僕が下手なだけでしょうか?
コメントする
コメントするには、ログインする必要があります。
コメント一覧
Rmakeご利用ありがとうございます。
while文を入れ子状に使うのはどうでしょうか?
動作テストしていないコードですが、たとえば
オセロで使うとしたら、
縦横斜めの方向に、升目を調べていって
自分のこまが出てきたらそこまでの相手のこまをひっくり返す
とかでしょうか。
もちろんもっといろいろな場合に対応する必要はあるとは思いますが
この考え方の延長でいけるのではないかと考えています。
よろしくお願いします。
while文を入れ子状に使うのはどうでしょうか?
動作テストしていないコードですが、たとえば
i = 0 while i < 8 j = 0 while j < 8 ... j = j + 1 end i = i + 1 end
オセロで使うとしたら、
縦横斜めの方向に、升目を調べていって
自分のこまが出てきたらそこまでの相手のこまをひっくり返す
とかでしょうか。
もちろんもっといろいろな場合に対応する必要はあるとは思いますが
この考え方の延長でいけるのではないかと考えています。
よろしくお願いします。
体験版をやればわかると思いますが、
同じ色がいくつ続いているか、を判断するwhile~endのループを
作るには
ifのループ
ifのループ2
ifの数だけendのループ
をやる必要があるんです・・・
ループをひとつにまとめると
間のマスがすべて敵のこまだったら
という判定ができないんです・・・
まとめると、たとえば
右側に自分のこまがあって
その間の判定をするときに
1つ右が敵のこまだったら1つ右を自分のこまに変える
2つ右が敵のこまだったら2つ右を自分のこまに変える
3つ右が敵のこまではなかったら判定終了
になるので
ひっくり返せないコマがひっくり返ってしまうんです・・・
ループなしなら普通に・・・
というか書いてる途中で思いついたんですけど
ループで
1の時に正しかったら+1
2の時に正しかったらさらに+1
で数字が全部足されていたら(間のコマがすべて敵のコマだったら)
ひっくり返す。
つまり↓
ならいいような気がしますけど
これって全マス共通じゃないから
全然省略になりませんよね・・・
全マス共通でないと意味がなく
しかも省略せずに書くと文字数オーバーですから・・・
ムツカシイデス・・・
同じ色がいくつ続いているか、を判断するwhile~endのループを
作るには
ifのループ
ifのループ2
ifの数だけendのループ
をやる必要があるんです・・・
ループをひとつにまとめると
間のマスがすべて敵のこまだったら
という判定ができないんです・・・
まとめると、たとえば
右側に自分のこまがあって
その間の判定をするときに
1つ右が敵のこまだったら1つ右を自分のこまに変える
2つ右が敵のこまだったら2つ右を自分のこまに変える
3つ右が敵のこまではなかったら判定終了
になるので
ひっくり返せないコマがひっくり返ってしまうんです・・・
ループなしなら普通に・・・
というか書いてる途中で思いついたんですけど
ループで
1の時に正しかったら+1
2の時に正しかったらさらに+1
で数字が全部足されていたら(間のコマがすべて敵のコマだったら)
ひっくり返す。
つまり↓
z = 0 if getVariable("a")[7][0] == getVariable("koma") z = z + 1 end i = 1 while i < 7 if getVariable("a")[i][0] == getVariable("koma2") z = z + 1 end i = i + 1 end if z == 7 i = 1 while i < 6 getVariable("a")[i][0] = getVariable("koma") i = i + 1 end end
ならいいような気がしますけど
これって全マス共通じゃないから
全然省略になりませんよね・・・
全マス共通でないと意味がなく
しかも省略せずに書くと文字数オーバーですから・・・
ムツカシイデス・・・
オセロプログラムの完成形を考え付くまで、いったん作業を中止しましょー
樹形図的なのを全て書けば確かに作れる筈ですが、1箇所間違えただけでもゲームとして成立しませんよ
変数komaて必要かな?
中身が0なら置いてない、1なら白、2のときは黒
と決めてそれで判断すれば良いような…
マウスクリック座標からマス目がどこかを得たら
そのマスから上下左右ナナメ8方向の直線上のマスに同じ色がいくつ続いているか、を判断するwhile~endのループをつくるんです。
例えばマス(x,y)のひとつ右隣りは(x+1,y)
2個左下なら(x-2,y+2)ですよね?
ひとつ隣の中身が何か、を調べるのを繰り返す。
端についた時、隣が何も置いてない時、挟むべき別色が隣にない時、挟むための同色が直線上にない時、ループを抜ければ良いわけで。
調べた結果挟んでいたら、色を変える。
コレを8方向やるワケです。
理屈がわかってくれば、後はどうやってコレを再現するか、ですよよよ
樹形図的なのを全て書けば確かに作れる筈ですが、1箇所間違えただけでもゲームとして成立しませんよ
変数komaて必要かな?
中身が0なら置いてない、1なら白、2のときは黒
と決めてそれで判断すれば良いような…
マウスクリック座標からマス目がどこかを得たら
そのマスから上下左右ナナメ8方向の直線上のマスに同じ色がいくつ続いているか、を判断するwhile~endのループをつくるんです。
例えばマス(x,y)のひとつ右隣りは(x+1,y)
2個左下なら(x-2,y+2)ですよね?
ひとつ隣の中身が何か、を調べるのを繰り返す。
端についた時、隣が何も置いてない時、挟むべき別色が隣にない時、挟むための同色が直線上にない時、ループを抜ければ良いわけで。
調べた結果挟んでいたら、色を変える。
コレを8方向やるワケです。
理屈がわかってくれば、後はどうやってコレを再現するか、ですよよよ
2010/03/28 03:53に書いたやつを
繰り返すようにするということですか?
一応できそうな気がしますけど
まぁあわてずに
いろいろ試してみることにします。