VBScriptさんま屋.

VBScriptの個人的なメモです (´・ω・`)

クラスを自作する

概要

クラスの使用例。勇者vs.魔王。
どちらかが倒れるまで戦闘が続きます。

クラスの使用例

'クラス宣言
Class C_Player
  'ここでは変数宣言にDimは使えない

  'パブリックなメンバを宣言(プロパティ)
  '(クラスの外部からアクセス可能)
  Public Name '名前

  'プライベートなメンバを宣言
  '(クラスの外部からアクセス不可能)
  Private m_life     'ライフ
  Private m_max      'ライフ最大値
  Private m_strength '攻撃力
  Private m_enemy    '敵オブジェクト

  'Strengthプロパティへ値の代入を可能にする
  '(クラスの外部から代入可能)
  Public Property Let Strength(val)
    m_strength = val
    m_life = Int(100000 / val)
    m_max = m_life
  End Property

  'Strengthプロパティの値を取得可能にする
  '(クラスの外部から取得可能)
  Public Property Get Strength()
    Strength = m_strength
  End Property

  'Enemyプロパティへオブジェクトの代入を可能にする
  '(クラスの外部から代入可能)
  Public Property Set Enemy(obj)
    Set m_enemy = obj
  End Property

  Private Sub Class_Initialize()
    'インスタンス作成時に行いたい処理を記載   
  End Sub

  Private Sub Class_Terminate()
    'インスタンス破棄時に行いたい処理を記載
  End Sub

  'パブリックなSubプロシージャ(メソッド)
  '(クラスの外部からアクセス可能)
  Public Sub Atack()
    'プロシージャ内ならDimを使える
    Dim buf
    buf = Int(m_strength * Rnd())
    Msgbox Name & "の攻撃!"
    m_enemy.Damage(buf)
  End Sub

  'パブリックなFunctionプロシージャ(メソッド)
  '(クラスの外部からアクセス可能)
  Public Function Damage(val)
    m_life = m_life - val
    If m_life < 0 Then m_life = 0
    Msgbox Name & "は" & val & "のダメージを受けた" _
      & vbCr & "(´・ω・) " & m_life & "/" & m_max
    If HasDead Then
      Msgbox Name & "は倒れた!" & vbCr & "( -ω-) スヤァ"
    Else
      Call Atack()
    End If
  End Function

  'プライベートなFunctionプロシージャ
  '(クラスの外部からアクセス不可能)
  Private Function HasDead()
    If m_life > 0 Then
      HasDead = False
    Else
      HasDead = True
    End If
  End Function

End Class


'変数宣言
Dim P1
Dim P2

'インスタンスを作成
Set P1 = New C_Player
Set P2 = New C_Player

'プロパティに値を代入
P1.Name = "勇者"
P1.Strength = 100  '攻撃力100、HP1000
P2.Name = "魔王"
P2.Strength = 1000 '攻撃力1000、HP100

'プロパティにオブジェクトを代入
Set P1.Enemy = P2
Set P2.Enemy = P1

'乱数ジェネレータを初期化
Call Randomize()

'戦闘開始
Call P1.Atack()

'インスタンスを破棄
Set P1 = Nothing
Set P2 = Nothing

P1(勇者)のAtackメソッドで戦闘を開始。

Atackメソッド内でP2(魔王)のDamageメソッドを呼び出す。
Damageメソッド内でP2(魔王)のAtackメソッドを呼び出す。
Atackメソッド内でP1(勇者)のDamageメソッドを呼び出す。
Damageメソッド内でP1(勇者)のAtackメソッドを呼び出す。
以上の繰り返し。

どちらかのHPが0になれば終了します。

デモを実行する(JavaScript)

同様のプログラムをJavaScriptで作ってみました。

コードはこんなです。

class Player{
  constructor(name, strength){
    this.name = name;
    this.strength = strength;
    this.lifeMax = 100000/strength;
    this.life = this.lifeMax;
  }

  damage(val){
    this.life = this.life - val;
    if (this.life < 0) {
      this.life = 0;
    }
    alert(this.name + 'は' + val + 'のダメージを受けた\n(´・ω・) '
     + this.life + '/' + this.lifeMax);
    if (this.life == 0) {
      alert(this.name + 'は倒れた!\n( -ω-) スヤァ');
    } else {
      this.atack();
    }
  }

  atack(){
    alert(this.name + 'の攻撃!')
    this.enemy.damage(Math.floor(Math.random() * this.strength));
  }

  get enemy(){
    return this._enemy;
  }

  set enemy(obj){
    this._enemy = obj;
  }
}

function maou() {  
  let p1 = new Player ('勇者', 100);
  let p2 = new Player ('魔王', 1000);
  p1.enemy = p2;
  p2.enemy = p1;
  p1.atack();
}

ボタンをクリックしてmaou()を呼び出します。

<input type="button" value="ここをクリック!" onclick="maou();">