ミニゲーム:ブラックジャック in VXA



普通のブラックジャックDeath。
一人遊びようなのでつまらないことこの上なかったりします。

SceneManager.call(Scene_BlackJack)
にてゲーム開始。

ミニゲーム用共通処理モジュール in VXAが必要です。

ゲーム内部で使用する画像は
Graphics/Pictures
にインポートしてください。

変更点
2012:11:10
・掛け金を設定し、ゲームを 開始、1枚カードを引いた後にキャンセルをすると、次に決定ボタンを押した際
 強制終了するバグを修正
・賭け金を設定してゲームを開始した際にボトムキーヘルプが変わらないバグを修正

2013:06:16
・所持金ベット方式と変数ベット方式を選択可能に

2013:10:06
・賭け金が所持金を上回っていてもゲーム開始できるバグを修正

#==============================================================================
# ミニゲーム:ブラックジャック Plus in VX Ace By 貪藻矢射妥←
#------------------------------------------------------------------------------
# 普通のブラックジャックDeath。
# 一人遊びようなのでつまらないことこの上なかったりします。
# 
# SceneManager.call(Scene_BlackJack)
# にてゲームを開始できます。
# 
# 外部カスタマイズポイントについて
# シーンをブラックジャック Plusに移す前に以下を設定することでオリジナルなルール
# でゲームを実行可能です
# 
# EX)
# $game_system.bj_setting = [14, "ブラッククィーン"]
#  →Aが取り得るもう一つの数値, ゲームの名称
# 
# ※ちなみに、普通のカスタマイズポイントにしてないのは、数種類のブラックジャック
#  を設定したい際にスクリプトをコピペして使用しなくてもいいようにとの配慮です。
#==============================================================================
# 変更履歴
# 2012:11:10
# 掛け金を設定し、ゲームを 開始、1枚カードを引いた後にキャンセルをすると、
# 次に決定ボタンを押した際強制終了するバグを修正
# 賭け金を設定してゲームを開始した際にボトムキーヘルプが変わらないバグを修正
#
# 2013:06:16
# ・所持金ベット方式と変数ベット方式を選択可能に
# 
# 2013:10:06
# ・賭け金が所持金を上回っていてもゲーム開始できるバグを修正

module BlackJack
  include BM
  # トランプの図柄セット
  CARD_ROOT="tr_set"
  # トランプ一枚のサイズ
  TR_WIDTH  = 72
  TR_HEIGHT = 100
  # トランプ一枚の描画倍率
  TR_DRAW_RATE = 0.8
  # ベット方式
  BJ_BET_TYPE = MINI_GAME::MG_BET_TYPE_COIN
  #--------------------------------------------------------------------------
  # トランプセッティング
  #--------------------------------------------------------------------------
  def set_tranp
    $card = [[], [], [], []]
    for i in 0...4
      for j in 0...15
        # 0の場合、カードの裏を設定(未使用)
        if j == 0
          $card[i][j] = Rect.new(13 * TR_WIDTH, 0, TR_WIDTH, TR_HEIGHT)
        # 14の場合、ジョーカーを設定
        elsif j == 14
          if i / 2 == 0
            $card[i][j] = Rect.new(13 * TR_WIDTH, 1 * TR_HEIGHT, 
                                   TR_WIDTH, TR_HEIGHT)
          else
            $card[i][j] = Rect.new(13 * TR_WIDTH, 2 * TR_HEIGHT, 
                                   TR_WIDTH, TR_HEIGHT)
          end
        # 13の場合、エースを設定
        elsif j == 13
          $card[i][j] = Rect.new(0, i * TR_HEIGHT, TR_WIDTH, TR_HEIGHT)
        # それ以外の場合
        else
          $card[i][j] = Rect.new(j * TR_WIDTH, i * TR_HEIGHT, 
                                 TR_WIDTH, TR_HEIGHT)
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # 重複しない乱数を造る。
  # ・・・実は今まで、乱数を無限に発生させ、それを配列に格納していって、
  # 次に作成する乱数が格納した配列に無い乱数だったら・・・ってのを繰り返して
  # 造ろうとして大挫折。
  # ・・・はじめに連続する数値の配列を作成して、ランダムにシャッフルすれば
  # よかったのね・・・orz・・・
  #--------------------------------------------------------------------------
  def change_make_rnd
    $rand_list = []
    cnt1 = 0
    cnt2 = 1
    for i in 0...52
      $rand_list[i] = [cnt1, cnt2]
      cnt2 += 1
      if cnt2 == 14
        cnt2 = 1
        cnt1 += 1
      end
    end
    
    for j in 0...50
      rnd1 = rand(52)
      rnd2 = rand(52)
      if rnd1 != rnd2
        tmp = $rand_list[rnd1]
        $rand_list[rnd1] = $rand_list[rnd2]
        $rand_list[rnd2] = tmp 
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # 点数設定:ブラックジャック
  #--------------------------------------------------------------------------
  def chagne_black_jack
    if $game_system.bj_setting.nil?
      msgbox "エラー 初期設定がされていません"
      exit
    end
    if $game_system.bj_setting.size != 2
      msgbox "エラー 初期設定パラメータ異常です"
      exit
    end
    return 10 + $game_system.bj_setting[0]
  end
  #--------------------------------------------------------------------------
  # 点数設定:ニアピン
  #--------------------------------------------------------------------------
  def near_black_jack
    return (chagne_black_jack * 0.8).to_i
  end
  #--------------------------------------------------------------------------
  # 点数設定:バッドポイント
  #--------------------------------------------------------------------------
  def bad_black_jack
    return (chagne_black_jack * 0.5).to_i
  end
  
  # ブラックジャックを終える時に外部カスタマイズポイントをnilに戻すか?
  BJ_END_FLAG = true
