Discuss Scratch
- Discussion Forums
- » 日本語
- » 質問コーナー4
- apple502j
-
Scratcher
1000+ posts
質問コーナー4
Scratchの演算ブロックはshort-circuit evaluationを行わないため、その点では「もし~」のほうが早いです。
- SABATYANN
-
Scratcher
14 posts
質問コーナー4
誰かオンラインゲームの作り方を具体的に教えてくださいクラウド変数に敵の自分の位置を入れるんです そのクラウド変数のいちに代わりのスプライトを移動させますそれをXとYをやります
お願いします
- SABATYANN
-
Scratcher
14 posts
質問コーナー4
演算の方が軽いですしかし処理のスピードに関してはせぎょの方が速いのでは?もし <> なら //if elseの組み合わせと
でなければ
もし <> なら
でなければ
...
end<<> かつ <<> または <...>>>//演算系の組み合わせどちらが処理が軽いでしょうか?
微妙な差でもいいのでお願いします。
見やすさは考慮しません
- gold_banana_kingdom
-
Scratcher
100+ posts
質問コーナー4
やってること違ったっぽいので削除
Last edited by gold_banana_kingdom (Feb. 22, 2021 13:19:24)
- apple502j
-
Scratcher
1000+ posts
質問コーナー4
書いてる最中に次が投稿されてしまいましたがこのまま投稿します。Scratchのブロックは、引数を先に処理し、それがすべて処理し終わった段階で親ブロックが実行されるという仕組みになっています。
#4823:Scratchの演算ブロックはshort-circuit evaluationを行わないため、その点では「もし~」のほうが早いです。読者層を考えて英語ではなくもう少し普通に書けないでしょうか。。
短絡評価 を行わないとのことですがその出典またはソースコードの場所をお願いします。
また、短絡評価を行わないため「もし~」のほうが早いという理由をもう少し説明お願いします。
つまり、「AかつB」の評価は「A」と「B」が両方とも評価された後に行われます。
短絡評価の場合は親ブロック「AかつB」の評価をする際に必要に応じてAやBの評価が行われます。
and関数は https://github.com/LLK/scratch-vm/blob/develop/src/blocks/scratch3_operators.js#L68 で定義されていますが、OPERANDは事前に計算されています。
「もし~」の場合は、条件Aが偽の場合、下位のスタックブロックは一切実行されません。これは一種の短絡評価です。
代表的な「時間がかかる値ブロック」として翻訳拡張機能のブロックを使ってみます。
もし <([こんにちは]を[英語 v]に翻訳する::pen)=[test]> ならというスクリプトを考えます。短絡評価を行う場合は、このスクリプトは
もし <([Hello]を[日本語 v]に翻訳する::pen)=[こんにちは]> なら
[abc] と言う
end
end
もし <<([こんにちは]を[英語 v]に翻訳する::pen)=[test]>かつ<([Hello]を[日本語 v]に翻訳する::pen)=[こんにちは]>> ならとほぼ同じです。しかし、Scratchは短絡評価を行わないため、「こんにちはを英語に翻訳する = test」が偽の場合であっても「Helloを日本語に翻訳する=こんにちは」は評価されます。前者の場合は、「こんにちはを英語に翻訳する = test」のため下位の「もし」(とその引数)は評価されません。
[abc] と言う
end
- KimiruHamiru
-
New Scratcher
500+ posts
質問コーナー4
@greenFlagがクリックされたときちょっと誰が何を言っているか、質問が何か、いまいち理解できているか自信がないのですが、多分上のコードで言えば、
(all v) 番目を [ログ v] から削除する
[ラップ v]を(2000年からの日数)にする
処理1
((86400)*((2000年からの日数)-(ラップ)))を[ログ v]に追加する
[ラップ v]を(2000年からの日数)にする
処理2
((86400)*((2000年からの日数)-(ラップ)))を[ログ v]に追加する
[ラップ v]を(2000年からの日数)にする
処理3
((86400)*((2000年からの日数)-(ラップ)))を[ログ v]に追加する
[ラップ v]を(2000年からの日数)にする
処理4
((86400)*((2000年からの日数)-(ラップ)))を[ログ v]に追加する
定義 処理1
(1000000)回繰り返す
もし<>なら
もし<>なら
でなければ
何もしない
end
でなければ
end
end
定義 処理2
(1000000)回繰り返す
もし<<>かつ<<>ではない>>なら
何もしない
end
end
定義 何もしない
定義 処理3
(1000000)回繰り返す
もし<>なら
でなければ
もし<>なら
でなければ
何もしない
end
end
end
定義 処理4
(1000000)回繰り返す
もし<<()=()>かつ<<>ではない>>なら
何もしない
end
end
yucca42さんの質問は「処理2と処理3の比較」で「どちらが速い?」
inokingさんの指摘は「「処理2と処理3の比較」は処理内容が異なるので比較対象として不適切だから、「処理1と処理2」もしくは「処理3と処理4」を比較すべきである)」
みたいな話かなという理解です。
上記コードの実行結果は、私の環境、私の設定では
処理1:0.67秒
処理2:0.51秒
処理3:1.99秒
処理4:1.71秒
ぐらいです。実行を繰り返すと数字は上下しますが、大小がひっくり返ることはそうそうないようです。
「処理2と処理3」では処理2の方が極端に速い
というのが質問に対する直接的な答えになるかと思うのですが、
それは
「処理内容が違う」ので、式が評価される回数が違うから
であって、
「もしブロック」と「条件式」の比較にはなっていないと思います。
そこで、
等価な処理として、処理1と処理2(もしくは処理3と処理4)を比較する場合、処理2の方が若干速いという結果が得られています。
恐らくは当初の質問に対する答えはこれで、いささか乱暴ではありますが、
「もしブロック」と「条件式」の速度を比較すると、「条件式で書けるなら条件式で書いた方が若干速い」
と言えるかなと思います。
- Arcade_Creator0123
-
Scratcher
100+ posts
質問コーナー4
計算の時の4.63783e+21みたいなのをe+を外してリストに保存する方法を教えてください
Last edited by Arcade_Creator0123 (Feb. 22, 2021 22:58:50)
- LetsBurger
-
Scratcher
86 posts
質問コーナー4
今Penでイントロを作ってるんですけど、penで描いたものの大きさ、座標、向きを指定して描画できるように死体のですが、向きのやり方が分かりません。教えて下さい。
- doraemon-yu
-
Scratcher
100+ posts
質問コーナー4
昨日、僕が質問コーナー4に投稿した質問がなくなっています。
なぜですか
昨日の質問は、
オンラインゲームの作り方を具体的に教えてください
お願いします
というものです。
この投稿に何か問題があるのでしょうか?
なぜですか
昨日の質問は、
オンラインゲームの作り方を具体的に教えてください
お願いします
というものです。
この投稿に何か問題があるのでしょうか?
- daikikato
-
Scratcher
100+ posts
質問コーナー4
昨日、僕が質問コーナー4に投稿した質問がなくなっています。あなたの投稿は上の方の#4824にありましたよ。
なぜですか
昨日の質問は、
オンラインゲームの作り方を具体的に教えてください
お願いします
というものです。
この投稿に何か問題があるのでしょうか?
- mitaku115
-
Scratcher
500+ posts
質問コーナー4
今Penでイントロを作ってるんですけど、penで描いたものの大きさ、座標、向きを指定して描画できるように死体のですが、向きのやり方が分かりません。教えて下さい。_人人人人_
> 死体 <
 ̄Y^Y^Y^ ̄
