ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.94 [ タイピングゲーム9:正打数の表示 ]

■拡張してみる

前回の講座では、タイピングゲームの雛形が完成しました。

一応、普通にタイピングゲームとして遊ぶことができるようになったはずです。今回からは、前回までのタイピングゲームを拡張して、完成度を高めていきましょう。様々な工夫をすることによって、ゲームはどんどん面白くなります。

今回拡張する機能は、次のようなものにします。

・正しくタイプした数を表示
・間違ったタイプ数も表示
・正しくタイプできた比率を表示

このみっつを実装してみましょう。

ちょっとしたことなのですが、正しくタイピングできた比率を表示すると、なんか一生懸命になってしまったりします。間違っていることが明確に表示されるので、なんとなく気になって正しくタイプしようとしてしまうのですね。こういった何気ないことの積み重ねによって、面白いゲームができるのです。


■コントロールの追加

さて、まずは各種表示を行うための、ラベルコントロールを追加します。

531.gif
ここでポイントとなるのは、コントロールの名前をしっかりと変更しておくことです。
『正打数』などの、単なる言葉を表示しているコントロールは、ゲームのプログラムが動作している間に内容を変更しません。ですから、言い方は悪いですが、名前は何でもいいわけです。
ただし、数字が表示されているほうのラベルは、ゲームの処理中に常に内容を書き換えなくてはいけません。名前をしっかりとわかりやすく定義しておくことで、コードの記述がしやすくなります。適当な名前をつけるのではなく、自分がイメージしやすい名前をつけるようにしましょう。

ちなみに、今回のサンプルでは、文字の大きさ、太さ、フォントなどを変更して、見やすくしています。


■変数などを追加する

さて、これらの処理を実現するために、コードも修正していきます。

まずは変数です。追加する変数は、みっつ。正打数(正しくタイプした数)、誤打数(間違ってタイプした数)、正打率(正しくタイプした比率)、これらの情報を保持するために変数を使います。

Public True_Type As Long '正しくタイプした数
Public Bad_Type As Long '間違ってタイプした数
Public True_Ratio As Long '正しくタイプした比率


この変数を、標準モジュールの宣言セクションに追加しておきましょう。
さて、変数は追加しただけではいけません。キチンとゲームの初期化にも組み込んでおきます。

今回のタイピングゲームでは、ゲームの初期化を行う関数が準備してありましたね。この初期化の関数のなかで、しっかりと追加した変数が初期化されるようにしておきます。同じような理由から、ユーザーフォーム上に設置したラベルのキャプションプロパティも、同時に初期化しています。

True_Type = 0
Bad_Type = 0
True_Ratio = 0
With UserForm1 'フォーム上ラベルの初期化
    .Lab_seida.Caption = 0
    .Lab_goda.Caption = 0
    .Lab_seidaritu.Caption = 0 & "%"
End With

これで、下準備は完了です。


■処理を修正する

最後に実際のゲーム中の処理を修正します。

考え方としては、正しくタイプできたときと、間違ったタイプをしたとき、それぞれのときに変数をプラス 1 して、カウントしていきます。

正打率を求める際には、全てのタイプ数の合計値で、正しくタイプした数を割って、100倍すればいいですね。これは普通に比率を求める算数をすればいいだけです。

修正した箇所は、コードの色を変えています。これを参考にして、前回のコードから修正をしてみてください。

'フォームモジュールのコード

Option Explicit

Private Sub UserForm_Initialize()
    
    Lab_mondai.Caption = "PRESS ENTER"
    Lab_seikai.Caption = "PRESS ENTER"
    
