関連するとこ。→東方算程譚:カードのシャッフル(http://blogs.wankuma.com/episteme/archive/2007/05/21/77545.aspx)
ほんとは「ひっこ抜いたやつからまたひっこ抜く」だったんですけど、手間なので今回は書かず。
επιστημηさんのみたいな感じで言葉のまま書いてみましたよ♪(細かいとこなんも考えてません。)しかもめんどくさいので1~13の数字で(ぉぃ!
まずは 'カード' を抽象化したクラス。
Imports System
Public MustInherit Class PlayingCard
Public MustOverride Function GetCardInfo() As String
End Class
次にカードの絵柄の列挙体と、番号のカード クラス。
Imports System
Public Enum Suit
Spade
Heart
Diamond
Club
End Enum
Public Class NumberCard
Inherits PlayingCard
Private _number As Integer
Public ReadOnly Property Number() As Integer
Get
Return _number
End Get
End Property
Private _suit As Suit
Public ReadOnly Property Suit() As Suit
Get
Return _suit
End Get
End Property
Public Sub New(ByVal number As Integer, ByVal suit As Suit)
If number < 1 OrElse 13 < number Then
Throw New ArgumentOutOfRangeException("どんなカード作る気だごるぁ!")
End If
Me._number = number
Me._suit = suit
End Sub
Public Overrides Function GetCardInfo() As String
Return "[" & Me.Suit.ToString & ":" & Me.Number.ToString & "]"
End Function
End Class
ジョーカー クラス。
Imports System
Public Class Jorker
Inherits PlayingCard
Public Overrides Function GetCardInfo() As String
Return "I am Jorker! HAHAHA!"
End Function
End Class
ディーラーの基本クラス。
Imports System
Imports System.Collections.Generic
Public MustInherit Class AbstractDealer
Private _deck As List(Of PlayingCard)
Public Sub New()
End Sub
Public Sub SetNewDeck()
Me._deck = New List(Of PlayingCard)
For i As Integer = 0 To 12
Me._deck.Add(New NumberCard(i + 1, Suit.Club))
Next
For i As Integer = 0 To 12
Me._deck.Add(New NumberCard(i + 1, Suit.Diamond))
Next
For i As Integer = 0 To 12
Me._deck.Add(New NumberCard(i + 1, Suit.Heart))
Next
For i As Integer = 0 To 12
Me._deck.Add(New NumberCard(i + 1, Suit.Spade))
Next
Me._deck.Add(New Jorker)
Me._deck.Add(New Jorker)
End Sub
Protected ReadOnly Property Deck() As List(Of PlayingCard)
Get
Return _deck
End Get
End Property
Public ReadOnly Property HasCard() As Boolean
Get
Return Not Me._deck.Count = 0
End Get
End Property
Public MustOverride Sub Shuffle()
Public Function Deal() As PlayingCard
If Me._deck.Count = 0 Then
Throw New InvalidOperationException("ねーよwwww")
End If
Dim card As PlayingCard = Me._deck.Item(0)
Me._deck.RemoveAt(0)
Return card
End Function
End Class
いいだしっぺの'とりこびディーラー'クラス。
Imports System
Imports System.Collections.Generic
Public Class TorikobiDealer
Inherits AbstractDealer
Public Overrides Sub Shuffle()
Dim leftHand As List(Of PlayingCard) = Me.Deck
Dim rightHand As New List(Of PlayingCard)
Dim r As New Random()
For i As Integer = 0 To 100
Dim cutStartIndex As Integer = r.Next(Deck.Count)
Dim cutEndIndex As Integer = r.Next(cutStartIndex, Deck.Count)
rightHand.AddRange(leftHand.GetRange(cutStartIndex, cutEndIndex - cutStartIndex))
leftHand.RemoveRange(cutStartIndex, cutEndIndex - cutStartIndex)
leftHand.InsertRange(0, rightHand)
rightHand.Clear()
Next
End Sub
End Class
お試しプログラムクラス。
Imports System
Public Class Program
Public Shared Sub Main()
Dim dealer As New TorikobiDealer
dealer.SetNewDeck()
Console.WriteLine("New Deck ------------------------------------------------------------------------")
While dealer.HasCard
Dim card As PlayingCard = dealer.Deal()
Console.WriteLine(card.GetCardInfo())
End While
dealer.SetNewDeck()
dealer.Shuffle()
Console.WriteLine("Shuffled Deck --------------------------------------------------------------------")
While dealer.HasCard
Dim card As PlayingCard = dealer.Deal()
Console.WriteLine(card.GetCardInfo())
End While
End Sub
End Class
んでもって結果。
New Deck |
Shuffled Deck |
[Club:1]
[Club:2]
[Club:3]
[Club:4]
[Club:5]
[Club:6]
[Club:7]
[Club:8]
[Club:9]
[Club:10]
[Club:11]
[Club:12]
[Club:13]
[Diamond:1]
[Diamond:2]
[Diamond:3]
[Diamond:4]
[Diamond:5]
[Diamond:6]
[Diamond:7]
[Diamond:8]
[Diamond:9]
[Diamond:10]
[Diamond:11]
[Diamond:12]
[Diamond:13]
[Heart:1]
[Heart:2]
[Heart:3]
[Heart:4]
[Heart:5]
[Heart:6]
[Heart:7]
[Heart:8]
[Heart:9]
[Heart:10]
[Heart:11]
[Heart:12]
[Heart:13]
[Spade:1]
[Spade:2]
[Spade:3]
[Spade:4]
[Spade:5]
[Spade:6]
[Spade:7]
[Spade:8]
[Spade:9]
[Spade:10]
[Spade:11]
[Spade:12]
[Spade:13]
I am Jorker! HAHAHA!
I am Jorker! HAHAHA! |
[Diamond:12]
[Spade:5]
[Diamond:5]
[Diamond:6]
[Diamond:2]
[Spade:13]
[Heart:1]
[Diamond:1]
[Heart:13]
[Heart:4]
[Diamond:7]
[Heart:11]
[Spade:8]
[Heart:10]
[Heart:9]
[Diamond:3]
[Heart:6]
[Heart:3]
[Diamond:11]
[Heart:2]
[Club:2]
[Club:6]
[Club:12]
[Club:13]
[Diamond:9]
[Club:1]
[Heart:5]
[Diamond:4]
[Spade:3]
[Spade:7]
[Club:4]
[Diamond:13]
[Diamond:8]
[Spade:6]
[Spade:12]
[Club:9]
[Club:8]
[Heart:12]
[Spade:4]
[Spade:10]
I am Jorker! HAHAHA!
[Spade:11]
[Club:5]
[Spade:9]
I am Jorker! HAHAHA!
[Spade:2]
[Heart:8]
[Club:10]
[Diamond:10]
[Club:11]
[Spade:1]
[Heart:7]
[Club:7]
[Club:3]
|
混ざったような・・・混ざってないような・・・。ってか、まったくスマートじゃないですね。