[ 基本プログラム| 拡張1 | 拡張2 | 拡張3 | 拡張4]


これまでは無味乾燥な正方形だった選択肢を,上のようにスロットマシンの画像にします。 experimentで画像ファイルを用いるには,以下の作業が必要となります。

bitmaps
  file_name # 画像ファイル名(拡張子は除く)
show bitmap file_name $x $y # $x, $yは画像の中心部のx座標,y座標 

拡張3-1 —exp_2armed_bandit_ext3_1—

options
  mouse on # マウスを使う
  resolution 1000 800 # 【追加】画面の解像度を上げる (デフォルトは800×600)

fonts
  arial 36 # 使用するテキストのフォントを設定

# 【追加】読み込む画像ファイルの選択 -----------------------------------
bitmaps
  green_slot1 # 緑のスロットマシンの画像 (拡張子.pngは不要)
  blue_slot1  # 青のスロットマシンの画像

# tableとしてreward_seq.txtを読み込む -----------------------------------
table reward_seq
  include reward_seq.txt

# taskの1試行の流れを以下に記述
task 2armed_bandit
  # 各選択肢の報酬の系列の読み込み
  table reward_seq
  # 固視点の呈示 -----------------------------------
  #
  show text "+" 0 0 # -> stimulus 1に
  delay 1000
  clear 1 # stimulus 1 (固視点) を消す
  #
  # 選択肢の位置を決める ----------------------------
  #
  set $option_pos random 1 2
  if $option_pos == 1
    # 緑が右,青が左
    set $green_x 250
    set $blue_x -250
  fi
  if $option_pos == 2
    # 緑が左,青が右
    set $green_x -250
    set $blue_x 250
  fi
  #
  # 選択肢の呈示 -------------------------------------------
  #
  # 【変更点】
  draw off
    show bitmap green_slot1 $green_x 0 # ⇒ stimulus 2に
    show bitmap blue_slot1 $blue_x 0   # ⇒ stimulus 3に
  draw on
  #
  # マウスでの選択の読み取り -------------------------------
  #
  # stimulus 2 (緑の正方形),またはstimulus 3 (青の正方形)
  # が左クリックされるまで待つ
  # 固視点がstimulus 1となった分 stimulus IDが一つずれる
  # 制限時間は2000ms
  readmouse l 1 2000 range 2 3
  #
  # $c_pos にはクリックされたstimulusのID (2 or 3) が入る
  set $c_pos bitmap-under-mouse MOUSE_X MOUSE_Y
  #
  # 反応時間の記録
  set $decisiontime RT
  #
  #  2秒以内に反応がなかった場合のメッセージ ----------------
  #  制限時間以内にマウス入力がなかった場合,変数STATUSはTIMEOUT (=3) となる
  if STATUS == TIMEOUT
    clear 2 3
    set $a 0 # 反応ミス -> $a = 0とする
    show text "2秒以内に選択してください!" 0 0
    delay 2500
  fi
  #
  # どちらを選択したか判定 ---------------------------
  #
  if STATUS != TIMEOUT
    if $c_pos == 2    # 青い四角を選択
      set $a 1
    fi
    if $c_pos == 3    # 緑の四角を選択
      set $a 2
    fi
  fi
  #
  # 選択の結果の決定,呈示 ---------------------------------
  #
  # 報酬の有無の決定のため,1から100の間の乱数を生成
  set $x random 0 100
  if $a == 1 # 選択肢1 (緑) を選択
    show text "▲" $green_x  200
    delay 500
    if @1 == 1 # tableの1列目 (行は現在の試行ID)が1
      show text "+10ポイント" 0 -200
      set $reward 1
    fi
    if @1 == 0 # tableの1列目 (行は現在の試行ID)が0
      show text "+0ポイント" 0 -200
      set $reward 0
    fi
  fi
  if $a == 2 # 選択肢2 (青) を選択
    show text "▲" $blue_x  200
    delay 500
    #
    if @2 == 1 # tableの1列目 (行は現在の試行ID)が1
      show text "+10ポイント" 0 -200
      set $reward 1
    fi
    if @2 == 0 # tableの1列目 (行は現在の試行ID)が0
      show text "+0ポイント" 0 -200
      set $reward 0
    fi
  fi
  # 1秒待つ
  delay 1000
  #
  # 1試行分のデータの保存-----------------------------------
  # 1列目: 反応時間 (選択肢が出てからキーを押すまで)
  # 2列目: 選択 (1 or 2)
  # 3列目: 報酬の有無 (0 or 1)
  # 4列目: 選択肢の位置 (1:緑が右, 2:緑が左)
  # 5列目: 選択肢1に割り当てられた報酬 (1 or 2) 
  # 6列目: 選択肢2に割り当てられた報酬 (1 or 2) 
  save $decisiontime $a $reward $option_pos @1 @2

