前一段时间有很多朋友咨询仿真气球爆破范式该如何做,今天终于有时间能够整理成教程发出来,希望能够对大家有所帮助。
本教程是基于官方的示例文件,网友的实例分享和Ryan自己的整理撰写,应该能够满足大家制作BART程序的需要了。
BART范式相信大家应该不是特别陌生,但还是简单介绍一下吧。在该任务中,屏幕上会呈现一个仿真气球,被试需要按键逐渐吹大这个气球,每一次吹气球都会有一定的收益,同时也有气球爆破的风险,气球越大,可能获得的收益越大,但气球被吹爆的风险也越高,如果气球被吹爆,该气球的收益就为零或负值。被试可以选择随时停止吹气球来接受目前的收益。该任务需要被试连续地决策是选择继续冒险还是停止冒险以获得当前的收益。 接下来我们就看看在E-prime中一个基础的BART范式需要如何进行设置。
帖子里仅列出关键步骤和语句,完整示例文件请戳文末“阅读原文”下载~
首先需要在主时间轴上放好开始和结束,实验的主要部分list,以及一个初始化变量的InLine:
关于本例中的变量,需要先在user里定义,在InLine中赋值:
这里的a1用作记录每一轮的收益,a2用作累积所有轮的收益,b2是用作记录该轮最终的结果是获得收益(1)或是气球爆炸(0)两种情况,所以初始设置为-1避免干扰。其它变量在后面会讲到。
在PList中,设置好实验的轮数30,子时间轴qq,和气球图片存储的路径PM。这里嵌套的MList是用于放置每一轮气球爆炸临界点数据的:
对于MList来说,可以人为设定每一轮的爆炸临界值,也可以使用一定的概率取随机值。本例中选用的是后者。
之后要进行的是主要的子时间轴上的设置。这里刺激呈现控件S前后的两个InLine即是设定和处理气球充气和爆炸的关键语句所在:
在第一个InLine中需要写下如下语句:
1DimtheResponseObjectAsRteRunnableInputObject
2SettheResponseObject = CRteRunnableInputObject(Rte.GetObject("S"))
3DimtheStateasSlideState
4SettheState = S.States("Default")
5DimKDAsKeyBoardResponseData
6
7b1 = c.GetAttrib("PM")
8DimSDasSlideImage
9SetSD = CSlideImage(S.States.Item("Default").Objects("Image1"))
10SD.filename = b1 &"1.bmp"
11SD.load
12
13DimSTasSlideText
14SetST = CSlideText(S.States.Item("Default").Objects("Text3"))
15ST.Text="永久银行: "& a2
16
17'Set ST = CSlideText(S4.States.Item("Default").Objects("Text1"))
18'ST.Text="前一气球收益: "& a1
19
20SetST = CSlideText(S.States.Item("Default").Objects("Text2"))
21ST.Text="临时银行: 0"
22
23i=1
24'j=val(c.GetAttrib("A"))
25
26k = random(1,128)
27c.SetAttrib"A", str(k)
这里的代码意思是将SD设为图片控件,并且加载初始状态时候的气球图片,设置ST第一次为永久银行的标签和数值,第二次为临时银行的标签和数值。最后是在1到128之间随机一个数值,作为气球爆破的临界值(这里相当于是每个trial的爆破概率为1/128)。
之后,在第一二个InLine中需要写下如下语句:
1Do
2d1=Val(nIndex1)
3nIndex1=Val(theResponseObject.InputMasks.Responses.Count)
4
5ifnIndex1>d1then
6SetKD = CKeyBoardResponseData(theResponseObject.InputMasks.Responses(nIndex1))
7
8selectcaseKD.RESP
9case"f"
10i=i+1
11SD.filename=b1 & i &".bmp"
12SD.load
13SD.draw
14
15ST.Text="临时银行: "& (i-1)*0.01
16ST.draw
17
18ifi=kthen
19SD.filename=b1 & i &"b.bmp"
20SD.load
21SD.draw
22
23ST.Text="临时银行: 0"
24ST.draw
25
26sleep500
27exitdo
28endif
29case"j"
30sleep500
31exitdo
32endselect
33endif
34loop
35
36'b3=b2
37ifi
38a1=(i-1)*0.01
39b2=1
40c.SetAttrib"N1",1
41FB.text="本次气球收益:"& a1
42else
43a1=0
44b2=0
45c.SetAttrib"N1",0
46FB.text="本次气球爆炸,您未获得收益"
47endif
48
49a2=a2+a1
50c.SetAttrib"A1",i-1
51c.SetAttrib"A3",a1
52c.SetAttrib"A4",a2
53'c.SetAttrib"N2",b3
这里的代码意思是随着每一次S控件记录的按键次数增加,SD调用的图片相应变大,并且ST临时银行的数值相应增加,直到收集到的按键为“J”为止。随后就是将信息写入list和设置反馈界面的语句了。
S界面的样式如图所示,Image1是气球图片,Text2和Text3分别是临时银行和永久银行:
这里需要注意的是,需要将设置中的按键次数调到一个大于或至少等于128的值,如图:
如上设置之后,就算是一个可以有基础功能的仿真气球爆破实验程序了。
点击“阅读原文”下载示例文件。供大家参考。
不知不觉距上次更新又过了一个月……实在是罪过……
欢迎有疑问的朋友继续在公众号后台或者微信上给Ryan留言提问~
祝好!
—Ryan的后记
如果觉得好看还请点击右下角的“好看”哈,让更多朋友看到~↓↓↓↓