end

class Game_System
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :bj_point                              # BlackJack用ポイント
  attr_accessor :bj_setting                            # BlackJack Plus用設定
end

class Window_Info_Space2_BJ < Window_Base
  include TITLE_BM
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 320 + 8 - 48, 384, 48)
    refresh(nil)
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(text = nil)
    contents.clear
    
    pos = Rect.new(4, 0, 300, line_height)
    
    if text != nil
      draw_text(pos, text)
    else
      if $game_system.bj_point != nil && $game_system.bj_point != 0
        draw_text(pos, "[" + $game_system.bj_point.to_s + "] Hit or Stand ?")
      end
    end
  end
end

class Window_BlackJack < Window_Base
  include TITLE_BM
  include BlackJack
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 48, 384, 272 + 8 - 48)
    $game_system.bj_point = 0
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(cards)
    contents.clear
    
    @list = []
    for one_card in cards
      @list.push([one_card[0].to_i, one_card[1].to_i])
    end
    
    buble_sort
    draw_blackjack
  end
  #--------------------------------------------------------------------------
  # ● トランプのソート
  #--------------------------------------------------------------------------
  def buble_sort
      @list.sort! {|a, b| a[1] <=> b[1] }
  end
  #--------------------------------------------------------------------------
  # ● トランプの描画
  #--------------------------------------------------------------------------
  def draw_blackjack
    self.contents.clear
    
    for i in 0...@list.size
      draw_card($card[@list[i][0]][@list[i][1]], 15 + i * 30, 30)
    end
    get_total_point
  end
  #--------------------------------------------------------------------------
  # ● グラフィックの描画
  #--------------------------------------------------------------------------
  def draw_card(card, x, y, opacity = MAX8BIT)
    @cw = card.width
    self.contents.stretch_blt(Rect.new(x, y, TR_WIDTH , TR_HEIGHT), 
                              Cache.picture(CARD_ROOT), 
                              card, opacity)
  end
  #--------------------------------------------------------------------------
  # ● トランプの追加
  #--------------------------------------------------------------------------
  def card_add
    @list.push($rand_list[@list.size])
    buble_sort
    draw_blackjack
  end
  #--------------------------------------------------------------------------
  # ● ブラックジャック ポイント加算
  #--------------------------------------------------------------------------
  def get_total_point
    $game_system.bj_point = 0
    @ace_cnt = 0
    # ポイント加算
    for one_card in @list
      if one_card[1].to_i == 13
        @ace_cnt += 1
      else
        if one_card[1].to_i <= 9
          $game_system.bj_point += one_card[1].to_i + 1
        else
          $game_system.bj_point += 10
        end
      end
    end
    # A加算
    if @ace_cnt > 0
      for cnt in 0...@ace_cnt
        if $game_system.bj_point + $game_system.bj_setting[0] > chagne_black_jack
          $game_system.bj_point += 1
          # Aが複数枚ある場合で合計結果が chagne_black_jack を
          # 超える場合はもとに戻す
          if $game_system.bj_point > chagne_black_jack
            $game_system.bj_point -= $game_system.bj_setting[0]
            $game_system.bj_point += 1
          end
        else
          $game_system.bj_point += $game_system.bj_setting[0]
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● ブラックジャック ポイント加算
  #--------------------------------------------------------------------------
  def blackjack_judg
    # 
  end