End Sub

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                             ByVal Shift As Integer)

    Dim Clear_Flag As Boolean
    
    Clear_Flag = False
    
    If Not Game_Flag Then
        If KeyCode = vbKeyReturn Then
            Lab_seikai.Caption = ""
            Game_Init
            Lab_mondai.Caption = "READY?"
            DoEvents
            Sleep 2000
            Lab_mondai.Caption = "GO!"
            DoEvents
            Sleep 2000
            Game_Flag = True
            Game_Time = GetTickCount
        End If
    Else
        If Not Clear_Flag Then
            If Str_Comparison(Problem(Problem_Number), _
                              Problem_Str_Count, _
                              Chr(KeyCode)) Then
                True_Type = True_Type + 1
                Lab_seida.Caption = True_Type

                Problem_Str_Count = Problem_Str_Count + 1
                If Len(Problem(Problem_Number)) < Problem_Str_Count Then
                    Problem_Number = Problem_Number + 1
                    Problem_Str_Count = 1
                    If Problem_Count < Problem_Number Then
                        Clear_Flag = True
                    End If
                End If
            Else
                Bad_Type = Bad_Type + 1
                Lab_goda.Caption = Bad_Type

            End If
            True_Ratio = Int(True_Type / (True_Type + Bad_Type) * 100)
            Lab_seidaritu = True_Ratio & "%"
        End If

    End If
    
    If Clear_Flag Then
        Game_Time = (GetTickCount - Game_Time) / 1000
        Lab_mondai.Caption = "!! Clear !!"
        Lab_seikai.Caption = "!! Clear !!"
        DoEvents
        Sleep 2000
        Lab_mondai.Caption = "Time:" & Game_Time & " Second"
        Lab_seikai.Caption = "Time:" & Game_Time & " Second"
        DoEvents
        Sleep 3000
        Lab_mondai.Caption = "PRESS ENTER"
        Lab_seikai.Caption = "PRESS ENTER"
        DoEvents
        Game_Flag = False
    Else
        Lab_mondai.Caption = Problem(Problem_Number)
        Lab_seikai.Caption = Left(Problem(Problem_Number), Problem_Str_Count - 1)
    End If
    
    DoEvents
    
End Sub

'標準モジュールのコード

Option Explicit

Declare Function GetTickCount Lib "kernel32" () As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwmilliseconds As Long)

Public Problem() As String
Public Problem_Count As Long
Public Problem_Number As Long
Public Problem_Str_Count As Long
Public Game_Flag As Boolean
Public Game_Time As Long

Public True_Type As Long
Public Bad_Type As Long
Public True_Ratio As Long


Sub Game_Init()

    Dim L As Long
    
    Problem_Count = 10
    ReDim Problem(1 To Problem_Count)
    Problem_Number = 1
    Problem_Str_Count = 1
    Game_Flag = False
    
    True_Type = 0
    Bad_Type = 0
    True_Ratio = 0
    With UserForm1
        .Lab_seida.Caption = 0
        .Lab_goda.Caption = 0
        .Lab_seidaritu.Caption = 0 & "%"
    End With

    
    Problem_Sort
    
    For L = 1 To Problem_Count
        Problem(L) = Cells(L, 1).Value
    Next

End Sub

Function Str_Comparison(mStr As String, _
                        Number As Long, _
                        kStr As String) As Boolean

    Dim S As String
    
    S = Mid(mStr, Number, 1)
    
    S = StrConv(S, vbUpperCase)
    
    Str_Comparison = S Like kStr
        
End Function

Sub Problem_Sort()

    Dim L As Long
    Dim LastCell As Long
    
    Randomize
    
    LastCell = Cells(65536, 1).End(xlUp).Row
    
    For L = 1 To LastCell
        Cells(L, 2).Value = Rnd
    Next
    
    Range(Columns(1), Columns(2)).Sort key1:=Cells(1, 2), _
                                       order1:=xlAscending
    
End Sub


これで、タイピングをしながら、リアルタイムに正打数などが表示されるようになります。

やってみるとわかりますが、思わずミスをしないように、一生懸命になってしまうと思います。始めにも書きましたが、こういった小さなことの積み重ねが、面白いゲームを作っていきます。さりげないことですが、結構大きな意味があるのですね。

532.gif

今回も、別館にサンプルをアップしておきます。実際に動かしてみたいという方は、まずそちらをやってみてください。前回との違いがわかると思います。


サンプルダウンロード ⇒ コチラよりダウンロードできます。(別館)



■格言

ゲームの面白さは小さなことの積み重ねによって生まれる
変数を追加したら初期化を忘れずに


次回はいよいよタイピングゲーム最終回です。


関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。