1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Domemo(vb版) Lv1

Last updated at Posted at 2019-04-16

Domemo?

とあるボードゲーム。
社内勉強会で作成するプログラムの題材として選定。
Domemoの詳細はこちらを参照
domemo2.png

なぜDomemoを作る事にしたかといえば、
作って遊べるものを題材にした方がモチベーションが続きやすいから。

準備

まずはVisual Studio 2019をインストール!

色んなバージョンがありますが「Community 2019 のダウンロード」でよいです。
Community.JPG

「.Netデスクトップ開発」を選んでインストールしてください。
vb版.JPG
なお、必須ではないですが、F#を入れるのもおすすめです。
とても面白い言語です。

Visual Studioを起動したら、メニューの「ファイル」から新しいプロジェクトを作成。
vb2.JPG

Visual Basicを選びます。プロジェクト名はお好きなように。
vb3.JPG

エディタにソースコードを書きます。
vb4.JPG

VB.Netについてはここから!

以下で紹介する記事は全部読んだり、1回で理解する必要はないです。
必要に応じて参照してください。

VS2019を使ったチュートリアル
※VisualStudioの使い方わからない人は必読!!

VBリファレンス

VB.NET 文法メモ(文法かいつまみ)

MS公式Doc-トップページ

考え方

まずはゲームのルールを理解しましょう。
実際に遊んでみるのが一番!
実物を持ってると、実際に並べながら考えられるのでお勧めです。

どうやったらゲームができるのか、手順を考える

1: 1~7までのカードを用意する
2: カードをシャッフルする
3: 場にカードを4枚表にする
4: 4枚のカードを、内容を伏せたままゲームから除外する
5: カードを5枚ずつ4人のプレイヤーに配る
6: 各プレイヤーは自分には見えないようにカードを表にする
7: 各プレイヤーは(他のプレイヤーのカードを見ながら)自分が持っているカードを予想して、宣言する
8: 予想があっていたら、手札からカードを場に移動して表にする
9: 最初に手札がなくなったプレイヤーが勝ち

Domemoの詳しいルールについてはこちらを参照

シンプルにするための前提

1: プレイヤー人数を4人とする
2: Player1(自分)の手札は見えないようにする
3: とにかく動けばOK

今後のロードマップ

Lv1:まずは組んでみよう(now!)
Lv2:プレイヤーの処理を関数にまとめてみよう
Lv3:プレイヤー1を操作できるようにしよう
Lv4:CPUを強くしよう
Lv5:プレイヤーをクラス化してみよう

Lv1:全自動でゲームが進むようにする

まずは動けばOK!!
難しく考えずに、全自動でゲームが進むように作ってみましょう。

Module Module1

    ' Player2~4の手札を表示する
    Sub show(cards As List(Of Integer))
        For Each card In cards
            Console.Write(card)
        Next
        Console.WriteLine("")
    End Sub

    ' Player1の手札を伏せて表示する
    Sub showMask(cards As List(Of Integer))
        For Each card In cards
            Console.Write("X")
        Next
        Console.WriteLine("")
    End Sub

    Sub Main()
        ' 1: 1~7までのカードを用意する
        Dim cards As List(Of Integer) = New List(Of Integer)

        For i As Integer = 1 To 7
            For j As Integer = 1 To i
                cards.Add(i)
            Next
        Next

        ' 2: カードをシャッフルする
        Dim shuffledCards As List(Of Integer) = cards.OrderBy(Function(x) Guid.NewGuid()).ToList

        show(shuffledCards)

        ' 3: 場にカードを4枚表にする
        Dim openCards As List(Of Integer) = shuffledCards.GetRange(0, 4)

        ' 4: 4枚のカードを、内容を伏せたままゲームから除外する
        Dim closeCards As List(Of Integer) = shuffledCards.GetRange(4, 4)

        ' 5: カードを5枚ずつ4人のプレイヤーに配る
        Dim player1 As List(Of Integer) = shuffledCards.GetRange(8, 5)
        Dim player2 As List(Of Integer) = shuffledCards.GetRange(13, 5)
        Dim player3 As List(Of Integer) = shuffledCards.GetRange(18, 5)
        Dim player4 As List(Of Integer) = shuffledCards.GetRange(23, 5)

        Dim random As New Random()

        ' 6: 各プレイヤーは自分には見えないようにカードを表にする
        For i As Integer = 1 To 30
            Console.WriteLine("---------------------------------")
            ' 場のカードとプレイヤーの手札を表示する
            Console.Write("open->")
            show(openCards)
            Console.Write("Player1->")
            showMask(player1)
            Console.Write("Player2->")
            show(player2)
            Console.Write("Player3->")
            show(player3)
            Console.Write("Player4->")
            show(player4)

            ' 7: 各プレイヤーは自分が持っているカードを予想して、宣言する
            ' Player1
            Dim declaration As Integer = random.Next(7) + 1
            Console.WriteLine("p1 -> " & declaration)

            ' 8: 予想があっていたら、手札からカードを場に移動して表にする
            If player1.Remove(declaration) Then
                Console.WriteLine("jackPot!")
                openCards.Add(declaration)

                ' 9: 最初に手札がなくなったプレイヤーが勝ち
                If player1.Count = 0 Then
                    Console.WriteLine("player1 win!")
                    Exit For
                End If
            End If

            ' Player2
            declaration = random.Next(7) + 1
            Console.WriteLine("p2 -> " & declaration)
            If player2.Remove(declaration) Then
                Console.WriteLine("jackPot!")
                openCards.Add(declaration)
                If player2.Count = 0 Then
                    Console.WriteLine("player2 win!")
                    Exit For
                End If
            End If

            ' Player3
            declaration = random.Next(7) + 1
            Console.WriteLine("p3 -> " & declaration)
            If player3.Remove(declaration) Then
                Console.WriteLine("jackPot!")
                openCards.Add(declaration)
                If player3.Count = 0 Then
                    Console.WriteLine("player3 win!")
                    Exit For
                End If
            End If

            ' Player4
            declaration = random.Next(7) + 1
            Console.WriteLine("p4 -> " & declaration)
            If player4.Remove(declaration) Then
                Console.WriteLine("jackPot!")
                openCards.Add(declaration)
                If player4.Count = 0 Then
                    Console.WriteLine("player4 win!")
                    Exit For
                End If
            End If

            ' 何か入力したら次のターンにいくようにする
            Console.ReadKey()
        Next

        Console.ReadKey()
    End Sub

End Module

改良できる部分はまだまだたくさん。
また、これと違うプログラムを書いても、ルール通りに動けばOKです。
楽しみながら作ってみましょう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?