[ 基本プログラム| 拡張1 | 拡張2 | 拡張3 | 拡張4]
これまでは無味乾燥な正方形だった選択肢を,上のようにスロットマシンの画像にします。 experimentで画像ファイルを用いるには,以下の作業が必要となります。
画像ファイルをアップロードする
コードのはじめに以下のような画像ファイルの読み込み部をつける
bitmaps
file_name # 画像ファイル名(拡張子は除く)
show bitmap file_name $x $y # $x, $yは画像の中心部のx座標,y座標
まず,用いる画像ファイル (png) をまとめたzipファイルをこちらからダウンロードします。
それを展開してできたファイルのうち,blue_slot1.png, green_slot1.png, reward_seq.txtを’Upload image or sound files’の横にある「ファイルを選択」ボタンをクリックし,アップロードします。 ※なお,このスロットマシンのpngファイルはパワーポイントで作成しました。 reward_seq.txtはexp_2armed_bandit_ext2と同じものです。
以下のコードを入力します。これはexp_2armed_bandit_ext2に変更を加えたものです。
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で消去してから 次の画像を表示しようとすると画像が切り替わる際にちらつきが生じ,スムーズな アニメーションになりません。前の不要な画像もクリアせずに,そのまま 重ね書きをする方がよいようです。そのために,ここでは上のように画像ファイルの背景を黒で塗りつぶし,重ねたときに前の画像が隠れるようにしています。
上と同じ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