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



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

$scene = Scene_BlackJack.new
にてゲーム開始。

※以下のモジュール/スクリプトが別途導入必要です。
 縁取り文字
 ミニゲーム用共通処理モジュール
 貪藻矢射妥←ダイヤモンドベースモジュール
 ボトムキーヘルプ
 VXA風SE
 Window VXA

変更点
2012:03:03
・トランプを1デッキのみ使用に変更(カードの重複の排除)
・一部の共通モジュールのクラス化

2013:06:01
・オリジナルルール様に外部カスタマイズポイントを追加
・オーディオファイルの設定を変更

2015:10:01
・VXA風Sound対応
・よく考えたら別にソートして表示する必要がないのでソート処理をオミット

2020:09:03
・Window VXA対応

#==============================================================================
# ミニゲーム:ブラックジャック Plus By 貪藻矢射妥←
#------------------------------------------------------------------------------
# 普通のブラックジャックDeath。
# 一人遊びようなのでつまらないことこの上なかったりします。
# 
# $scene = Scene_BlackJack.new
# にてゲームを開始できます。
# 
# 外部カスタマイズポイントについて
# シーンをブラックジャック Plusに移す前に以下を設定することでオリジナルなルール
# でゲームを実行可能です
# 
# EX)
# $game_system.bj_setting = [14, "ブラッククィーン"]
#  →Aが取り得るもう一つの数値, ゲームの名称
# 
# ※ちなみに、普通のカスタマイズポイントにしてないのは、数種類のブラックジャック
#  を設定したい際にスクリプトをコピペして使用しなくてもいいようにとの配慮です。
#==============================================================================
# 変更履歴
# 2012:03:03
# ・トランプを1デッキのみ使用に変更(カードの重複の排除)
# ・一部の共通モジュールのクラス化
# 
# 2013:06:01
# ・オリジナルルール様に外部カスタマイズポイントを追加
# ・オーディオファイルの設定を変更
# 
# 2015:10:01
# VXA風Sound対応
# よく考えたら別にソートして表示する必要がないのでソート処理をオミット
# 
# 2020:09:03
# ・Window VXA対応

module BlackJack
  # トランプの図柄セット
  CARD_ROOT="tr_set"
  # トランプ一枚のサイズ
  TR_WIDTH  = 72
  TR_HEIGHT = 100
  #--------------------------------------------------------------------------
  # トランプセッティング
  #--------------------------------------------------------------------------
  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
    # 超運発揮
    #$rand_list[0]  = [0, 13]
    #$rand_list[1]  = [1, 13]
    #$rand_list[2]  = [2, 13]
    #$rand_list[3]  = [3, 13]
    
    #$rand_list[4]  = [0,  1]
    #$rand_list[5]  = [1,  1]
    #$rand_list[6]  = [2,  1]
    #$rand_list[7]  = [3,  1]
    
    #$rand_list[8]  = [0,  2]
    #$rand_list[9]  = [1,  2]
    #$rand_list[10] = [2,  2]
  end
  
  #--------------------------------------------------------------------------
  # 点数設定:ブラックジャック
  #--------------------------------------------------------------------------
  def chagne_black_jack
    if $game_system.bj_setting.nil?
      p "エラー 初期設定がされていません"
      exit
    end
    if $game_system.bj_setting.size != 2
      p "エラー 初期設定パラメータ異常です"
      exit
    end
    return change_bj = 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_BlackJack < Window_Base
  include RUBY_SYS
  include TITLE_BM
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 380 - 64, 480 - 10, 64)
    refresh(nil)
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(text = nil)
    clear
    
    rectr = [4, 0, 300, 32]
    if text != nil
      draw_shadow_text(rectr, text)
    else
      if $game_system.bj_point != nil && $game_system.bj_point != 0
        draw_shadow_text(rectr, "[" + $game_system.bj_point.to_s + 
                                "] Hit or Stand ?")
      end
    end
  end
end

class Window_BlackJack < Window_Base#Window_Selectable
  include TITLE_BM
  include BlackJack
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 480 - 10, 380 - 128)
    $game_system.bj_point = 0
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(cards)
    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
=begin
  #--------------------------------------------------------------------------
  # ● トランプのソート
  #--------------------------------------------------------------------------
  def buble_sort
      @list.sort! {|a, b| a[1] <=> b[1] }
  end