さておき
描画するスプライト自体を回転させればいいんじゃ
ないでしょうか
- -JF21-
-
Scratcher
71 posts
質問コーナー4
今Penでイントロを作ってるんですけど、penで描いたものの大きさ、座標、向きを指定して描画できるように死体のですが、向きのやり方が分かりません。教えて下さい。ペンで描いた図形の向きを変えたいということでしょうか。
その一つに、三角関数を使うやり方があります。
細かいやり方は忘れてしまったのですが、大雑把なやり方を紹介します。
例えば、三角形をペンで描くとしましょう。
1, 3つの点それぞれの、回す中心との距離を、三平方の定理を使って求める。
2, 3つの点それそれが、中心との距離を半径とする円の中で、どの角度にいるかを逆三角関数を使って求める。
3, 求めた角度に回したい角度を足し、三角関数を使って3つの点それぞれの回した後の座標を求める。
4, 描画
追記: 3の「回したい角度」とは、「今の状態から何度回すか」です。
今の状態が60度で、90度にしたいなら、30を足してください。
だいたいこんな感じの流れです。
描画するスプライト自体を回転させればいいんじゃそれではできません。
ないでしょうか
ペンでの描画をすべて
() 歩動かすでやっているのなら別ですが。
Last edited by -JF21- (Feb. 23, 2021 02:03:31)
- Poteto143
-
Scratcher
1000+ posts
質問コーナー4
#4837
自分が投稿した後に、他の人がどんどん投稿して「あれ、前質問したやつどこ…?」となるのは結構頻繁にあります。
そんな時は、ディスカッションフォーラムのホームに移動して、ページ下の「Show your topics/posts」のpostsをクリックすれば自分の過去の投稿が見られますよ。
自分が投稿した後に、他の人がどんどん投稿して「あれ、前質問したやつどこ…?」となるのは結構頻繁にあります。
そんな時は、ディスカッションフォーラムのホームに移動して、ページ下の「Show your topics/posts」のpostsをクリックすれば自分の過去の投稿が見られますよ。













