VBでのカードゲーム作成

このQ&Aのポイント
  • VB.netを使ったプログラムについての質問です。
  • カードゲーム作成において、カードの画像をResourcesフォルダに保存しましたが、手札をランダムに配るための処理やアニメーションについてわかりません。
  • ポーカーを作成したいのですが、役の判定アルゴリズムはできています。
回答を見る
  • ベストアンサー

VBでのカードゲーム作成

VB.netを使ったプログラムについての質問です。 某トランプゲームをみて私もつくろうと思い立ったのですが、分からない点が見つかったのでご教示願いたいです。 ソリューションエクスプローラー内にResourcesという ファイルを作りカードの画像をジョーカー含め53枚入れました。(関係ないのかは不明です。) 手札ということで、カード53枚の中からランダム5枚入手するためにはどういった処理をすればいいのでしょうか? 配列に入れるにしてもどのように扱ったらいいかわからないですし、「山札から手札を配る」のようなアニメーションを加えるにもどうしたらいいかわからないです。 コード丸ごとでなくても「この書籍を見ればいい」「このサイトを見ればいい」などお教え頂く形でも構いません。一応ネットで調べたり、"逆引き大全"などは見たのですがわかりません。 作るものとしては、ポーカーをつくろうと思っています。役の判定アルゴリズムはできているのですが、そのほかがわからないので、お願いします。 □□□□□ □□ □□□□□ とありますが 中段右端を山札とした時、そこから手札配布といったアニメーションができるか、をお教えいただきたいです。 ですがあくまでメインは”乱数発生させて、ランダムで手札を作れるかどうか”です

noname#222532
noname#222532

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

なるほど。だがしかしそれこそSystem.Drawing.Bitmapをリストかマップで保持しとけば良いのではないかな。当方シーシャーパーなのでVB風の書き方がこれであってるのかは不明。 ・リスト(と言うかこれは配列だね) Dim bmps As New System.Drawing.Bitmap() bmps(0) = <ジョーカーの絵札の画像> bmps(1) = <スペードのAの絵札の画像> ... bmps(52) = <ダイヤのKの絵札の画像> Dim hoge As Bitmap = bmps(1) ・マップ Dim table As New System.Collections.Generic.Dictionary(Of Integer, System.Drawing.Bitmap) table.Add(0, <ジョーカーの絵札の画像>) table.Add(1, <スペードのAの絵札の画像>) ... table.Add(52, <ダイヤのKの絵札の画像>) Dim hoge As Bitmap = table(1) どちらも登録後は配列から値を引っ張ってくるように使える。 結局、ここは「5がスペードの5を意味する」というアルゴリズム上の意味づけと、5という数値から絵柄を引っ張ってくるためにどうデータを持たせるかっちゅう事になるんじゃないかね。マップにしておくと、52枚のカード表絵とは別に-1とかそういう値をキーに裏絵のイメージも保持できるのでマップの方が良いかもね。 あなたのプログラムの中で14がハートのAを意味し、table(14)がハートのAの表柄の絵を意味するようになれば良いわけだ。 で、本題に戻ってランダムの方は0~52がカードを意味するんだから、普通にSystem.Random#Next(52)すればランダムが取れる。 さらに、 Dim yamafudas As Boolean(52) で、「Falseが山札に臥せっている状態」で「Trueが山札以外の場所にある」というような意味づけでも良いし、 □□□□□ ←相手の手札の12345を11 12 13 14 15と定義 □□ ←山札の右が山札でそれを1、(左は何? とりあえず2で) □□□□□ ←自分の手札の12345を21 22 23 24 25と定義 という風に場の各スロットにIDをつけて、 Dim cards As Integer(52) として、cards(1) = 1とするとスペードのAは山札にある、cards(1) = 22として自分の手札の2番目にあるという風にするとか、とにかく「山札の中に何のカードが残っているか」が管理できるようになれば0~52でランダムに選ばれたカードがもう引かれているか山札の中にあるかが分かるので重複してカードが引かれないというところを実現できる。 オブジェクト指向風に考えるとカードクラスがあったりスロット(カードが置かれている場所)クラスがあったり場をあらわすクラスがあったりして、カードクラスにはBitmapがあってスロットクラスには今入っているカードが設定できたりして場クラスにはスロットがいくつか入っているのだろうね。

noname#222532
質問者

お礼

