dポイントプレゼントキャンペーン実施中!

某所の以下のテトリスのコードなのですが、何点かわからない点があります。初歩的な質問も混ざっているかもしれません。理解できるというお方おりましたらご教授いただけると幸いです。
下記の左の数字は行番号で、ソースを読む際の目安にしていただければと思います(大体の番号です;)

ソース
http://zapanet.info/blog/item/1125

7      d=K-37?1:-1 // d:x方向の差分
★d=K-37がtrueなら1、falseなら-1を返すと私は読んだのですが、d=K-37がtrueというのはどういう意味か分かりません。どういう意味なのでしょうか?

10        f+=Z[h+E[i]+d]==S; // 移動先が空白かどうか
★fに配列Zの添字h+配列Eの添字i+dを足したものをfに代入。までは多分あっていると思うのですが、次の==Sの意味がわかりません。どうよめばよいのでしょうか?

17        v=Math.round(p/12); // 回転先の x 座標
18        w=p-v*12; // 回転先の y 座標
19        C[i]=w*12-v; // 回転先の座標計算
★なぜpを12で割って丸めているのでしょうか?17、18、19とどういう計算をしているのでしょうか?

24      t*!f?E=B[t]=C:0; // すべて空白なので回転決定
★t*fの否定がtrueならばEにB[t]を代入するのは分かりますが、Cはどこにはいるのでしょうか?=が2つ続いたときどう読めば良いでしょうか?

40    for(j=11;--j&&Z[i*12+j]==S;); // そろったラインを検索
★j=11から、1減らしたjかつ配列Z添字i*12+jがSになるまで・・・3つめの;の後ろがありませんが、これはどういう意味でしょうか?
そして、for()の後ろに;がありますが、それはどういう意味でしょうか?

43      for(j=++i*12;j>2*12;)Z[j]=Z[j---12] // 全体を一段下げる
★Z[j]=Z[j---12]の---12の意味は、12を2減らしたのを・・・であっていますか?

51  Z[5]!=S?setTimeout(Y,99):0; // 入り口にブロックがあったら終了
★配列Z添字5がSじゃなければset~、Sなら0を返すで読みはあっていますか?

59 for(K=t=P=i=0;i<240;){
★K、t、P、iに0をセット、iが240以下になるまで・・・これも2つめの;の後がないのですがどうなっているのでしょうか?

61  Z[240+i]=Z[i]=++i%12<2||i>228?S="□":" "; // 床と壁の設定、番兵にもなる
★Z[240+i]、Z[i]に++i%12を代入したものが2以下または、i>228がtrueなら"□"、falseなら" "を返す。で読みはあっていますか?

A 回答 (1件)

7 d=K-37?1:-1


 K-37がture だったら1、falseだったら-1を、dに代入する
 ここでは条件(K-37)がNumber型なのではBoolean型に変更され評価される
 数値が 0->false それ以外(0より下 or 0より上)->true

10 f+=Z[h+E[i]+d]==S;
 Z[h+E[i]+d] == S の結果を fに加えたものが fに代入される
 結果はBoolean(true or false)になるが、
 += によりString型の連結かNumber型の加算が行われ代入される
 fの初期値がNumber型 (f=0) なのでここではおそらくNumber型による加算 true->1 false->0

17 v=Math.round(p/12); // ブロックの各位置
18 w=p-v*12; // 回転先の y 座標
19 C[i]=w*12-v; // 回転先の座標計算
 全体の関係がちょっとよくわからないので不明

24 t*!f?E=B[t]=C:0; // すべて空白なので回転決定
 t*fの否定がtrueならば、B[t]にCが代入され、更にEにも代入される
 それ以外はとりあえず0を宣言
 単純にCがEとB[t]に代入されると理解すれば良し
 0宣言自体に意味はなく、構文として成り立たせるためだけに存在

40 for(j=11;--j&&Z[i*12+j]==S;);
 3つ目の;の後ろは、forで一連の動作をループ中、一連の動作を行う毎の最後に何をするか
 ここでは何もしないということ、
 最後の;は、forの条件内で既にループさせたい動作が満たされていると思われるので(--jの部分)、
 やることがないからforの終止として付けている
 条件に使われるNumber型の評価は 7 と一緒

43 for(j=++i*12;j>2*12;)Z[j]=Z[j---12]
 j---12は"j--"と"-12"で分ける
 式だけの結果は j-12、式を終えるとj自体は j-1 になる

51 Z[5]!=S?setTimeout(Y,99):0; // 入り口にブロックがあったら終了
 配列Z添字5がSじゃなければsetTimeoutによる時間軸処理を行うよう設定
 そうでなければ0を宣言、0宣言に意味はなし

59 for(K=t=P=i=0;i<240;){
 ;の後がないのは40と同じ

61 Z[240+i]=Z[i]=++i%12<2||i>228?S="□":" "; // 床と壁の設定、番兵にもなる
 ++i%12が2未満または、i>228がtrueなら"□"、falseなら" "を、Z[240+i]とZ[i]に代入する
 trueならば Sにも"□"が代入される


理解を深める為に、全体を通して覚えたほうがよいこと
・三項演算 A ? B : C
・forの使い方とその行われ方
・代入演算子(=)及び複合代入演算子(+= -=等)の動作と、
 比較演算子{関係演算子(== !=等)}の動作の違い


どっか間違ってるかもしれませんが、
時間をかけて細かくデバッグのような形で確認しないと
これ以上はちょっとわからなそうなので以上です
    • good
    • 0
この回答へのお礼

どうもありがとうございました!すごいです・・・
だらだらと質問してすみませんでした。
とても分かりやすかったです、嬉しいです!
アドバイスを参考にじっくり理解してみようと思います

お礼日時:2007/11/01 23:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!