Up

単純反応時間の簡単な実験プログラム例

 

単純反応時間の実験プログラムを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で行っている。

 

 

リスト1 単純反応時間実験プログラム(srt.py

 

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')

 

 

リスト2 結果の表示プログラム(Ssow_data.py

 

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()

 

 

Home