=end
  include S_PORKAR
  #--------------------------------------------------------------------------
  # ● トランプの描画
  #--------------------------------------------------------------------------
  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), 
                              RPG::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
  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
      $game_party.gain_gold(get)
      text = GET_GOLD + get.to_s
      @info_window.refresh(text)
    else
      $game_party.lose_gold(@bet_gold)
      text = LOST_GOLD + @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)
    
    if se == LOOSE_ME
      $game_system.se_play(se)
    else
      $game_system.me_play(se)
    end
    
  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
  
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def initialize
    @bottomkeyhelp_window = Window_BottomKeyHelp.new
    set_keyhelp1
  end
  
  def main
    # ウィンドウを作成
    @title_window = Window_Title_Root.new
    
    @blackjack_window = Window_BlackJack.new
    
    @change_info_window = Window_Info_Space2_BlackJack.new
    
    @info_window = Window_Info_Space.new
    
    @gold_info_window = Window_Info_Gold.new
    
    @gold_window = Window_Gold.new
    @gold_window.x = 480 - 10
    @gold_window.y = 128
  
    @bet_info_window = Window_Info_Bet.new  
    
    @bet_window = Window_Bet_Gold.new
    
    @value_window2 = Window_Base.new(200, 200, 240, 64)
    @value_window2.z = 1000
    @value_window = Window_InputNumber.new(MAX_DIG)
    @value_window.x = 200
    @value_window.y = 200
    
    @value_window2.hide
    @value_window.hide
    @value_window.deactivate
    
    blackjack_init
    
    @title_window.refresh($game_system.bj_setting[1])
    @bet_window.refresh(@bet_gold)
    
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      
      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
        end
      end
      
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end

    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @title_window.dispose
    @blackjack_window.dispose
    @gold_window.dispose
    @bet_window.dispose
    @value_window.dispose
    @value_window2.dispose
    @info_window.dispose
    @gold_info_window.dispose
    @bet_info_window.dispose
    @change_info_window.dispose
    @bottomkeyhelp_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    if @blackjack_window.active
      update_main
      return
    end
    if @value_window.active
      @value_window.number = @bet_gold
      update_value
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_main
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      Sound.play_cancel
      if @start_flg == true
        set_keyhelp1
        @start_flg = false
      else
        $game_system.windowskin_name = WINDOW_SKIN_ROOT
        $scene = Scene_Map.new
      end
      if BJ_END_FLAG
        $game_system.bj_setting = nil
      end
      return
    end
    if @start_flg == false
      # A ボタンが押された場合
      if Input.trigger?(Input::A)
        # 決定 SE を演奏
        Sound.play_ok
        # 念の為
        @blackjack_window.refresh(@sp_card)
        @value_window.show
        @value_window.activate
        @value_window2.show
        @blackjack_window.deactivate
        set_keyhelp3
        return
      end
    end
    if @start_flg == true
      # X ボタンが押された場合
      if Input.trigger?(Input::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?(Input::C)
      if @bet_gold == 0
        # エラー SE を演奏
        $game_system.se_play(ERROR_SE)
        text =  "まずは" + MG_ERR_BET_ZERO
        @info_window.refresh(text)
      else
        # 決定 SE を演奏
        Sound.play_ok
        @info_window.refresh("")
        @change_info_window.refresh
        if @start_flg == false
          @start_flg = true
          set_keyhelp2
        elsif @start_flg == true
          @blackjack_window.card_add
          @change_info_window.refresh
        end
        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
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (バリューウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_value
    #refresh
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      if @bet_gold > $game_party.gold
        # エラー SE を演奏
        $game_system.se_play(ERROR_SE)
        @info_window.refresh(MG_ERR_BET_UPPER)
      elsif @bet_gold == 0
        # エラー SE を演奏
        $game_system.se_play(ERROR_SE)
        @info_window.refresh(MG_ERR_BET_ZERO)
      else
        # 決定 SE を演奏
        Sound.play_ok
        @info_window.refresh("")
        @value_window.hide
        @value_window.deactivate
        @value_window2.hide
        @blackjack_window.activate
        @bet_window.refresh(@bet_gold)
        set_keyhelp1
      return
      end
    end
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      Sound.play_cancel
      @value_window.hide
      @value_window.deactivate
      @value_window2.hide
      @blackjack_window.activate
      set_keyhelp1
      return
    end
    # Window_InputNumberに処理を移す
    @value_window.update
    @bet_gold = @value_window.number
  end
end
こぉんな感じになります。 使用画像はこちら

戻る