このプログラムはどういう構造ですか?


HTML-M  2008-04-14 17:28:21  No: 144631  IP: 192.*.*.*

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の中が実行されますか?
(ちなみに、そのサイトの所有者のメールアドレスは不明です。

編集 削除
特攻隊長まるるう  2008-04-14 18:07:41  No: 144632  IP: 192.*.*.*

>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となります。
全ての数値をビット表現すればフラグとして利用されているのがわかる
と思います。

編集 削除
特攻隊長まるるう  2008-04-14 18:11:19  No: 144633  IP: 192.*.*.*

ついでに言えば、blockColor のほうも Or で色を合成してますよね?

編集 削除
HTML-M  2008-04-14 18:23:18  No: 144634  IP: 192.*.*.*

Orのほうは、どっちかを入れるという意味だとてっきり思ってました(^^;

編集 削除
特攻隊長まるるう  2008-04-14 18:53:20  No: 144635  IP: 192.*.*.*

>Orのほうは、どっちかを入れるという意味だとてっきり思ってました(^^;
その解釈だと、どんな時にどっちが入るの?If 文と連携するとか思ってたのかな?
    blockColor = blockColor Or &H9900
の一文だけで If 文が無かったときは?コンパイルエラー?実行エラー???
日本語でコメントをつけて少し考えれば、意味が通じないことが分かるのでは?

プログラムは論理的に整理された言語です。書いてあるのは文章なんです。
全てのコードに日本語でコメントをつけて、ちゃんと意味が通じないと
プログラムとして正しくないはずです。

逆に日本語でちゃんと説明できれば、それをプログラミング言語に置き換え
るだけでプログラムが完成します。

編集 削除
HTML-M  2008-04-14 19:01:18  No: 144636  IP: 192.*.*.*

戻りますが、And演算子はビット演算では、”=(等号)”によくにていますね。

編集 削除
HTML-M  2008-04-14 19:04:57  No: 144637  IP: 192.*.*.*

If ColorNo And 4Then

~~~~~~~~~~~~~~~~~~~~
End If
↑のほうはどういう時~~~~が実行されますか?

編集 削除
特攻隊長まるるう  2008-04-14 19:50:41  No: 144638  IP: 192.*.*.*

> 教えて君脱します;
脱するんじゃなかったの?
今までの説明で情報としては十分なはずです。

ビットで表示して考えてください。
とりあえず10進表現で1〜16くらいまでを
2進表現で書き出してみたら?4と同じビットが
立っている数値は他に何がありますか?

編集 削除
HTML-M  2008-04-15 16:37:34  No: 144639  IP: 192.*.*.*

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

編集 削除
特攻隊長まるるう  2008-04-15 16:53:50  No: 144640  IP: 192.*.*.*

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 さんが小学生である場合はそう書いて
おいてくださいね?(いまどき珍しくないので)
こちらから説明させていただきますので。

編集 削除
HTML-M  2008-04-15 17:34:17  No: 144641  IP: 192.*.*.*

小6です。

またちょっと勉強しました。
ちょっとした法則だったので
+1とか

編集 削除
もげ  2008-04-15 18:00:46  No: 144642  IP: 192.*.*.*

プログラムで書いてみると面白いかも。
    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

編集 削除
HTML-M  2008-04-15 18:54:57  No: 144643  IP: 192.*.*.*

数字やブール値が返ってきました。

編集 削除
特攻隊長まるるう  2008-04-15 19:10:14  No: 144644  IP: 192.*.*.*

いよいよ、プログラムの面白いところに入ってきました。。。
。。。でもいきなりもげさんに美味しいところを食べられて
しまいました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つが実行される数字を計算で求めなさい。

編集 削除
HTM-M  2008-04-15 19:47:41  No: 144645  IP: 192.*.*.*

公倍数みたいなものですね(OwO)

編集 削除
HTML-M  2008-04-15 19:50:24  No: 144646  IP: 192.*.*.*

>>04,05,06,07,12,13,14,15
↑の数字を削ればいいんですね

編集 削除
HTML-M  2008-04-15 20:28:54  No: 144647  IP: 192.*.*.*

悩んでます(〜w〜)

編集 削除
特攻隊長まるるう  2008-04-15 21:06:37  No: 144648  IP: 192.*.*.*

>↑の数字を削ればいいんですね
残念。その着眼点は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 を渡します。

編集 削除
HTML-M  2008-04-16 14:12:10  No: 144649  IP: 192.*.*.*

本当に親切ですね!
ありがとうございます!!!!!!

編集 削除
HTML-M  2008-04-16 15:27:44  No: 144650  IP: 192.*.*.*

大変失礼*9e+999999999999999999999999
ですが、どうしてももう一つ聞きたいです。
テトリスのようなゲーム(テトリスとは別)を作りたいのですが、
あれは、テトリスはブロックが落下するときに、下に描画しますが、
上にある落下前のブロックは消えますよね?
あれは背景のいろで上書きしてるんですか?

編集 削除
特攻隊長まるるう  2008-04-16 16:18:06  No: 144651  IP: 192.*.*.*

>これは、あるサイトから得たテトリスのプログラムの1部ですが、
の話でしょうか?描画部分のコードは示されていないので
分かりません。

描画処理の書き方によって結果は変わります。

フォームの再描画処理で勝手に消えてしまう場合もあれば、
背景の色で上書きしてる場合もあるでしょうね。
ブロックを別のコントロールで作成しているなら、そちらの
描画処理に任せている場合もあるでしょう。

可能性の話では確かな回答はできません。

編集 削除
もげ  2008-04-16 18:33:17  No: 144652  IP: 192.*.*.*

他人の作品(コードもそうです)の一部を利用する際には、
誰が書いたのか、どこからコピーしたのか
を必ず明らかにしましょうね。
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

編集 削除
HTML-M  2008-04-16 20:01:32  No: 144653  IP: 192.*.*.*

得たサイト:
>>http://www.teu.ac.jp/chiit/~jsuzuki/doc/pnc2007/n03/index.html

編集 削除
HTML-M  2008-04-16 20:04:40  No: 144654  IP: 192.*.*.*

入門サイトですので、
商用等しなければ問題ないでしょう。
出来たものも配布するときリンクすれば問題ないでしょう。

編集 削除
HTML-M  2008-04-16 20:51:57  No: 144655  IP: 192.*.*.*

やっぱり最初からリンクしとけばよかった(^^;)

編集 削除
さむ  2008-04-16 23:51:39  No: 144656  IP: 192.*.*.*

>HTML-M
そろそろ「推敲」という言葉を知った方がいいぞ。
チャットじゃないんだ。思いつきでポコポコ連投されたらウザくてしょうがない。

編集 削除
通りすがり  2008-04-17 15:35:57  No: 144657  IP: 192.*.*.*

>(ちなみに、そのサイトの所有者のメールアドレスは不明です。
http://www.teu.ac.jp/chiit/~jsuzuki/doc/index.html
連絡先書いてあるし、★質問用掲示板★もある。(見難いけど

>入門サイトですので、
>商用等しなければ問題ないでしょう。
>出来たものも配布するときリンクすれば問題ないでしょう。
もげさん御紹介のリンク先で著作権についてしっかり勉強したなら
認識が甘いことが分かると思います。
プログラミングコードをこの掲示板に引用した時点で問題ありです。

それで訴えられることはまずありませんが、訴えられれば負けるでしょう。
それ以前に、他人のコードを勝手に盗むわけですから、相手に対する
感謝の気持ちが無いと言えます。そのような態度はこの掲示板の回答者
への印象も悪くなります。

編集 削除
HTML-M  2008-04-17 15:38:32  No: 144658  IP: 192.*.*.*

すません_(↓_↓)_

編集 削除
HTML-M  2008-04-17 15:49:57  No: 144659  IP: 192.*.*.*

でも盗んだりしませんよ。
著作権はわたしにはありませんから。

もし配布するんだったらちゃんと著作権マークつけます。
あと、作者には感謝していますよ。
作者のプログラムのおかげで自分のプログラムの作成が簡易になります。

編集 削除
特攻隊長まるるう  2008-04-17 16:58:25  No: 144660  IP: 192.*.*.*

>もし配布するんだったらちゃんと著作権マークつけます。
>あと、作者には感謝していますよ。
>作者のプログラムのおかげで自分のプログラムの作成が簡易になります。
うん。だから自分の中ではそうなんだろうけど、他人が外から見ても
『ああ、HTML-Mさんはちゃんと作者に敬意を払ってるな』
って分かるかどうか?ってことです。

実際に、今の段階で、作者に連絡は取ってないんでしょ?
で、この掲示板で質問する際に作者のページを紹介しなかった。
コードの一部を勝手にこの掲示板にコピーした。
十分に考えずに書き込みする。(小6に求めるもの酷ですが。。。)

これらの行動を他人から見たらどうでしょう?そのあたりが
大事にしてないように写ってるので、今後少しずつ気をつけて
もらえばいいと思います。

コードをざっと解析しました。
描画クリアについてはタイマーのイベントの最初に
>        '画面を黒でクリアする
…そのまんまのコメントで書いてありますよね(^^;
質問する前に少なくとも3回はコードに目を通して欲しいです。
コードを十分に読んでないのも大事にしてないように写りますよ?
# というか感謝を他人に分かるレベルで表現するのは、かなり
# 気(と労力)を使う必要があります。普通に考えていては出来ません。

>        g.Clear(Color.FromArgb(0, 0, 0))
この1行をコメントアウトして実行してみてください。
前の描画が残ったまま実行されます。

編集 削除
HTML-M  2008-04-17 18:00:54  No: 144661  IP: 192.*.*.*

すみません!
本当にすみません!

編集 削除
HTML-M  2008-04-20 11:59:22  No: 144662  IP: 192.*.*.*

アレ?
コンパイルエラー?

編集 削除
 2008-04-20 20:44:38  No: 144663  IP: 192.*.*.*

>アレ?
>コンパイルエラー?
日本語でおk

編集 削除
HTML-M  2008-04-20 21:25:31  No: 144664  IP: 192.*.*.*

>日本語でおk
一応日本語(カタカナ)ですけど・・・?

編集 削除
やじゅ  2008-04-20 22:42:01  No: 144665  IP: 192.*.*.*

チャットじゃないんだから、思いつきで連投はやめましょう。
小6だからって、もう分かるでしょ。

編集 削除