マラソンゲーム
Excelを使った参加型ゲームの第2弾です。
実際に動かしてみようと思う方は標準モジュールに以下のプログラムをコピペしてください。
VBAって使ったことが無いという方はこちらを参考にしてみてください。
http://www.officepro.jp/excelvba/ini/index1.html
http://www.officepro.jp/excelvba/ini/index2.html
手順は、
① 画面作成コード(MakeSheet)を実行して画面を作る
② できた画面にプレイヤーデータを追加する
サンプルプレイヤーデータを表ごと選択してコピーし、Excelの名前の下に形式を選択して貼り付けからテキストを選んで貼り付けると簡単です。
③ プログラムコード(GameStart)を実行してゲームスタート
プログラムコードを実行するときは、画面にスタートボタンをつけたり、ショートカットを登録するといいです。
画面作成コード
Sub MakeSheet() With ActiveSheet.Cells .RowHeight = 22.5 .ColumnWidth = 3.13 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With With ActiveSheet.Range("A1:O20") .Interior.ColorIndex = 2 .Borders(xlEdgeLeft).Weight = xlThin .Borders(xlEdgeTop).Weight = xlThin .Borders(xlEdgeBottom).Weight = xlThin .Borders(xlEdgeRight).Weight = xlThin End With With ActiveSheet.Range("F6:J15") .Interior.ColorIndex = 35 .Font.ColorIndex = 46 .Borders(xlEdgeLeft).Weight = xlThin .Borders(xlEdgeTop).Weight = xlThin .Borders(xlEdgeBottom).Weight = xlThin .Borders(xlEdgeRight).Weight = xlThin End With With ActiveSheet.Range("A10:E10") .Borders(xlEdgeBottom).Weight = xlThin .Borders(xlEdgeBottom).ColorIndex = 3 End With With ActiveSheet .Range("A1:Q21").Font.Size = 20 .Columns("R:U").ColumnWidth = 6.88 .Columns("V:Z").ColumnWidth = 4.6 .Range("R1").Value = "名前" .Range("S1").Value = "スピード" .Range("T1").Value = "コーナー" .Range("U1").Value = "スタミナ" .Range("V1").Value = "1周目" .Range("W1").Value = "2周目" .Range("X1").Value = "3週目" .Range("Y1").Value = "4週目" .Range("Z1").Value = "順位" End With End Sub
サンプルプレイヤーデータ
名前 | スピード | コーナー | スタミナ |
---|---|---|---|
高橋 | 70 | 21 | 9 |
野口 | 30 | 28 | 42 |
浅利 | 16 | 35 | 49 |
増田 | 33 | 33 | 34 |
谷川 | 14 | 26 | 60 |
プログラムコード
Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Type Player Color As Integer Name As String Range As Range Muki As Integer EP As Integer SP As Integer TP As Integer RP As Integer ST As Integer End Type Private Const sleepTime As Long = 300 '少なくすると処理が早くなります。 Private p() As Player Private pc As Integer 'プレイヤー数 Private turn As Long Private jyuni1 As Integer Private jyuni2 As Integer Private jyuni3 As Integer Private jyuni4 As Integer Private jyuni5 As Integer Sub GameStart() '作業用 Dim i As Integer Dim j As Integer Dim f As Boolean '初期化 Range("A1:O20").Font.ColorIndex = 2 Range("F6:J15").Font.ColorIndex = 50 Range("V2:Z22").ClearContents Dim p(20) As Player jyuni1 = 1 jyuni2 = 1 jyuni3 = 1 jyuni4 = 1 jyuni5 = 1 pc = 0 i = 5 j = 10 While Cells(pc + 2, 18).Value <> "" p(pc).Color = pc + 3 Cells(pc + 2, 17).Font.ColorIndex = pc + 3 Cells(pc + 2, 17).Value = "●" p(pc).Name = Cells(pc + 2, 18).Value Set p(pc).Range = Cells(j, i) If i > 1 Then i = i - 1 Else j = j - 1 i = 5 End If p(pc).Muki = 1 p(pc).EP = Cells(pc + 2, 19).Value p(pc).SP = Cells(pc + 2, 20).Value p(pc).ST = Cells(pc + 2, 21).Value p(pc).RP = 0 p(pc).Range.Font.ColorIndex = p(pc).Color p(pc).Range.Value = "●" pc = pc + 1 Wend MsgBox "スタート" turn = 1 f = True While f f = False For i = 0 To pc - 1 If p(i).RP < 6 Then p(i).TP = p(i).TP + p(i).EP + 350 + Int(Rnd(-turn) * 100) If p(i).TP > 500 Then p(i).TP = p(i).TP - 500 Call move1(p(i)) Debug.Print p(i).Muki End If f = True End If Next i DoEvents Sleep sleepTime Wend MsgBox "終了" End Sub Sub move1(p As Player) Dim r1 As Range Dim r2 As Range Dim r3 As Range turn = turn + 1 Select Case p.Muki Case 1 Set r1 = p.Range.Offset(1, 0) If p.Range.Column < 5 Then Set r2 = p.Range.Offset(1, 1) Else Set r2 = Nothing End If If p.Range.Column > 1 Then Set r3 = p.Range.Offset(1, -1) Else Set r3 = Nothing End If If p.Range.Row >= 15 Then If p.Range.Row = 19 Then p.Muki = 2 Else If Rnd(-turn) * 200 < p.SP + 100 Then p.Muki = 2 End If End If End If Case 2 Set r1 = p.Range.Offset(0, 1) If p.Range.Row > 16 Then Set r2 = p.Range.Offset(-1, 1) Else Set r2 = Nothing End If If p.Range.Row < 20 Then Set r3 = p.Range.Offset(1, 1) Else Set r3 = Nothing End If If p.Range.Column >= 10 Then If p.Range.Column = 14 Then p.Muki = 3 Else If Rnd(-turn) * 200 < p.SP + 100 Then p.Muki = 3 End If End If End If Case 3 Set r1 = p.Range.Offset(-1, 0) If p.Range.Column > 11 Then Set r2 = p.Range.Offset(-1, -1) Else Set r2 = Nothing End If If p.Range.Column < 15 Then Set r3 = p.Range.Offset(-1, 1) Else Set r3 = Nothing End If If p.Range.Row <= 6 Then If p.Range.Row = 2 Then p.Muki = 4 Else If Rnd(-turn) * 200 < p.SP + 100 Then p.Muki = 4 End If End If End If Case 4 Set r1 = p.Range.Offset(0, -1) If p.Range.Row < 5 Then Set r2 = p.Range.Offset(1, -1) Else Set r2 = Nothing End If If p.Range.Row > 1 Then Set r3 = p.Range.Offset(-1, -1) Else Set r3 = Nothing End If If p.Range.Column <= 6 Then If p.Range.Column = 2 Then p.Muki = 1 Else If Rnd(-turn) * 200 < p.SP + 100 Then p.Muki = 1 End If End If End If End Select If r1.Font.ColorIndex = 2 Then p.Range.Font.ColorIndex = 2 p.Range.Value = "" Set p.Range = r1 Call GoleCheck(p) Else If Not r2 Is Nothing Then If r2.Font.ColorIndex = 2 Then p.Range.Font.ColorIndex = 2 p.Range.Value = "" Set p.Range = r2 Call GoleCheck(p) End If Else If Not r3 Is Nothing Then If r3.Font.ColorIndex = 2 Then p.Range.Font.ColorIndex = 2 p.Range.Value = "" Set p.Range = r3 Call GoleCheck(p) End If End If End If End If End Sub 'ゴールしたかどうか Sub GoleCheck(p As Player) If p.Muki = 1 And p.Range.Row = 11 Then p.RP = p.RP + 1 Select Case p.RP Case 1 p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" Case 2 Cells(p.Color - 1, 22).Value = jyuni1 & "位" jyuni1 = jyuni1 + 1 p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" p.EP = p.EP - (100 - p.ST) / 2 Case 3 Cells(p.Color - 1, 23).Value = jyuni2 & "位" jyuni2 = jyuni2 + 1 p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" p.EP = p.EP - (100 - p.ST) / 2 Case 4 Cells(p.Color - 1, 24).Value = jyuni3 & "位" jyuni3 = jyuni3 + 1 p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" p.EP = p.EP - (100 - p.ST) / 2 Case 5 Cells(p.Color - 1, 25).Value = jyuni4 & "位" jyuni4 = jyuni4 + 1 p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" p.EP = p.EP - (100 - p.ST) / 2 Case 6 Cells(p.Color - 1, 26).Value = jyuni5 & "位" jyuni5 = jyuni5 + 1 End Select Else p.Range.Font.ColorIndex = p.Color p.Range.Value = "●" End If End Sub