神経衰弱

タグの編集
投稿者 一二三  (学生) 投稿日時 2013/11/1 17:06:23
はじめまして一二三と言いますよろしくお願いいたします。
今VB2010で神経衰弱を作っているんのですがわからないことがあったので質問させていただきます。

トランプの画像の「スペードの1」がピクチャーボックス1に入ってたとします、そして、このカードのマークがスペードで数字が1だという風にコンピューターが解るように作りたいんですがやり方がわかりません。(52枚分)
投稿者 一二三  (学生) 投稿日時 2013/11/1 17:07:40
ぜひともやり方を教えて貰いたいです。
よろしくお願いいたします(@_@)
投稿者 黒猫  (学生) 投稿日時 2013/11/1 20:04:49
初めまして、黒猫といいます。
何やら私と似たようなプログラムを書いていらっしゃるようなので、少し手助けができればと思い、コメントしてます。
私自身、VB初心者の手探りなので、あまり専門用語を使って説明できないのでご参考までに。

まずは確認です。
PictureBoxで表示したカード画像が何の画像なのかをプログラムに理解させたいということでよろしいでしょうか?

使っている画像の種類は何でしょうか?
手作りの画像ならばGIFで作成されたのでしょうか。

私の場合は、写真画像のJPGに付加されているExif情報を取得するようなプログラムを使用しています。
特に写真の撮影日を取得するようにプログラムしていますが、これを応用すればプロパティにあるコメント欄の情報などを取得することも可能かと思います。

つまり、
52枚の画像をJPGとして保存(ペイントソフトなどでやってください)
 ↓
プロパティにてコメント欄などに「スペード1」と登録
 ↓
プログラムにてコメント欄の情報を取得させて変数に格納
 ↓
その変数に入っている内容で判定させる

という感じにすることもできるのではないかと思いますが…。



以下、日付を取得するプログラムコード++++++++++++++++++++++++++++++++++

'読み込む
            Dim bmp As New System.Drawing.Bitmap(画像ファイルを入れたString型の変数)
            Dim item As System.Drawing.Imaging.PropertyItem
            For Each item In bmp.PropertyItems

                'Exif情報から撮影時間(&H9003)を取得する
                'item.Type = 2 (PropertyItem.Typeプロパティの値=>ASCII 形式でエンコードされた Byte オブジェクトの配列)
                If item.Id = &H9003 And item.Type = 2 Then

                    '文字列に変換する
                    Dim Val As String = System.Text.Encoding.ASCII.GetString(item.Value)
                    Val = Val.Trim(New Char() {ControlChars.NullChar})

                    'DateTimeオブジェクトに変換する
                    Dim dt As DateTime = DateTime.ParseExact( _
                        Val, "yyyy:MM:dd HH:mm:ss", Nothing)

                    '月を取得する
                    mdM = dt.Month
                    '日を取得する
                    mdD = dt.Day

●調べてみたところ、ユーザーコメントは「&H9286」のようです。
なので、コードの「&H9003」の部分を書きなおし、他の部分を直せばいいかも…?
というか、一二三さんの場合、文字列に変換の時点で必要なものは取得できてるかもですね。

参考になりそうなURLです。+++++++++++++++++++++++++++++++++++++++++++++
■画像のExif情報を取得する、設定する
http://dobon.net/vb/dotnet/graphics/getexifinfo.html

■出力項目についてちょろっと書いてあったので、ご参考までに
http://homepage3.nifty.com/koizumipro/picupttl.htm


分からないことあれば、一応質問受け付けますのでどうぞ…!
投稿者 るきお  (社会人) 投稿日時 2013/11/1 22:24:47
>トランプの画像の「スペードの1」がピクチャーボックス1に入ってたとします、
>そして、このカードのマークがスペードで数字が1だという風にコンピューターが解るように作りたいんですがやり方がわかりません。(52枚分)

一二三さんは勘違いをされていると思います。
(プログラムに慣れていない方はよくこれと同じ勘違いをしています。)

プログラム的には
「PictureBox1に画像が表示されている。」→解析→「スペードの1だ」
という構造にはしません。
「スペードの1がめくられた」→「スペードの1を表示すべきだ」→スペードの1を表示する。
という構造にします。

だから、表示されているものが何であるか判定するようなプログラムはゲームには一切必要ありません。これは神経衰弱であれ、マリオブラザーズであれ、モンハンであれすべて同じです。

剣が尻尾にあたったか画像を見ながら判断するプログラムがあるのではなく、
剣が尻尾にあたったので、剣が尻尾にあたっている画像を表示しているのです。

それでも表示するものを判定するプログラムが書けないわけではありませんが、いばらの道であり目的がゲーム作りであるならば得することはないです。
投稿者 るきお  (社会人) 投稿日時 2013/11/1 22:26:14
言葉だけでは伝わりにくいと思うので簡単なサンプルを紹介します。

このサンプルではプログラムの全体像を見やすくするためにトランプは3枚しか使いません。
PictureBox1~3 と Button 1つがフォームに配置されている前提です。

Buttonをクリックすると、PictureBoxにトランプの画像が表示されます。
PictureBoxをクリックすると表示されているトランプの名前「スペード1」のように表示します。

※もし、実際に実行するのであればプログラムと同じフォルダー(多くの場合 \bin\debug\)に image というフォルダーを作ってそこにトランプの画像を入れておいてください。画像ファイル名はプログラム中に記載しています。

Public Class Form1

    Dim card1 As String
    Dim card2 As String
    Dim card3 As String

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        'ここではシャッフルはテーマでないので扱いませんが、 
        'シャッフルしても正常に表示・判定できます。 
        card1 = "スペード1"
        card2 = "ダイヤ5"
        card3 = "クラブ9"

        PictureBox1.Image = GetImage(card1)
        PictureBox2.Image = GetImage(card2)
        PictureBox3.Image = GetImage(card3)

    End Sub

    ''' <summary>トランプの画像を取得します。</summary> 
    Private Function GetImage(card As StringAs Image

        Dim fileName As String = ""

        Select Case card
            Case "スペード1"
                fileName = "s01.png"
            Case "ダイヤ5"
                fileName = "d05.png"
            Case "クラブ9"
                fileName = "c09.png"
        End Select

        Dim folder As String = Application.StartupPath & "\image"
        Return Image.FromFile(folder & "\" & fileName)

    End Function


    Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click

        MsgBox(card1)

    End Sub

    Private Sub PictureBox2_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click

        MsgBox(card2)

    End Sub

    Private Sub PictureBox3_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox3.Click

        MsgBox(card3)

    End Sub
End Class