スーパー暇人プログラマー の Take です。
半年ぶり?ぐらいに Excel でゲームをつくりました。
それは、、、
小学校とかで友人とよくやった「あの〇と×を書くだけの究極の頭脳戦」である「まるばつゲーム」です!!!!
この記事をご覧の方の中には、懐かしすぎて涙が止まらない人もたくさんいるのではないでしょうか?
この記事では、「あの〇と×を書くだけの究極の頭脳戦」である「まるばつゲーム」の遊び方と作成方法をご紹介します!!
※ もし「まるばつゲーム」が好きすぎて仕方ない人は、ぜひ下記ボタンからダウンロードしてやってみてください!
遊び方
まず「ゲーム開始」ボタンを押下します。
その後、下記画面の赤枠にクリックすると、自動で「〇」か「×」が入力されます。
※ 先行は「〇」後攻は「×」が入力されます。
あとは、同じ記号(「〇」か「×」)が三つそろえば勝ちという
シンプル中のシンプルなまるばつゲームするだけです。
勝敗が付いた時点でゲームが終了し、メッセージが表示されます。
※ 中断したい場合は「ゲーム終了」を押下してください。
「まるばつゲーム」の作り方
ここからプログラムの専門用語がでてきますので、よくわからない人も適当に眺めてください。
まず、Excel Vba という、Excel のプログラミング言語で作成します。
定数定義
シート情報、まるばつゲームのボード情報、その他メッセージ等をここで一括に登録しちゃいます。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
' 定数定義 ' シート名 Public Const MARUBATSU_SHEET As String = "marubatsu" 'メッセージの表示位置 Public Const X_MESSAGE As Integer = 14 Public Const Y_MESSAGE As Integer = 3 ' ボードのセル番号 Public Const BOARD_X As Integer = 8 Public Const BOARD_Y As Integer = 4 Public Const BOARD_MAX As Integer = 2 ' その他定数 Public Const MARU As String = "〇" Public Const BATSU As String = "×" Public Const START_MESSAGE As String = "ゲーム開始" Public Const END_MESSAGE As String = "ゲーム終了" Public Const WIN_MESSAGE As String = "の勝ち!!!" Public Const DRAWN_MESSAGE As String = "引き分け!!!" |
ボタンが押されたときに処理するマクロ
Excel 上のシートにある「ゲーム開始」「ゲーム終了」ボタンが押されたときに処理するマクロの定義です。
ボタンごとにそれぞれ下記のように動作します。
- 「ゲーム開始」 : startGame プロシージャ
→ シートの初期化 + N列目に「ゲーム開始」メッセージ追加 - 「ゲーム終了」 : endGame プロシージャ
→ N列目に「ゲーム終了」メッセージ追加
また、上記画面の「ゲーム開始」というメッセージの下に「0」という文字がありますが、
これは盤上の「〇と×」の数を示します。
※ 上記画面では、「〇と×」が「0」個のため、「0」と表示されています。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
'まるばつゲーム 開始 Sub startGame() Call defaultSet setMsg (START_MESSAGE) End Sub 'まるばつゲーム 終了 Sub endGame() setMsg (END_MESSAGE) End Sub ' 初期設定 Private Sub defaultSet() Range(Cells(BOARD_Y, BOARD_X), Cells(BOARD_Y + 2, BOARD_X + 2)).ClearContents End Sub ' メッセージの設定 Private Sub setMsg(Msg As String) Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE, X_MESSAGE).Value = Msg Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE + 1, X_MESSAGE).Value = 0 End Sub |
マウスクリック等のシートの操作
下記ソースコードで、ごちゃごちゃ書いていますが、処理はシンプルです。
- 選択したセルに「〇」か「×」を置く。
→ クリック数が偶数なら「〇」、奇数なら「×」とする - 勝敗が付いたかを確認
→ 同じ記号(つまり「〇」か「×」)が縦、横、斜めに並んでいるか
→ 3つ並んでいるか、勝敗が付かない(盤上すべてに記号が配置された)なら処理終了
※ もしシート上のクリックをどうやって検知しているかわからない人は下記リンクをどうぞ!
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
' シートの操作部分 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim NowCell Set NowCell = ActiveCell Dim Msg As String: Msg = Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE, X_MESSAGE).Value If Msg = START_MESSAGE _ And BOARD_Y <= NowCell.Row _ And NowCell.Row <= BOARD_Y + BOARD_MAX _ And BOARD_X <= NowCell.Column _ And NowCell.Column <= BOARD_X + BOARD_MAX _ Then With Worksheets(MARUBATSU_SHEET).Cells(NowCell.Row, NowCell.Column) If getCount Mod 2 = 0 Then .Value = MARU Else .Value = BATSU End If End With ' 〇×の数をカウント Call plusCount ' 勝敗チェック If checkGame(getCount) = True Then Dim Winner If getCount Mod 2 = 1 Then Winner = MARU Else Winner = BATSU End If MsgBox Winner & WIN_MESSAGE Call endGame End If If getCount = 9 And checkGame(getCount) = False Then MsgBox DRAWN_MESSAGE End If End If End Sub ' カウント設定 Private Sub plusCount() Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE + 1, X_MESSAGE).Value _ = Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE + 1, X_MESSAGE).Value + 1 End Sub ' カウントを取得 Function getCount() As String getCount = Worksheets(MARUBATSU_SHEET).Cells(Y_MESSAGE + 1, X_MESSAGE).Value End Function ' 値を取得 Function getValue(ByRef X, ByRef Y) As String getValue = Worksheets(MARUBATSU_SHEET).Cells(Y, X).Value End Function ' 勝敗チェック Function checkGame(num As String) As Boolean checkGame = False For Y = BOARD_Y To BOARD_Y + BOARD_MAX For X = BOARD_X To BOARD_X + BOARD_MAX If getValue(X, Y) = MARU _ Or getValue(X, Y) = BATSU _ Then Dim firstValue: firstValue = getValue(X, Y) If isSameValue(firstValue, X, X, Y + 1, Y + BOARD_MAX) = True _ Or isSameValue(firstValue, X + 1, X + BOARD_MAX, Y, Y) = True _ Or isSameValue(firstValue, X + 1, X + BOARD_MAX, Y + 1, Y + BOARD_MAX) = True _ Or isSameValue(firstValue, X - 1, X - BOARD_MAX, Y + 1, Y + BOARD_MAX) = True _ Then checkGame = True Exit For End If End If Next X If checkGame = True Then Exit For End If Next Y End Function ' 指定の座標が同じ値か確認 Function isSameValue(ByRef Value, ByRef X1, _ ByRef X2, ByRef Y1, ByRef Y2) As Boolean If getValue(X1, Y1) = Value And getValue(X2, Y2) = Value _ Then isSameValue = True End If End Function |
最後に
いかがでしょうか?
私はこの「まるばつゲーム」をつくるのに一時間くらいかかりました。
たぶん、できる人はもっと早くできると思います。
もし「〇と×の究極の頭脳戦」である「まるばつゲーム」を Excel でやりたくて仕方ない方がいましたら、
ぜひ下記ボタンからダウンロードしてやってみてください!