whileでendを繰り返す(質問掲示板

投稿: Material 7186 1 mini ikosami 投稿:2010/03/28 00:53:28(最新:2010/03/29 00:51:29)
whileでendを繰り返すことはできないでしょうか?
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分)もかかってしまうので、
何とか短くしたいのですが・・・

省略できないのは僕が下手なだけでしょうか?

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Material 7186 1 mini ikosami(投稿日:2010/03/29 00:51, 履歴)
入れ子状に使うというのは
2010/03/28 03:53に書いたやつを
繰り返すようにするということですか?

一応できそうな気がしますけど
まぁあわてずに
いろいろ試してみることにします。
Zararu128x128 mini dycoon(投稿日:2010/03/28 22:38, 履歴)
入れ子にしなくてもよくて
whileを2つ続けて書くような形でも
できるような気もします。
Zararu128x128 mini dycoon(投稿日:2010/03/28 21:59, 履歴)
Rmakeご利用ありがとうございます。

while文を入れ子状に使うのはどうでしょうか?
動作テストしていないコードですが、たとえば
i = 0
while i < 8
  j = 0
  while j < 8
    ...

    j = j + 1
  end

  i = i + 1
end

オセロで使うとしたら、
縦横斜めの方向に、升目を調べていって
自分のこまが出てきたらそこまでの相手のこまをひっくり返す
とかでしょうか。
もちろんもっといろいろな場合に対応する必要はあるとは思いますが
この考え方の延長でいけるのではないかと考えています。

よろしくお願いします。
Material 7186 1 mini ikosami(投稿日:2010/03/28 03:53, 履歴)
体験版をやればわかると思いますが、

同じ色がいくつ続いているか、を判断する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



ならいいような気がしますけど
これって全マス共通じゃないから
全然省略になりませんよね・・・

全マス共通でないと意味がなく
しかも省略せずに書くと文字数オーバーですから・・・

ムツカシイデス・・・
Nyan mini rurun9(投稿日:2010/03/28 02:57, 履歴)
オセロプログラムの完成形を考え付くまで、いったん作業を中止しましょー
樹形図的なのを全て書けば確かに作れる筈ですが、1箇所間違えただけでもゲームとして成立しませんよ

変数komaて必要かな?
中身が0なら置いてない、1なら白、2のときは黒
と決めてそれで判断すれば良いような…

マウスクリック座標からマス目がどこかを得たら
そのマスから上下左右ナナメ8方向の直線上のマスに同じ色がいくつ続いているか、を判断するwhile~endのループをつくるんです。
例えばマス(x,y)のひとつ右隣りは(x+1,y)
2個左下なら(x-2,y+2)ですよね?
ひとつ隣の中身が何か、を調べるのを繰り返す。
端についた時、隣が何も置いてない時、挟むべき別色が隣にない時、挟むための同色が直線上にない時、ループを抜ければ良いわけで。
調べた結果挟んでいたら、色を変える。
コレを8方向やるワケです。

理屈がわかってくれば、後はどうやってコレを再現するか、ですよよよ