end

class Scene_BlackJack < Scene_Minigame_Base
  include BM
  include BlackJack
  include MINI_GAME
  #--------------------------------------------------------------------------
  # ● ブラックジャック初期化
  #--------------------------------------------------------------------------
  def blackjack_init(flg = true)
    @start_flg = false
    @set_flg = false
    @bet_gold = 0
    @index = 0
    $game_system.bj_point = 0
    set_tranp
    @sp_card = [[0, 0], [1, 0]]
    change_make_rnd
    if flg == true
      @blackjack_window.refresh(@sp_card)
    end
    
    # 外部カスタマイズポイントの設定(未設定の場合)
    if $game_system.bj_setting == nil
      $game_system.bj_setting = [11, "ブラックジャック"]
    end
  end
  #--------------------------------------------------------------------------
  # ● ブラックジャック 清算
  #--------------------------------------------------------------------------
  def get_gold
    if $game_system.bj_point <= chagne_black_jack
      if $game_system.bj_point >= near_black_jack
        get = Integer(@bet_gold * $game_system.bj_point / 20.0)
      elsif $game_system.bj_point > bad_black_jack
        get = Integer(@bet_gold * $game_system.bj_point / 40.0)
      else
        get = 0
      end
    else
      get = 0
    end
    
    if get > MAX_GOLD
      get = MAX_GOLD
    end
    if get > 0
      get_lost_gold_coin(get, MG_GOLDCOIN_GET, BJ_BET_TYPE)
      text = GET_GOLD[BJ_BET_TYPE] + get.to_s
      @info_window.refresh(text)
    else
      get_lost_gold_coin(@bet_gold, MG_GOLDCOIN_LOST, BJ_BET_TYPE)
      text = LOST_GOLD[BJ_BET_TYPE] + @bet_gold.to_s
      @info_window.refresh(text)
    end
    
    text = "[" + $game_system.bj_point.to_s + "] point"
    
    if $game_system.bj_point > chagne_black_jack
      text += " バースト"
      se = LOOSE_ME
    elsif $game_system.bj_point == chagne_black_jack
      text += " " + $game_system.bj_setting[1]
      se = JACK_POT_ME1
    else
      if $game_system.bj_point >= near_black_jack
        se = JACK_POT_ME3
      elsif $game_system.bj_point > bad_black_jack
        se = JACK_POT_ME6
      else
        se = LOOSE_ME
      end
    end
    
    @change_info_window.refresh(text)
    
    se.play
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_minigame_window(BJ_BET_TYPE)
    
    # インフォウィンドウ その2
    @change_info_window = Window_Info_Space2_BJ.new
    
    # ブラックジャックメインウィンドウ
    @blackjack_window = Window_BlackJack.new
    @blackjack_window.activate
    
    set_keyhelp1
    
    blackjack_init
    @bet_window.refresh(@bet_gold)
    @title_window.refresh($game_system.bj_setting[1])
  end
    #--------------------------------------------------------------------------
  # ● フレーム更新(基本)
  #--------------------------------------------------------------------------
  def update_basic
    super
    if @start_flg == true
      if @set_flg == false
        @sp_card = [$rand_list[0], $rand_list[1]]
        @blackjack_window.refresh(@sp_card)
        @change_info_window.refresh
        @set_flg = true
        set_keyhelp2
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if @blackjack_window.active
      update_main
    end
    if @value_window.active
      update_value
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_main
    # B ボタンが押された場合
    if Input.trigger?(:B)
      # キャンセル SE を演奏
      Sound.play_cancel
      if @start_flg
        set_keyhelp1
        @start_flg = false
      else
        if BJ_END_FLAG
          $game_system.bj_setting = nil
        end
        blackjack_init(false)
        return_scene
      end
      return
    end
    if !@start_flg
      # A ボタンが押された場合
      if Input.trigger?(:A)
        # 決定 SE を演奏
        Sound.play_ok
        # 念の為
        @blackjack_window.refresh(@sp_card)
        value_window_activate
      
        @value_window.number = @bet_gold
        
        @blackjack_window.deactivate
        set_keyhelp3
        return
      end
    end
    if @start_flg
      # X ボタンが押された場合
      if Input.trigger?(:X)
        # 決定 SE を演奏
        Sound.play_ok
        @blackjack_window.blackjack_judg
        get_gold
        blackjack_init(false)
        @bet_window.refresh(@bet_gold)
        @gold_window.refresh
        set_keyhelp1
        return
      end
    end
    
    # C ボタンが押された場合
    if Input.trigger?(:C)
      if @bet_gold == 0
        # エラー SE を演奏
        ERROR_SE.play
        text =  "まずは" + MG_ERR_BET_ZERO[BJ_BET_TYPE]
        @info_window.refresh(text)
      else
        # 決定 SE を演奏
        Sound.play_ok
        @info_window.refresh("")
        @change_info_window.refresh
        if !@start_flg
          @start_flg = true
          set_keyhelp2
        elsif @start_flg
          @blackjack_window.card_add
          @change_info_window.refresh
          if $game_system.bj_point > chagne_black_jack
            @blackjack_window.blackjack_judg
            get_gold
            blackjack_init(false)
            @bet_window.refresh(@bet_gold)
            @gold_window.refresh
            set_keyhelp1
          end
        end
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (バリューウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_value
    #refresh
    # C ボタンが押された場合
    if Input.trigger?(:C)
      if (MG_BET_TYPE_GOLD == BJ_BET_TYPE && @bet_gold > $game_party.gold) ||
        (MG_BET_TYPE_COIN == BJ_BET_TYPE && @bet_gold > $game_variables[MG_COIN_INDEX])
        # エラー SE を演奏
        ERROR_SE.play
        @info_window.refresh(MG_ERR_BET_UPPER[BJ_BET_TYPE])
      elsif @bet_gold == 0
        # エラー SE を演奏
        ERROR_SE.play
        @info_window.refresh(MG_ERR_BET_ZERO[BJ_BET_TYPE])
      else
        # 決定 SE を演奏
        Sound.play_ok
        @info_window.refresh("")
        value_window_deactivate
        @blackjack_window.activate
        @bet_window.refresh(@bet_gold)
        set_keyhelp1
      return
      end
    end
    # B ボタンが押された場合
    if Input.trigger?(:B)
      # キャンセル SE を演奏
      Sound.play_cancel
      value_window_deactivate
      @blackjack_window.activate
      set_keyhelp1
      return
    end
    @bet_gold = @value_window.number
  end
  #--------------------------------------------------------------------------
  # ○ キーヘルプを設定
  #--------------------------------------------------------------------------
  def set_keyhelp1
    @bottomkeyhelp_window.clear
    @bottomkeyhelp_window.set_bottom_help({"B"=>"キャンセル", 
                                           "A"=>"コインベット", 
                                           "C"=>"ゲーム開始"})
  end
  #--------------------------------------------------------------------------
  # ○ キーヘルプを設定 2
  #--------------------------------------------------------------------------
  def set_keyhelp2
    @bottomkeyhelp_window.clear
    @bottomkeyhelp_window.set_bottom_help({"C"   =>"カードをひく", 
                                           "X"   =>"勝負", 
                                           "B"   =>"キャンセル"})
  end
  #--------------------------------------------------------------------------
  # ○ キーヘルプを設定 3
  #--------------------------------------------------------------------------
  def set_keyhelp3
    @bottomkeyhelp_window.clear
    @bottomkeyhelp_window.set_bottom_help({"矢印"=>"ベット", 
                                           "C"   =>"決定", 
                                           "B"   =>"キャンセル"})
  end
end
こぉんな感じになります。 使用画像はこちら

戻る