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


これまではマウスを使って選択をする方法を用いてきました。 最後に,キーボードを使った選択への拡張をします。

マウス入力はスマートフォンやタブレット端末でも課題ができるので 便利な反面,同じ場所の選択肢が選ばれ続けやすいという効果も考えられます。 また,反応時間に興味がある場合もキーボード入力の方がよいでしょう。

キーボードの入力を受ける

ここでは,「F」キーで左のスロットマシンを,「J」キーで右のスロットマシンを 選択するようにします。

キーボード入力を用いるには,以下の作業が必要となります。

task 2armed_bandit
  # 反応で使うキーの設定 f: 左を選択 j: 右を選択
  keys f j
readkey 1 2000 # 1: f 2: j

この最初の1は,「keys f j」で指定した1番目のkey (ここではf) が正解だということを意味します (ここではどちらが正解ということはないのですが)。 “正解”のキーfが制限時間の2000ms以内に押されれば,変数STATUSの値はCORRECT (1), “不正解”のキーjが入力されればSTATUSの値はWRONG (2),制限時間内にkeysで指定したキーが押されなければ STATUS の値はTIMEOUT (3) となります。

現在のPsyToolkitのバージョン (2.5.1)では, 何番目のキーが押されたのか,という情報を直接受け取ることはできないようです。 そこで,正解か不正解か,ということで2つの選択を無理やり区別します。 したがって,3つ以上の選択をキーボードで入力を受けることはできません。

教示文を画像で出す

マウス入力を使う場合もそうなのですが,キーボードを使う際は 特に,事前の教示でどのキーを使って選択をしてもらうかを実験参加者に伝える必要があります。 教示はsurveyの方で行ってもよいのですが,experimentの中で 行うには,教示文をパワーポイントなどで作ってスライドごとpngファイルとして 保存し,画像として呈示するのが便利です。ここでは,以下の教示画像 instruction.pngを使います。

まず以下のようにこのファイルを画像として読み込み,

bitmaps
  ...
  instruction # 入力方法の教示画面

blockでコマンドmessageの後にこの画像ファイル名を指定します。

block main
  message instruction # 教示画面の表示
  tasklist
    2armed_bandit 40 fixed
  end

exp_2bandit_ext4

コードを以下のようにします。

options
  resolution 1000 800 # 画面の解像度を上げる (デフォルトは800×600)

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

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

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

# taskの1試行の流れを以下に記述
task 2armed_bandit
  # 最初の設定 ---------------------------------------
  # 
  #【追加】反応で使うキーの設定 f: 左を選択 j: 右を選択
  keys f j
  # 各選択肢の報酬の系列の読み込み
  table reward_seq
  # 
  # 固視点の呈示 -----------------------------------
  #
  show text "+" 0 0 # -> stimulus 1に
  delay 2000
  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
  #
  #【追加】キーボード入力の読み取り -------------------------------
  #
  # 'f'または'j'が押されるまで待つ
  # 制限時間は2000ms
  readkey 1 2000 # 1: f 2: j
  #
  # 反応時間の記録
  set $decisiontime RT
  #
  #  2秒以内に反応がなかった場合のメッセージ ----------------
  if STATUS == TIMEOUT
    clear 2 3
    set $a 0 # 反応ミス -> $a = 0とする
    show text "2秒以内に選択してください!" 0 0
    delay 2500
  fi
  #
  #【変更】どちらのスロットマシンを選んだか判定 ----------------
  #
  if STATUS == 1    # 'f'が押された場合 (左を選択)
    if $option_pos == 1     # 青を選択
      set $a 2
    fi
    if $option_pos == 2     # 緑を選択
      set $a 1
    fi
  fi
  if STATUS == 2    # 'j'が押された場合 (右を選択)
    if $option_pos == 1     # 緑を選択
      set $a 1
    fi
    if $option_pos == 2     # 青を選択
      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
  message instruction # 教示画面の表示
  tasklist
    # タスク2armed_banditを40試行行う
    # デフォルトだと試行の順番はランダマイズされる
    # ので,ここではtableとして指定した報酬系列の順番通りに報酬を出すよう,
    # オプション 'fixed' をつける
    2armed_bandit 40 fixed
  end