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


HTML-M  2008-04-15 02:28:21  No: 144631

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-15 03:07:41  No: 144632

>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-15 03:11:19  No: 144633

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


HTML-M  2008-04-15 03:23:18  No: 144634

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


特攻隊長まるるう  2008-04-15 03:53:20  No: 144635

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

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

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


HTML-M  2008-04-15 04:01:18  No: 144636

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


HTML-M  2008-04-15 04:04:57  No: 144637

If ColorNo And 4Then

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


特攻隊長まるるう  2008-04-15 04:50:41  No: 144638

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

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


HTML-M  2008-04-16 01:37:34  No: 144639

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-16 01:53:50  No: 144640

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-16 02:34:17  No: 144641

小6です。

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


もげ  2008-04-16 03:00:46  No: 144642

プログラムで書いてみると面白いかも。
    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-16 03:54:57  No: 144643

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


特攻隊長まるるう  2008-04-16 04:10:14  No: 144644

いよいよ、プログラムの面白いところに入ってきました。。。
。。。でもいきなりもげさんに美味しいところを食べられて
しまいました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-16 04:47:41  No: 144645

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


HTML-M  2008-04-16 04:50:24  No: 144646

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


HTML-M  2008-04-16 05:28:54  No: 144647

悩んでます(〜w〜)


特攻隊長まるるう  2008-04-16 06:06:37  No: 144648

>↑の数字を削ればいいんですね
残念。その着眼点は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 23:12:10  No: 144649

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


HTML-M  2008-04-17 00:27:44  No: 144650

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


特攻隊長まるるう  2008-04-17 01:18:06  No: 144651

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

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

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

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


もげ  2008-04-17 03:33:17  No: 144652

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

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


HTML-M  2008-04-17 05:04:40  No: 144654

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


HTML-M  2008-04-17 05:51:57  No: 144655

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


さむ  2008-04-17 08:51:39  No: 144656

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


通りすがり  2008-04-18 00:35:57  No: 144657

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

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

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


HTML-M  2008-04-18 00:38:32  No: 144658

すません_(↓_↓)_


HTML-M  2008-04-18 00:49:57  No: 144659

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

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


特攻隊長まるるう  2008-04-18 01:58:25  No: 144660

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

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

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

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

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


HTML-M  2008-04-18 03:00:54  No: 144661

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


HTML-M  2008-04-20 20:59:22  No: 144662

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


  2008-04-21 05:44:38  No: 144663

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


HTML-M  2008-04-21 06:25:31  No: 144664

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


やじゅ  2008-04-21 07:42:01  No: 144665

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加