単純反応時間の簡単な実験プログラム例
単純反応時間の実験プログラムをPyGameを利用して書いてみた。PyGameの利用は簡単であり、コマンド
pip install
pygame
でインストールできる(Windowsの場合)。
プログラムファイルなどは圧縮ファイルsrt_pygame_files.zipにまとめた。ダウンロード展開すれば、自由に利用できる。
プログラムは、リスト1に示す通りである。
実験において表示する日本語文は、予めお絵かきソフト(ペイント)で作成しておき、実験においては画像ファイルとして読み込んで表示した。
例えば、説明文は次のコードでイメージimg_explnとしている。
img_expln = pg.image.load('expln.png')
rect_expln = img_expln.get_rect()
これを、次のコードで表示している。
screen.blit(img_expln,
((800-rect_expln.width)//2,(500-rect_expln.height)//2))
pg.display.flip()
表示すると、図1のようになる。
図1
実験は、図1の状態で「Gキー」を押すと反応時間計測試行へ進む。
各試行は「ヨーイ」文の表示で始まる(図2)。
図2
画面左上には、現在の試行数と実験の総試行数が表示されている。
「Fキー」を押すと、「ヨーイ」文は消える(図3)。
図3
しばらく後、「ドン」文が表示される(図4)。
図4
「Jキー」を押すと、「ドン」文は消える。「ドン」文の表示から「Jキー」の押下までが反応時間として記録される。
「ドン」が消えてから暫く後に「ヨーイ」文が表示され、図2に戻る。「Fキー」を押して、上の手順を繰り返す。
総試行が終了すると、出力ファイル名の設定が求められる。
出力ファイル名(*.txt)
= Results.txt
出力ファイル名(テキストファイル名)を設定すると、プログラムの終了である。
出力ファイルに格納されたデータの表示プログラムをリスト2のように用意した。
リスト2のプログラムを実行すると、入力ファイル名を聞いてくる。
Data file
name = Results.txt
上の実験で保存したファイル名を設定すると、読み込まれてヒストグラムが表示される(図5)。
図5
なお、Pythonによるデータ分析の説明を岡本(2019)で行っている。
import pygame as pg
from pygame import font
from pygame.time import get_ticks as
time_ms
import numpy.random as nr
pg.init()
font.init()
screen =
pg.display.set_mode(size=(800, 500)) # 画面の大きさ
screen.fill((0,0,0)) # 黒で塗りつぶす
my_font =
pg.font.SysFont(None,32)
# フォントオブジェクト
#
# 説明文のイメージ
#
img_expln = pg.image.load('expln.png')
rect_expln = img_expln.get_rect()
#
# 「ヨーイ」文のイメージ
#
img_rdy = pg.image.load('youi.png')
rect_rdy = img_rdy.get_rect()
#
#
「ドン」文のイメージ
#
img_don = pg.image.load('don.png')
rect_don = img_don.get_rect()
#
#
説明文の表示
#
screen.blit(img_expln,
((800-rect_expln.width)//2,(500-rect_expln.height)//2))
pg.display.flip()
ck = False
while not ck:
for e in pg.event.get():
if
e.type == pg.KEYDOWN:
if e.key == pg.K_g: # キーGが押されたかのチェック
ck = True
break
#
#
1秒間のブラックアウト
#
screen.fill((0,0,0))
pg.display.flip()
pg.time.wait(1000)
w_times = [2, 3, 4.5, 6] # 「ドン」が提示されるまでの時間のリスト(秒)
n_trials = 20
# 総試行数
times = []
# 反応時間を格納するリスト
for i_trial in range(n_trials):
#
# 試行数と「ヨーイ」文の表示
#
trial_str = f'Trial {i_trial+1}/{n_trials}'
img_trial =
my_font.render(trial_str, True, (255,255,255), (0, 0, 0))
screen.blit(img_trial, (10,
10))
screen.blit(img_rdy,
((800-rect_rdy.width)//2, (500-rect_rdy.height)//2))
pg.display.flip()
ck = False
while not ck:
for
e in pg.event.get():
if e.type == pg.KEYDOWN:
if e.key == pg.K_f: # 「キーF」が押されたか?
ck = True
break
#
# ブラックアウト
#
screen.fill((0,0,0))
pg.display.flip()
w_t = nr.choice(w_times) *
1000 # ブラックアウトの時間の選択
c_t = time_ms()
while time_ms() < c_t +
w_t:
# w_tミリ秒経過したか?
pg.event.get()
# フライング対策
#
# 「ドン」文の提示
#
screen.blit(img_don,
((800-rect_don.width)//2, (500-rect_don.height)//2))
pg.display.flip()
t0 = time_ms()
# 反応時間計測の始点
ck = False
while not ck:
for
e in pg.event.get():
if e.type == pg.KEYDOWN:
if e.key == pg.K_j: # 「キーJ」が押されたか?
ck = True
break
t1 = time_ms()
# 反応時間計測の終点
#
#
ブラックアウト
#
screen.fill((0,0,0))
pg.display.flip()
times.append(t1-t0) # 反応時間をリストtimesに追加
pg.time.wait(2000) # 2秒待ち
font.quit()
pg.quit()
fl_nm = input('\n出力ファイル名(*.txt) = ')
fout = open(fl_nm, 'w')
for v in times:
fout.write(f'{v}\n')
fout.close()
print(f'\n{fl_nm} was saved.\n')
import matplotlib.pyplot as plt
fl_nm = input('Data file name = ')
f_in = open(fl_nm)
data = f_in.read().splitlines()
print(data)
data = [float(v) for v in data]
print(data)
plt.hist(data)
plt.xlabel('msec')
plt.show()