回答ありがとうございました!今日一日かけて自分なりに答えは見つけましたが、それは別としても大変参考となる回答でした。 また疑問点が見つかったので、それはまた別の機会に質問するとして、 今回はありがとうございました! またつまづいたとき参考にさせていただきます

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> 手札ということで、カード53枚の中からランダム5枚入手するためにはどういった処理をすればいいのでしょうか? とりあえずマルチメディア的な話(アニメーションとか)は置いておいて、トランプのカードをプログラム内で表現する方法を考えてみよう。まず、カードに連番を振っていこう。 0:ジョーカー 1:スペードのA 2:スペードの2 3:スペードの3 4:スペードの4 5:スペードの5 6:スペードの6 7:スペードの7 8:スペードの8 9:スペードの9 10:スペードの10 11:スペードのJ 12:スペードのQ 13:スペードのK 14:ハートのA 15:ハートの2 16:ハートの3 17:ハートの4 18:ハートの5 19:ハートの6 20:ハートの7 21:ハートの8 22:ハートの9 23:ハートの10 24:ハートのJ 25:ハートのQ 26:ハートのK 27:クローバーのA 28:クローバーの2 29:クローバーの3 30:クローバーの4 31:クローバーの5 32:クローバーの6 33:クローバーの7 34:クローバーの8 35:クローバーの9 36:クローバーの10 37:クローバーのJ 38:クローバーのQ 39:クローバーのK 40:ダイヤのA 41:ダイヤの2 42:ダイヤの3 43:ダイヤの4 44:ダイヤの5 45:ダイヤの6 46:ダイヤの7 47:ダイヤの8 48:ダイヤの9 49:ダイヤの10 50:ダイヤのJ 51:ダイヤのQ 52:ダイヤのK こう定義しておくと、このなかからランダムに5枚選ぶのは乱数で普通に0~52のユニークな5個の数値を取ればよい。 で、次に先ほど定義した連番からカードを特定する方法だが、0だとジョーカーだし、1以上だと普通のカードになる。 1以上の場合にマークと番号を特定してみよう。マークは、番号をn As Integerとすると、(n - 1) Mod 13した時に0がA、1が2、2が3、~、10がJで11がQで12がKになる。次に(n - 1) / 13を切り捨てたものが0=スペード、1=ハート、2=クローバー、3=ダイヤだね。 で、こうすると何がうれしいかと言うと、カードを全部Integer 1つで表現できるようになる。 □□□□□ □□ □□□□□ のところで、 [1][3][7][10][32] □□ [14][15][16][17][18] とすると、相手はブタでこっちはハートのストレートフラッシュだね。Integer変数や配列を必要なだけ作ればゲームテーブルも簡単に表現できる。ユーザーインタフェースは別として。 とりあえずゲームのデータ構造が出来たので、後はアルゴリズムとアニメーションだね。がんばって!

noname#222532
質問者

お礼

ありがとうございます。とても丁寧に教えていただいて嬉しかったです。

noname#222532
質問者

補足

丁寧に教えていただいたのに申し訳ないのですが、そこは知っているところでした。 私の説明不足で申し訳ありません。 私が知りたいところは、その連番とカードの画像をどうリンクさせるか、です。 申し訳ございませんでした、そしてありがとうございました!