block main
  tasklist
    # タスク2armed_banditを40試行行う
    # デフォルトだと試行の順番はランダマイズされる
    # ので,ここではtableとして指定した報酬系列の順番通りに報酬を出すよう,
    # オプション 'fixed' をつける
    2armed_bandit 40 fixed
  end

アニメーションでスロットマシンのアームを動かす

拡張3-2では,さらに上のようにスロットマシンのアームが動くアニメーションもつけてみます。これらの画像ファイルもパワーポイントでアームの角度を変えながら作りました。

アニメーションを動かすには,基本的には画像を呈示 ⇒ delayで一定時間まつ⇒ 次の画像を呈示⇒…とするだけです。

まず,読み出す画像を以下のように指定します。

bitmaps
  green_slot1 
  green_slot2 
  green_slot3 
  blue_slot1  
  blue_slot2  
  blue_slot3  

選択された後の処理として,たとえば緑のスロットマシンを選択した処理の後には

    show bitmap green_slot2 $green_x 0
    delay 20
    show bitmap green_slot3 $green_x 0
    delay 500

というコードを追加します。

画像を切り替える際,以前の画像をclearで消去してから 次の画像を表示しようとすると画像が切り替わる際にちらつきが生じ,スムーズな アニメーションになりません。前の不要な画像もクリアせずに,そのまま 重ね書きをする方がよいようです。そのために,ここでは上のように画像ファイルの背景を黒で塗りつぶし,重ねたときに前の画像が隠れるようにしています。

拡張3-2 —exp_2armed_bandit_ext3_2—

  • 上と同じzipファイルこちらを展開してできたファイルの“instruction.png”を除く7つのファイルをUpload image or sound files’の横にある「ファイルを選択」ボタンをクリックし,アップロードします。

  • コードを以下のようにします。これはexp_2armed_bandit_ext3_1に変更を加えたものです。

options
  mouse on # マウスを使う
  resolution 1000 800 # 画面の解像度を上げる (デフォルトは800×600)

fonts
  arial 36 # 使用するテキストのフォントを設定

# 【追加】読み込む画像ファイルの選択 -----------------------------------
bitmaps
  green_slot1 # 緑のスロットマシンの画像
  green_slot2 # 緑のスロットマシンの画像【追加】
  green_slot3 # 緑のスロットマシンの画像【追加】
  blue_slot1  # 青のスロットマシンの画像
  blue_slot2  # 青のスロットマシンの画像【追加】
  blue_slot3  # 青のスロットマシンの画像【追加】

# tableとしてreward_seq.txtを読み込む -----------------------------------
table reward_seq
  include reward_seq.txt

