Private Function IroSyutoku(ByVal ColorNo As Object) As Object
'ブロックの色番号から,実際の色を求める
blockColor = &HFF000000
If ColorNo And 4 Then
blockColor = blockColor Or &H9900
End If
If ColorNo And 2 Then
blockColor = blockColor Or &H990000
End If
If ColorNo And 1 Then
blockColor = blockColor Or &H99
End If
これは、あるサイトから得たテトリスのプログラムの1部ですが、
Ifのつかいかたの意味がわかりません。
どういうときにIfの中が実行されますか?
(ちなみに、そのサイトの所有者のメールアドレスは不明です。
>ColorNo As Object
って数値型で型指定しておかないとまずい様な気がしますが。。。(^^;
ビット演算してます。詳細はヘルプで AND 演算子を調べてください。
ColorNo も数値のはずですので、全てをビット表現して
動作を確認してみてください。
ColorNo が 1 の時は
If ColorNo And 1 Then
ColorNo が 2 の時は
If ColorNo And 2 Then
ColorNo が 3 の時は
If ColorNo And 1 Then
If ColorNo And 2 Then
がTRUEとなります。
全ての数値をビット表現すればフラグとして利用されているのがわかる
と思います。
ついでに言えば、blockColor のほうも Or で色を合成してますよね?
編集 削除Orのほうは、どっちかを入れるという意味だとてっきり思ってました(^^;
編集 削除>Orのほうは、どっちかを入れるという意味だとてっきり思ってました(^^;
その解釈だと、どんな時にどっちが入るの?If 文と連携するとか思ってたのかな?
blockColor = blockColor Or &H9900
の一文だけで If 文が無かったときは?コンパイルエラー?実行エラー???
日本語でコメントをつけて少し考えれば、意味が通じないことが分かるのでは?
プログラムは論理的に整理された言語です。書いてあるのは文章なんです。
全てのコードに日本語でコメントをつけて、ちゃんと意味が通じないと
プログラムとして正しくないはずです。
逆に日本語でちゃんと説明できれば、それをプログラミング言語に置き換え
るだけでプログラムが完成します。
戻りますが、And演算子はビット演算では、”=(等号)”によくにていますね。
編集 削除If ColorNo And 4Then
~~~~~~~~~~~~~~~~~~~~
End If
↑のほうはどういう時~~~~が実行されますか?
> 教えて君脱します;
脱するんじゃなかったの?
今までの説明で情報としては十分なはずです。
ビットで表示して考えてください。
とりあえず10進表現で1〜16くらいまでを
2進表現で書き出してみたら?4と同じビットが
立っている数値は他に何がありますか?
10進→2進
−−−−−−
1→1
2→10
3→11
4→100
5→101
6→110
7→111
8→1000
9→1001
10→1010
11→1011
12→1100
13→1101
14→1110
15→1111
16→10000
10進→2進
−−−−−−
01→00001
02→00010
03→00011
04→00100
05→00101
06→00110
07→00111
08→01000
09→01001
10→01010
11→01011
12→01100
13→01101
14→01110
15→01111
16→10000
と書いた方がいいね。で?何が分かったの?
何が分からなかったの?答えは?
理解したことの説明は?
HTML-M さんが小学生である場合はそう書いて
おいてくださいね?(いまどき珍しくないので)
こちらから説明させていただきますので。
小6です。
またちょっと勉強しました。
ちょっとした法則だったので
+1とか
プログラムで書いてみると面白いかも。
Sub Main()
For i As Integer = 0 To 15
Dim strBin As String = Convert.ToString(i, 2)
strBin = String.Format("{0:0000}", Convert.ToInt32(strBin))
Console.WriteLine("{0:00} {1} {2} {3} {4} {5}" _
, i _
, strBin _
, Convert.ToBoolean(i And 8) _
, Convert.ToBoolean(i And 4) _
, Convert.ToBoolean(i And 2) _
, Convert.ToBoolean(i And 1) _
)
Next
Console.ReadLine()
End Sub
数字やブール値が返ってきました。
編集 削除いよいよ、プログラムの面白いところに入ってきました。。。
。。。でもいきなりもげさんに美味しいところを食べられて
しまいましたw(大歓迎ですが
> Sub Main()
で実行するにはプロジェクトの[プロパティ]画面からスタートアップ
あたりの設定を変更しないといけないので、面倒なようならボタンの
クリックイベントなどにコードをコピペして実行してみると良いでしょう。
プログラムはプログラマが楽をするために書きます。
>10進→2進
>−−−−−−
>01→00001
>02→00010
>・・・
書くの面倒だったでしょ?16までならまだ書けますが、1024まで書くとしたら?
…書きたくないと思います。もげさんのプログラムなら、少し手を加えるだけで
書いてくれますね(^^
>If ColorNo And 4Then
がいつ実行される(Trueになるか?)まで出力してくれてます。
> , Convert.ToBoolean(i And 4) _
の部分が実行されて右から3番目に出力されています。
00 0000 False False False False
01 0001 False False False True
02 0010 False False True False
03 0011 False False True True
04 0100 False True False False
05 0101 False True False True
06 0110 False True True False
07 0111 False True True True
08 1000 True False False False
09 1001 True False False True
10 1010 True False True False
11 1011 True False True True
12 1100 True True False False
13 1101 True True False True
14 1110 True True True False
15 1111 True True True True
という出力が出ましたか?右から3番目がTrueなのは
04,05,06,07,12,13,14,15
ColorNo として上にあげた数字を渡せば実行されるはずです。
実はもう一段階面白い話に進めるんです。
[問題1]
If ColorNo And 4 Then
If ColorNo And 2 Then
の2つが実行される数字を計算で求めなさい。
[問題2]
If ColorNo And 4 Then
If ColorNo And 1 Then
の2つが実行される数字を計算で求めなさい。
[問題3]
If ColorNo And 4 Then
If ColorNo And 2 Then
If ColorNo And 1 Then
の3つが実行される数字を計算で求めなさい。
公倍数みたいなものですね(OwO)
編集 削除>>04,05,06,07,12,13,14,15
↑の数字を削ればいいんですね
悩んでます(〜w〜)
編集 削除>↑の数字を削ればいいんですね
残念。その着眼点は4を基準とした時に役に立つけど、
今回の問題はもっと単純です。
[問題1]
6です。(=4+2)
[問題2]
5です。(=4+1)
[問題3]
7です。(=4+2+1)
つまり2の乗数(1,2,4,8,16,32,64,128,256....)を
フラグとして利用すれば、1と8のフラグを立てたかったら
1+8=9
を渡せばいいってことです。
関数の引数にフラグを渡す場合、
Public Sub HogeHoge(Byval MessageFlag As Boolean, ButtonFlag As Boolean, IconFlag As Boolean)
とたくさん渡さなくても
Public Sub HogeHoge(Byval SpecialFlag As Integer)
と数字を1つ渡せば実現できてしまうわけです。
これは Enum でよく使われています。
データベース検索時に利用できる Public Enum CommandBehavior では
Debug.WriteLine(CommandBehavior.Default) '0
Debug.WriteLine(CommandBehavior.SingleResult) '1
Debug.WriteLine(CommandBehavior.SchemaOnly) '2
Debug.WriteLine(CommandBehavior.KeyInfo) '4 主キーの情報取得
Debug.WriteLine(CommandBehavior.SingleRow) '8
Debug.WriteLine(CommandBehavior.SequentialAccess) '16
Debug.WriteLine(CommandBehavior.CloseConnection) '32 Connection オブジェクトの終了
主キーの情報取得後に Connection オブジェクトを終了させる場合は 36 を渡します。
本当に親切ですね!
ありがとうございます!!!!!!
大変失礼*9e+999999999999999999999999
ですが、どうしてももう一つ聞きたいです。
テトリスのようなゲーム(テトリスとは別)を作りたいのですが、
あれは、テトリスはブロックが落下するときに、下に描画しますが、
上にある落下前のブロックは消えますよね?
あれは背景のいろで上書きしてるんですか?
>これは、あるサイトから得たテトリスのプログラムの1部ですが、
の話でしょうか?描画部分のコードは示されていないので
分かりません。
描画処理の書き方によって結果は変わります。
フォームの再描画処理で勝手に消えてしまう場合もあれば、
背景の色で上書きしてる場合もあるでしょうね。
ブロックを別のコントロールで作成しているなら、そちらの
描画処理に任せている場合もあるでしょう。
可能性の話では確かな回答はできません。
他人の作品(コードもそうです)の一部を利用する際には、
誰が書いたのか、どこからコピーしたのか
を必ず明らかにしましょうね。
http://deneb.nime.ac.jp/contents/school_child/index.htm
http://www.teu.ac.jp/chiit/~jsuzuki/doc/pnc2006/n03/index.html
http://www.teu.ac.jp/chiit/~jsuzuki/doc/pnc2006/n03/tetris.txt
得たサイト:
>>http://www.teu.ac.jp/chiit/~jsuzuki/doc/pnc2007/n03/index.html
入門サイトですので、
商用等しなければ問題ないでしょう。
出来たものも配布するときリンクすれば問題ないでしょう。
やっぱり最初からリンクしとけばよかった(^^;)
編集 削除>HTML-M
そろそろ「推敲」という言葉を知った方がいいぞ。
チャットじゃないんだ。思いつきでポコポコ連投されたらウザくてしょうがない。
>(ちなみに、そのサイトの所有者のメールアドレスは不明です。
http://www.teu.ac.jp/chiit/~jsuzuki/doc/index.html
連絡先書いてあるし、★質問用掲示板★もある。(見難いけど
>入門サイトですので、
>商用等しなければ問題ないでしょう。
>出来たものも配布するときリンクすれば問題ないでしょう。
もげさん御紹介のリンク先で著作権についてしっかり勉強したなら
認識が甘いことが分かると思います。
プログラミングコードをこの掲示板に引用した時点で問題ありです。
それで訴えられることはまずありませんが、訴えられれば負けるでしょう。
それ以前に、他人のコードを勝手に盗むわけですから、相手に対する
感謝の気持ちが無いと言えます。そのような態度はこの掲示板の回答者
への印象も悪くなります。
すません_(↓_↓)_
編集 削除でも盗んだりしませんよ。
著作権はわたしにはありませんから。
もし配布するんだったらちゃんと著作権マークつけます。
あと、作者には感謝していますよ。
作者のプログラムのおかげで自分のプログラムの作成が簡易になります。
>もし配布するんだったらちゃんと著作権マークつけます。
>あと、作者には感謝していますよ。
>作者のプログラムのおかげで自分のプログラムの作成が簡易になります。
うん。だから自分の中ではそうなんだろうけど、他人が外から見ても
『ああ、HTML-Mさんはちゃんと作者に敬意を払ってるな』
って分かるかどうか?ってことです。
実際に、今の段階で、作者に連絡は取ってないんでしょ?
で、この掲示板で質問する際に作者のページを紹介しなかった。
コードの一部を勝手にこの掲示板にコピーした。
十分に考えずに書き込みする。(小6に求めるもの酷ですが。。。)
これらの行動を他人から見たらどうでしょう?そのあたりが
大事にしてないように写ってるので、今後少しずつ気をつけて
もらえばいいと思います。
コードをざっと解析しました。
描画クリアについてはタイマーのイベントの最初に
> '画面を黒でクリアする
…そのまんまのコメントで書いてありますよね(^^;
質問する前に少なくとも3回はコードに目を通して欲しいです。
コードを十分に読んでないのも大事にしてないように写りますよ?
# というか感謝を他人に分かるレベルで表現するのは、かなり
# 気(と労力)を使う必要があります。普通に考えていては出来ません。
> g.Clear(Color.FromArgb(0, 0, 0))
この1行をコメントアウトして実行してみてください。
前の描画が残ったまま実行されます。
すみません!
本当にすみません!
アレ?
コンパイルエラー?
>アレ?
>コンパイルエラー?
日本語でおk
>日本語でおk
一応日本語(カタカナ)ですけど・・・?
チャットじゃないんだから、思いつきで連投はやめましょう。
小6だからって、もう分かるでしょ。