関連するQ&A

  • VBでのカードゲーム作成 (エラーについて)

    2回目の質問です。前回も”VBでのカードゲーム作成”について質問させていただきました。 乱数発生については回答を頂きながらも自力で突破しました。申し訳ありませんでした。 回答者様には感謝しています。 さて、本題ですが2点質問させていただきます。 Menu.vb をトップページとし、そこからボタンによる遷移でAloneGame.vb(一人プレイなので)という画面に移ります。 デバッグした際、トップページよりaloneに飛ぼうとしたところ、以下のエラーが発生しストップしました。 ---------------------------------------------------------------------------------- 'System.InvalidOperationException' のハンドルされていない例外が poker.exe で発生しました。 追加情報: フォームの作成中にエラーが発生しました。詳細については、Exception.InnerException を参照してください。エラー: オブジェクト参照がオブジェクト インスタンスに設定されていません。 ---------------------------------------------------------------------------------- (自力でポーカーを作っています。) 自分でも検索したり調べてはいますが、現在行き詰まっております。 今回は上記の質問がメインですが、前回に引き続きアニメーションについても質問させていただきたいと思います。 前回も少し書きましたが、 □□□□□   相手手札。伏せてあり、裏の模様のみ。 □□        片方が山札、片方が捨て札です。 □□□□□   自分の手札。 暫定的ではありますがこのような形です。 ソリティアなどのように、山札から手札が配られるというアニメーションを付け加えたいのですが、どうしたらいいのでしょうか? 尚、コードすべてを書いていただかなくても、参考書籍、参考ホームページを教えて頂く形でももちろん結構です。 私自身も随時調査中ではあります。 わかりにくいとは思いますがどうぞよろしくお願いします。 この質問を答えるにあたって欲しい情報がありましたら何なりと。

  • ポーカーで

    ジョーカーを含んだポーカーで、山札の上から10枚だけを考えたときに、どのように取り替えても絶対に役ができない確率を教えてください。

  • 日本のトリック・テイキング・ゲーム普及について

    日本では、トランプのトリック・テイキング・ゲーム(台札に続いて他の参加者が札を出し、最も強い札を出した人がカードと「トリック」を取って、次の台札を出すゲーム)が流行らないのはなぜですか? ツウ・テン・ジャックとか、結構面白そうな気がしますが・・・ Windowsのハーツも当てはまりますね。 周りでは、大富豪の人気だけが突出して高く、ポーカーやブタの尻尾をやる人がわずかにいるような状況です。 トリック・テイキング・ゲームは「正直者がバカを見る」可能性があるという事で、敬遠されているのでしょうか? 手札に台札の同種札を持っている場合は出さなければなりませんが、嘘を付いてそれを隠せば有利になってしまいますから・・・

  • トランプの組合せ、の話です。

    ポーカーの役の組合せに関する質問です。 ジョーカーを除く1デッキ52枚のカードを使ってポーカーをします。 5枚のカードをランダムに取り出したとき、「全く役ができない」(ノーペアであり、フラッシュでもストレートでもないし、同じ数字のカードが2枚以上入らない)組合せの中で、 「最も高いランクのカードがA」の組合せ 以下、K,Q,J,10,9,8,7の組合せ(6は必ずストレートになるのであり得ない)。 それぞれの組合せ数を知りたいのです。 ネットで調べてみると、総組合せ数2598960のうち、ノーペアに該当する手が1302540存在することは分かっています。 よろしくお願い致します。

  • 遊戯王カードの保管について

    http://www.geocities.jp/delyuerumasuta/DSC00690.JPG 遊戯王大会 上記の写真(左側)で、デッキ(山札)がオレンジや青のデッキを使っている人が居ますよね? あれはプロテクターですか?遊戯王カードはあんな色はしていません。 大会に出る人はああいうプロテクターをカードに入れて勝負するんでしょうか? 自分は透明のスリーブに1枚ずつ入れてカードを保管しています。 しかし、普通のスリーブはデッキで山札にしてもつるつる滑って持ちにくいです(手札)。 あそこに居る人達のプロテクター?は公式大会用のプロテクターなのでしょうか?(滑りにくい?) 自分も手に入れたいんでどこに売っているか情報教えて下さい。 宜しくお願いします。

  • ポーカーでワンペア状態から最も勝率の高い役を作る

    2人で行うポーカーをします。 山札から1人に5枚ずつ配り、互いに3回ずつ捨てる→山札から取るの方法で役を完成させます。 役はノーペア<ワンペア<ツーペア<スリーペア<ストレート<フラッシュ<フルハウス<フォーカード<ストレートフラッシュ<ロイヤルストレートフラッシュの計10種。 同役の時は2<3<4<・・・Q<Aで評価。 ジョーカーはワイルドカードとして使用可能(最高役を作るように適用される)。 以上の条件で、例えば手札に、 「スペード2、スペード2、スペードJ、スペードQ、ハートK」 というワンペアが完成している場合、 出来るだけ数字を高くし、高い役を狙いつつも、役の完成率も考慮し、 1.Jを変える 2.Qを変える 3.Kを変える 4.J、Qを変える 5.Q、Kを変える 6.J、Kを変える 7.J、Q、Kを全て変える という戦法をとるとします。 以上を勝率の高い順に並べるとどのような順になるでしょうか。

  • トランプで一番面白いのはナポレオンですよね?その魅力を語らせてくださいませ

    大富豪なんて、最初に勝つ人決ってます。運だけのゲームつまらないです。 ナポレオンは、手札の運が悪くても、連合軍として勝てますし、 ナポレオンになる駆け引きがありますから、ゲームレベルも丁度いい感じになりますし、 裏ジャックのような一枚の強いカードさえあれば、ゲームのキーマンになれますし、 強いカードには、よろめき、ジョーカー請求などの縛りついてますし、 切り札によって、手札の強さが変わりますし、 ふくかんの予想が面白いですし、 五人でなくても、遊べますし(麻雀は絶対四人ですよね) ルールに、裏切りや全部20枚あげると勝てる、があるところも戦術に幅が出て面白いですし、 運と実力の2つを必要とするゲームですから、ワイワイ遊べます。 これ以上面白いゲームを知りません。 何かありますか? 麻雀は放銃しなければ負けないみたいですが、役作るのは運が絶対に必要ですよね。 戦術のある運だけでないナポレオンには麻雀もかなわない気がします。(すいません。麻雀はルール知ってますが醍醐味は知りません) あと、ポーカーも駆け引きが手札が弱くてもできますから面白いですね

  • ポケモンカードが分かる方は教えて下さい

    かいの化石について ポケボディー アクアリアクション 自分の番に、手札から水エネルギーを出して、このポケモンにつけたとき、自分の山札から、このポケモンから進化する「進化カード」を1枚選び、このポケモンの上にのせ、進化させる。(略) 初手進化・出したターンの進化は禁止です。 このかいの化石に水エネルギーをつけたとき強制的に(ポケボディー・説明文から)進化させなければなりませんが、初手や出したターンの場合、ルールに反してしまいます。 この場合、進化してもいいのでしょうか?それとも、初手や出したターンにはかいの化石に水エネルギーをつけられないのでしょうか?

  • ポーカーハンドの最上位は?

    ポーカーのハンド(役)って Royal Straight Flush 同一スートで、10・J・Q・K・Aが揃っていること。 Five of a kind (Five cards) 同位札が4枚と、JOKERが揃っていること。 Straight Flush 同一スートで、連番になっていること。 Four of a kind(Four cards) 同位札4枚が揃っていること。残り1枚はなんでも良い。 Full House 同位札が3枚と、それとは別の同位札が2枚揃っていること。 Flush 数字に関係なく、同一スートであること。 Straight スートに関係なく、連番であること。 Three of the kind(Three cards) 同位札が3枚揃っていること。残り2枚はなんでも良い。 Two Pairs 同位札が2枚と、それとは別の同位札が2枚揃っていること。残り1枚はなんでも良い。 One Pair 同位札が2枚揃っていること。残り3枚は何でも良い。 No Pair(X High) 上記以外。X=手札内の最高カード の11種類ですよね。そのうちの「Royal Straight Flush」と「Five of a kind (Five cards)」ってどっちが最上位なんですか?本などを見ていると、ロイヤルが最上位だったり、ファイブが最上位だったりしてるんで。友達とポーカーをやるのにどっちが最上位かって議論になりました。ご存じの方がいらっしゃいましたら、回答お願いします。

  • ギャンブラーの幸運について考察してみます

    ギャンブラーの幸運について考察してみます さて、敗残者さん。 君たちはなぜ勝利が手元になく、常に降伏しなけらばならないか。 慈悲だけをなぜ望むか。 それを考えるヒントだよ。 私はね、霊感があって試しにタロットカードを使ったら、ちゃんと使いこなせたんだ。 いきさつを理解できるように説明するね。 遊戯王を日本在住で耳にしたこともない人は少ないだろう。 遊戯王は便乗コピーの方が主流になった実例なんだけど、トレーディングカードゲームというおもちゃを仲介して思考力を訓練する遊びがある。 私はおもちゃ屋でね、接客目的で自分でもカードゲームを遊んで接待でお客と対戦したよ。 勘と通常言われる直観能力について考察に手掛かりになる発見があった。 ポーカーとか麻雀で何かイカサマをしているに違いないと思わせるほどに圧倒的に強いギャンブラーの無名伝説は昔からあったね。 それを目の当たりにしたんだ。 トレーでイングカードは相手のさばく札で、山札に積んだデッキの傾向をつかんで、戦術を読んで対応するんだ。そのデッキが特に強いとは言えないし、おもちゃ屋が接待する相手は子供、強いはずはないのにやたら強い子供を見かけたんだ。 その勝負強さは要するに、山札から引くカードが強運の作用で助けている事だった。 ポーカーとかの強い人はいかさまなんてしていないよ。 ランダムで引いているカードが、望み通りの引きかたで勝利に案内していくんだ。 ルール構成上 人間のもたらす作用ではない。 実は私にもできた。 接客なんで、勝たせたい相手、負かしたい相手を選んだり、相手の勝ちたい意気込みを読んだりしたんだ。 その精神状態や集中状態で、どんなカードを山札から引いてくるか傾向をコントロールできた。 これはギャンブラーの才能を決めるようで、困ったのが対戦相手の引きのコントロールを妨害してくる対戦者だったな。第一印象で嫌なヤツに見えるからすぐわかる。 こういういきさつを踏まえて、仕事でカードゲームを研究する必要がなくなったから、思いついたのがタロットカーででなぜ当たる占いが出来るという世の中の噂話が広まっているかだ。 同じような仕組みで、引いてくるカードをコントロールできるギャンブラーの才能が有れば可能だとね。 で、個人的に試してみたらその通りだった。 カードゲームは、引いてきたカードに書かれたカードの効果を複数枚のカードで組み合わせることで勝利条件を満たしていくけど、タロットも絵だけ描かれてテキストとして効果が書かれていないけど読解力の発揮は似たようなもんだしね。 カードゲームは思考力の訓練が主体だが、本来直観の訓練の方が向いていないかと考えてみたのが、それに対する助言が質問の一つ。 それから、オカルト系に運気を自在にコントロールしたいという話が出てくるが、実現可能な根拠として、遊びで確認できたといえるので、それ系のうんちく話に詳しい方からの参考回答募集が質問の2つ目。 占いマニアさん歓迎が3つ目。 ギャンブラーは男ってキライ。 まあ好きなこと書いてくれ。

専門家に質問してみよう