とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

混ざるかな?

関連するとこ。→東方算程譚:カードのシャッフル(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 IntegerByVal 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()
        ' テケトーに引っこ抜いて上にのっける作業×100         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]

混ざったような・・・混ざってないような・・・。ってか、まったくスマートじゃないですね。

投稿日時 : 2007年5月21日 18:56

Feedback

# re: 混ざるかな? 2007/05/21 19:47 ぽぴ王子

これまたトランプのシャッフル理論を言い出しておいてアレなんですけれども。
「ぐじゃんぐじゃんに混ぜる」という意味であれば、必ずしもトランプと同じ方法でシャッフル
する必要はないッスよ、ということなんでしょうね。
# でもいい感じにシャッフルされてますね。

この辺で昔話に突入するわけですが(と書き出すととっちゃんがかぎつけてやってくるに
違いないw)昔のPDA…っていうかPDAという言葉が生まれたぐらいの頃の話。
当時のPDAは「いかに机の上を摸したUIにするか、ってのが流行ってたわけですよ。
机があって、机の上には時計があって、メモ帳があって、カレンダーがあって…みたいな。
それぞれをタップするとメモ書きできたりカレンダーで予定が確認できたり、って感じでした。
でも「これって使いづらくねえ?」という話になり、現実そのもののユーザインターフェース
が使いやすいとは限らないという教訓を残した…ってだいぶうろ覚えで書いてるので
間違ってるところ多数だと思いますがそんなときは指摘お願いします(誰に?)。


カードクラスの代わりに cleanser クラスかなんかを作って、それを継承して…
Me._deck.Add(New ChlorineCleanser())
Me._deck.Add(New AlkalineCleanser())
でシャッフルしたらどうなるかしら…とか思ったのはナイショ。

# re: 混ざるかな? 2007/05/21 19:58 とりこびと

ぽぴ王子 さん、コメントありがとうございます。

># でもいい感じにシャッフルされてますね。

これループが0 to 10じゃないです。
0 to 100です。

すみませんでした。m(_ _)m

# re: 混ざるかな? 2007/05/21 20:00 とりこびと

>カードクラスの代わりに cleanser クラスかなんかを作って、それを継承して…
>Me._deck.Add(New ChlorineCleanser())
>Me._deck.Add(New AlkalineCleanser())
>でシャッフルしたらどうなるかしら…とか思ったのはナイショ。

混ぜるな危険!!www

# re: 混ざるかな? 2007/05/21 20:02 とりこびと

あ、×100って・・・。orz

# re: 混ざるかな? 2007/05/21 20:38 黒龍

いわゆるフツーのシャッフルだと上に乗せるだけでわなくて小枚数(1~数枚)の単位で逆向きにする感じが近いかも。
実装は・・・ごめんなさい。許してください。
(乗せるだけだとカットっぽい)
二つに分けた後交互にするシャッフル(リフルシャッフル)は完全に交互にする場合には数理的な移動を起こすので二つに分ける方向(上を左、右を下等)とどちらから落とし始めるかをでコントロールもできたりします。
(たとえば同一にして繰り返すと8回で元に戻るなど)

せっかくのトランプネタなのに乗り遅れた^^;

# re: 混ざるかな? 2007/05/21 22:19 とっちゃん

>かぎつけてやってくるに
嗅ぎつけてきましたよw

えーっと...PDAでなくて、デスクトップGUIのお話っすねw

PDA は、システム手帳をコンピュータにしたらが出発点です。
デスクトップ(机の上の世界)を持ち出せたらではないですよw

デスクトップを持ち出せたらは、ラップトップコンピュータですなw

え?本題っすか?忙しいのでスルーしてますwww

今日はマシンの調子が悪いですよ。Vista固まったし...orz
デバッグ中に固まったもんで、IEのキャッシュはパーだし、RSS Bandit は立ち上がらなくなるしで悲惨なことに...

仕事はまぁそこそこ忙しいですwww<おい!
やっと、あと少しだ~というフインキが出てきてますwww
#まだそろってねーのはないしょということでw

# re: 混ざるかな? 2007/05/22 9:18 Redseen

初めまして。
ディーラーの混ぜるためのリストが右手、左手ってのはシビれました^^

# re: 混ざるかな? 2007/05/22 10:00 とりこびと

コメントありがとうございます。


>>黒龍さん

>いわゆるフツーのシャッフルだと上に乗せるだけでわなくて小枚数(1~数枚)の単位で逆向きにする感じが近いかも。
>(乗せるだけだとカットっぽい)

ですね。
不意をついてεπιστημηさんがエントリなさったのでバタバタしちゃってます。(人のせいにするな。

>二つに分けた後交互にするシャッフル(リフルシャッフル)は完全に交互にする場合には数理的な移動を起こすので二つに分ける方向(上を左、右を下等)とどちらから落とし始めるかをでコントロールもできたりします。
>(たとえば同一にして繰り返すと8回で元に戻るなど)

なるほど~。私はカードの世界では素人に毛の生えてないような素人なので勉強になります♪

>せっかくのトランプネタなのに乗り遅れた^^;

いえいえ、いまだ、以前のわんくま勉強会の懇親会で見せていただいたトリックが分かってないのはここだけのナイショですwww


>>とっちゃん さん

>嗅ぎつけてきましたよw

いまごろ、ぽぴ王子さんはニヤニヤしてるんでしょうねw

>え?本題っすか?忙しいのでスルーしてますwww

ちょwwww


>>Redseenさん

>初めまして。

こちらこそはじめまして。よろしくおねがいします。m(_ _)m

>ディーラーの混ぜるためのリストが右手、左手ってのはシビれました^^

ありがとうございます。
ちょっとした遊び心ですね♪(かっこよく言ってみる。)

実際は頭の中をコードにしたらこうなっただけなんですけどね^^;

# re: 混ざるかな? 2007/05/22 11:47 ぽぴ王子

> いまごろ、ぽぴ王子さんはニヤニヤしてるんでしょうねw
してません!
石川梨華はう○ちしません!(何を言ってるんだ)

> PDA は、システム手帳をコンピュータにしたらが出発点です。
> デスクトップ(机の上の世界)を持ち出せたらではないですよw

えーとまぁやっぱり適当に書いたら誤解を招いている感じがしますが…
PDA の起源とかいう話ではなくてですね、PDA で机上を摸した UI の
やつがあって、そのインターフェースは使いにくいぜコンチクショー!
という記事をどこかで見た、と。
そして現実の使いやすい UI を摸したからといって必ずしも使いやすい
ものができあがるとは限らんぜコンチクショー!という話でした。

記憶を頼りにいろいろ探してみたところ、たぶんこの辺。
ttp://homepage3.nifty.com/dkxwin/casio/casio.html
これの RX-300 ってののあたりだと思われ。

ちなみに隣の RX-10 は MS-DOS でのリンクソフトを開発してました。
オリジナルのウィンドウシステムを使っていて、メインメニューを
マウスで動かすと背景に開発スタッフの名前が出るというギミックを
仕込んでおいたら、C 社(バレバレ)から「ウィンドウを動かすと
ゴミが出ます」というバグレポートが上がってきたのが印象深い(ぉ
後継機の RX-20 というのが出るときに「リンクソフトの Windows への
移植をやらないか?ウホッ」と言われたわけですが、当時の社内に
Windows でのプログラミングができる人が(自分を含め)誰もいなかっ
たのでお断りした経験が。
そして「これからは Windows プログラミングできなあかん!」と転職
したのが10年以上前の話…ええ、また昔話ですが、何か?

# re: 混ざるかな? 2007/05/22 13:25 とっちゃん

>RX-300
こんなのあったのねぇ...
世の中広いねぇ...いかにも...なUI...

いろいろなことを試してた時代だからなww

C社というと...ハンディだしてたのは、コンパックじゃなくてHPだw<Cないし!
C社というと...いろいろしがらみが...orz<違うから!

うちは...当時は読みが当たったのでそうそうにWindowsにいきました...
おかげで、生き残ってるのですが...

当時の偉い人がもっと偉くなっちゃったので、偉い人の席(役割ねw)が空いてて...まぁ、いろいろとw

# re: 混ざるかな? 2007/05/23 14:08 アクア

良く出来てるなぁ…(T-T)

# re: 混ざるかな? 2007/05/23 16:28 とりこびと

>>アクアさん

>良く出来てるなぁ…(T-T)

なぜ泣く!?

AbstractDealer を継承して Shuffle() だけ オーバーライドできるようにしといたら、
誰かがほかのヤツも作ってくれるかなぁって思いまして。

思惑は失敗・・・。orz

# re: 混ざるかな? 2007/05/24 0:29 アクア

理由は簡単です。

私の場合、Tryして例外がThrowされたから…

えーっとなんて例外だったかなぁ~
たしか NotLogicalCodeException!? orz

タイトル
名前
Url
コメント