陣取りゲーム
上のようなExcelを使った参加型ゲームを考えてみました。
実際に動かしてみようと思う方は標準モジュールに以下のプログラムをコピペしてください。
VBAって使ったことが無いという方はこちらを参考にしてみてください。
http://www.officepro.jp/excelvba/ini/index1.html
http://www.officepro.jp/excelvba/ini/index2.html
手順は、
① 画面作成コード(MakeSheet)を実行して画面を作る
② できた画面に参加プレイヤーのデータを追加する
③ プログラムコード(GameStart)を実行してゲームスタート
プログラムコードを実行するときは、画面にスタートボタンをつけたり、ショートカットを登録するといいです。
画面作成コード
Sub MakeSheet() With Cells .RowHeight = 30 .ColumnWidth = 4.5 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With With Range("A1:J10") .Borders(xlEdgeLeft).Weight = xlThin .Borders(xlEdgeTop).Weight = xlThin .Borders(xlEdgeBottom).Weight = xlThin .Borders(xlEdgeRight).Weight = xlThin .Borders(xlInsideVertical).Weight = xlThin .Borders(xlInsideHorizontal).Weight = xlThin End With Columns("M:S").ColumnWidth = 8 Range("M1").Value = "名前" Range("N1").Value = "スタート" Range("O1").Value = "体力" Range("P1").Value = "攻撃力" Range("Q1").Value = "速さ" Range("R1").Value = "残体力" Range("S1").Value = "得点" End Sub
プログラムコード
Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private turn As Integer Private Type Player Color As Integer Name As String Range As Range Muki As String HP As Integer AP As Integer SP As Integer Point As Integer TP As Integer End Type Private Const MaxTurn As Integer = 1000 'ターン数 Private Const sleepTime As Integer = 50 '少なくすると処理が早くなります。 Private p(99) As Player Private pc As Integer 'プレイヤー数 Sub GameStart() Dim i As Integer Range("A1:J10").ClearContents Range("A1:J10").Interior.ColorIndex = xlNone pc = 0 While Cells(pc + 2, 13).Value <> "" p(pc).Color = pc + 3 Cells(pc + 2, 12).Value = "○" Cells(pc + 2, 12).Interior.ColorIndex = pc + 3 p(pc).Name = Cells(pc + 2, 13).Value Select Case pc Mod 4 Case 0 p(pc).Muki = "U" Case 1 p(pc).Muki = "R" Case 2 p(pc).Muki = "D" Case 3 p(pc).Muki = "L" End Select Set p(pc).Range = Range(Cells(pc + 2, 14).Value) p(pc).HP = Cells(pc + 2, 15).Value p(pc).AP = Cells(pc + 2, 16).Value p(pc).SP = Cells(pc + 2, 17).Value p(pc).Point = 1 p(pc).TP = 0 p(pc).Range.Value = "○" p(pc).Range.Interior.ColorIndex = p(pc).Color pc = pc + 1 Wend Call kousin turn = 1 While turn < MaxTurn For i = 0 To pc - 1 If p(i).HP <> 0 Then p(i).TP = p(i).TP + p(i).SP If p(i).TP > 1000 Then p(i).TP = p(i).TP - 1000 Call move(i) End If End If Next i DoEvents Wend MsgBox "終了" End Sub '行動決定 Sub move(i As Integer) Select Case turn Mod 7 Case 0 Select Case p(i).Muki Case "U" p(i).Muki = "R" Case "R" p(i).Muki = "D" Case "D" p(i).Muki = "L" Case "L" p(i).Muki = "U" End Select Case 1 Select Case p(i).Muki Case "U" p(i).Muki = "D" Case "R" p(i).Muki = "L" Case "D" p(i).Muki = "U" Case "L" p(i).Muki = "R" End Select Case 2 Select Case p(i).Muki Case "U" p(i).Muki = "L" Case "R" p(i).Muki = "U" Case "D" p(i).Muki = "R" Case "L" p(i).Muki = "D" End Select Case Else Call move2(i) End Select turn = turn + 1 Cells(1, 12).Value = turn If turn Mod 97 = 0 Or turn Mod 13 = 0 Then turn = turn + 1 End If Sleep (sleepTime) End Sub '前進 Sub move2(i As Integer) Select Case p(i).Muki Case "U" If p(i).Range.Row > 1 Then If p(i).Range.Offset(-1, 0).Value = "○" Then Call atack(i, p(i).Range.Offset(-1, 0).Interior.ColorIndex - 3) Else p(i).Range.Value = "" Set p(i).Range = p(i).Range.Offset(-1, 0) End If End If Case "R" If p(i).Range.Column < 10 Then If p(i).Range.Offset(0, 1).Value = "○" Then Call atack(i, p(i).Range.Offset(0, 1).Interior.ColorIndex - 3) Else p(i).Range.Value = "" Set p(i).Range = p(i).Range.Offset(0, 1) End If End If Case "D" If p(i).Range.Row < 10 Then If p(i).Range.Offset(1, 0).Value = "○" Then Call atack(i, p(i).Range.Offset(1, 0).Interior.ColorIndex - 3) Else p(i).Range.Value = "" Set p(i).Range = p(i).Range.Offset(1, 0) End If End If Case "L" If p(i).Range.Column > 1 Then If p(i).Range.Offset(0, -1).Value = "○" Then Call atack(i, p(i).Range.Offset(0, -1).Interior.ColorIndex - 3) Else p(i).Range.Value = "" Set p(i).Range = p(i).Range.Offset(0, -1) End If End If End Select p(i).Range.Value = "○" p(i).Range.Interior.ColorIndex = p(i).Color Call kousin End Sub '攻撃 Sub atack(i As Integer, j As Integer) p(j).HP = p(j).HP - p(i).AP If p(j).HP <= 0 Then MsgBox p(j).Name & "は" & p(i).Name & "に倒された" p(j).HP = 0 p(j).Range.Value = "" End If End Sub '得点更新 Sub kousin() Dim i As Integer Dim j As Integer Dim k As Integer Dim count As Integer For i = 1 To pc count = 0 For j = 1 To 10 For k = 1 To 10 If Cells(j, k).Interior.ColorIndex = p(i - 1).Color Then count = count + 1 End If Next k Next j Cells(i + 1, 19).Value = count Cells(i + 1, 18).Value = p(i - 1).HP Next i End Sub
参加者データ
名前 | スタート | 体力 | 攻撃力 | 速さ |
---|---|---|---|---|
totsuan | B8 | 31 | 40 | 29 |
type9 | C8 | 30 | 5 | 65 |
noir_k | B7 | 50 | 20 | 30 |
s-n-k | C9 | 60 | 15 | 25 |
Zelda | I9 | 40 | 25 | 35 |
Mook | G6 | 1 | 0 | 99 |
taknt | J10 | 30 | 40 | 30 |
nakata-ryo | H4 | 60 | 10 | 30 |
kumaimizuki | A10 | 80 | 8 | 12 |
FLOW_GAMA | A1 | 25 | 50 | 25 |