Domemo?
とあるボードゲーム。
社内勉強会で作成するプログラムの題材として選定。
Domemoの詳細はこちらを参照
なぜDomemoを作る事にしたかといえば、
作って遊べるものを題材にした方がモチベーションが続きやすいから。
準備
まずはVisual Studio 2019をインストール!
色んなバージョンがありますが「Community 2019 のダウンロード」でよいです。
「.Netデスクトップ開発」を選んでインストールしてください。
なお、必須ではないですが、F#を入れるのもおすすめです。
とても面白い言語です。
Visual Studioを起動したら、メニューの「ファイル」から新しいプロジェクトを作成。
Visual Basicを選びます。プロジェクト名はお好きなように。
VB.Netについてはここから!
以下で紹介する記事は全部読んだり、1回で理解する必要はないです。
必要に応じて参照してください。
VS2019を使ったチュートリアル
※VisualStudioの使い方わからない人は必読!!
考え方
まずはゲームのルールを理解しましょう。
実際に遊んでみるのが一番!
実物を持ってると、実際に並べながら考えられるのでお勧めです。
どうやったらゲームができるのか、手順を考える
1: 1~7までのカードを用意する
2: カードをシャッフルする
3: 場にカードを4枚表にする
4: 4枚のカードを、内容を伏せたままゲームから除外する
5: カードを5枚ずつ4人のプレイヤーに配る
6: 各プレイヤーは自分には見えないようにカードを表にする
7: 各プレイヤーは(他のプレイヤーのカードを見ながら)自分が持っているカードを予想して、宣言する
8: 予想があっていたら、手札からカードを場に移動して表にする
9: 最初に手札がなくなったプレイヤーが勝ち
シンプルにするための前提
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です。
楽しみながら作ってみましょう!