# taskの1試行の流れを以下に記述
task 2armed_bandit
  # 各選択肢の報酬の系列の読み込み
  table reward_seq
  # 固視点の呈示 -----------------------------------
  #
  show text "+" 0 0 # -> stimulus 1に
  delay 1000
  clear 1 # stimulus 1 (固視点) を消す
  #
  # 選択肢の位置を決める ----------------------------
  #
  set $option_pos random 1 2
  if $option_pos == 1
    # 緑が右,青が左
    set $green_x 250
    set $blue_x -250
  fi
  if $option_pos == 2
    # 緑が左,青が右
    set $green_x -250
    set $blue_x 250
  fi
  #
  # 選択肢の呈示 -------------------------------------------
  #
  # 【変更点】
  draw off
    show bitmap green_slot1 $green_x 0 # ⇒ stimulus 2に
    show bitmap blue_slot1 $blue_x 0   # ⇒ stimulus 3に
  draw on
  #
  # マウスでの選択の読み取り -------------------------------
  #
  # stimulus 2 (緑の正方形),またはstimulus 3 (青の正方形)
  # が左クリックされるまで待つ
  # 固視点がstimulus 1となった分 stimulus IDが一つずれる
  # 制限時間は2000ms
  readmouse l 1 2000 range 2 3
  #
  # $c_pos にはクリックされたstimulusのID (2 or 3) が入る
  set $c_pos bitmap-under-mouse MOUSE_X MOUSE_Y
  #
  # 反応時間の記録
  set $decisiontime RT
  #
  #  2秒以内に反応がなかった場合のメッセージ ----------------
  #  制限時間以内にマウス入力がなかった場合,変数STATUSはTIMEOUT (=3) となる
  if STATUS == TIMEOUT
    clear 2 3
    set $a 0 # 反応ミス -> $a = 0とする
    show text "2秒以内に選択してください!" 0 0
    delay 2500
  fi
  #
  #  どちらの選択をしたか判定 ---------------------------
  #
  if STATUS != TIMEOUT
    if $c_pos == 2    # 青い四角を選択
      set $a 1
    fi
    if $c_pos == 3    # 緑の四角を選択
      set $a 2
    fi
  fi
  #
  # 選択の結果の決定,呈示 ---------------------------------
  #
  # 報酬の有無の決定のため,1から100の間の乱数を生成
  set $x random 0 100
  if $a == 1 # 選択肢1 (緑) を選択
    show text "▲" $green_x  200
    # 【以下追加】
    show bitmap green_slot2 $green_x 0
    delay 20
    show bitmap green_slot3 $green_x 0
    delay 500
    #
    if @1 == 1 # tableの1列目 (行は現在の試行ID)が1
      show text "+10ポイント" 0 -200
      set $reward 1
    fi
    if @1 == 0 # tableの1列目 (行は現在の試行ID)が0
      show text "+0ポイント" 0 -200
      set $reward 0
    fi
  fi
  if $a == 2 # 選択肢2 (青) を選択
    show text "▲" $blue_x  200
    # 【以下追加】
    show bitmap blue_slot2 $blue_x 0
    delay 20
    show bitmap blue_slot3 $blue_x 0
    delay 500
    #
    if @2 == 1 # tableの1列目 (行は現在の試行ID)が1
      show text "+10ポイント" 0 -200
      set $reward 1
    fi
    if @2 == 0 # tableの1列目 (行は現在の試行ID)が0
      show text "+0ポイント" 0 -200
      set $reward 0
    fi
  fi
  # 1秒待つ
  delay 1000
  #
  # 1試行分のデータの保存-----------------------------------
  # 1列目: 反応時間 (選択肢が出てからキーを押すまで)
  # 2列目: 選択 (1 or 2)
  # 3列目: 報酬の有無 (0 or 1)
  # 4列目: 選択肢の位置 (1:緑が右, 2:緑が左)
  # 5列目: 選択肢1に割り当てられた報酬 (1 or 2) 
  # 6列目: 選択肢2に割り当てられた報酬 (1 or 2) 
  save $decisiontime $a $reward $option_pos @1 @2

block main
  tasklist
    # タスク2armed_banditを40試行行う
    # デフォルトだと試行の順番はランダマイズされる
    # ので,ここではtableとして指定した報酬系列の順番通りに報酬を出すよう,
    # オプション 'fixed' をつける
    2armed_bandit 40 fixed
  end