投稿者 るきお  (社会人) 投稿日時 2013/10/29 15:23:28
コンピューターは「カード」を理解していません。ですから、「カードを捨てる」ということはできません。
計算やデータの読み書きならばコンピューターは得意です。

プログラマは表現しようとしていることを、コンピューターが得意な計算やデータの読み書きに置き換えて考える必要があります。

カードの扱いをどのようにして 計算やデータの読み書き に置き換えるかは実にさまざまな方法があって無数と言っていいほどです。

高橋だよさんの質問には 計算やデータの読み書き についてはまったく触れられていないので、回答する人がそのことを考える必要があります。
しかし、それには無数の方法があるので回答する人によって考えていることが違くなります。
回答する知識がある人は当然そのことに気が付いているので、回答しにくくなります。

また、「カードを捨てる」ことをなんとか計算やデータの読み書きに置き換えて回答したとしても、次に、では「カードを取る方法は?」となると、また計算やデータの読み書きを考える必要があり、最初の回答のときに考えていたこととは異なる発想になるかもしれません。

つまり、このような質問の仕方はプログラム上あまり意味がないと私は思います。

では、どうすればいいかというと、
まずは高橋さんはババ抜きをどのようにして計算やデータの読み書きで表現するかを考えるべきで、わからないところがあればそれを質問すべきです。

たとえば、トランプのカードはババも入れると53枚あります。
だからデータを保存するために53個のカード型の変数を作ることにしましょう。
しかし、53個も変数を宣言するのは大変なので、まずはコレクションにしてみましょう。
この段階でわからなければ「ババ抜きを前提に、VBのプログラムでカードを表現する最適な方法は何か?」というような質問になるわけです。

ひとまず、次のようにします。
Public Class Form1

    Dim cards As New List(Of Card)

End Class

Public Class Card

End Class


しかし、カードにはマークと数字の個性がありますから、このデータはプロパティで表現するようにしましょう。
(ババは特別なマークと考えることにします。)

次のようになります。
Public Class Form1

    Dim cards As New List(Of Card)

End Class

Public Class Card
    Public Property Mark As String
    Public Property Number As Integer
End Class


これでカード自体の管理方法は決まりましたが、まだカードの実体が1枚もありません。FormのLoad時にカードの実体を生成するようにしてみます。
Public Class Form1

    Dim cards As New List(Of Card)

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        For i As Integer = 1 To 13
            cards.Add(New Card With {.Mark = "スペード", .Number = i})
            cards.Add(New Card With {.Mark = "ダイヤ", .Number = i})
            cards.Add(New Card With {.Mark = "クラブ", .Number = i})
            cards.Add(New Card With {.Mark = "ハート", .Number = i})
        Next

        cards.Add(New Card With {.Mark = "ババ"})

    End Sub
End Class

Public Class Card
    Public Property Mark As String
    Public Property Number As Integer
End Class


これで53枚のカードは実体化されました。