プロが教える店舗&オフィスのセキュリティ対策術

私は心理学を専攻する大学4年生です。
現在卒業論文で実験プログラムを作成しなければならないのですが、プログラミングは大の苦手であり、心理学実験用のマニュアルや資料を参照しても全く完成させることができません。使用しているアプリケーションソフトはVisualStudio2015、言語はVisualBasicです。

作成すべきプログラムは以下のようなものです。
1. 開始ボタンを押すと開始ボタンが消え、画面中央のラベルに文字が1個表示される。
2. ラベルの文字は全部で28種類あり、1ブロックにおいてそれぞれが1回ずつランダムに表示される。これが全部で4ブロックまで繰り返されるので、総試行数は112試行となる。
3. 1試行は、1個の文字が10秒間表示されることであり、10秒経つと自動的に次の試行へと移り、文字が切り替わる。
4. ただし、1試行中に被験者がスペースキーを押すと、ただちに画面全体が暗転する。暗転状態は10秒間であり、10秒経つと自動的に次の試行へと移る(元通りの画面になり、次の文字が表示される)。
5.ある文字に対してスペースキーが押された回数と、その文字が表示されてからスペースキーを押すまでの時間(潜時)を計測する。

指導教授からは簡単なプログラムなのだから早く完成させろと叱責します(ただし、教授自身にはプログラミングの具体的指導は仰げません)。別の先生によるプログラミングの授業も以前受けたことがありますが、その際も今回よりも簡単なプログラムの作成すらままなりませんでした。その先生は大変プログラミングにお詳しいので、今回もご相談したところ、授業で用いたレジュメよりも詳細なものを頂きました。また、「はじめての行動分析実験―VisualBasicでまなぶ実験プログラミング」という本を入手し、これらを参照して作成に励みました。しかし、それぞれの項目にあるサブプロシージャを単に組み合わせただけでは、デバッグをしても思うように作動せず(何も表示されない、暗転状態が終わらない、表示された文字が10秒経過しても切り替わらない、など)、徹夜を続けて試行錯誤的に記述してはデバッグを繰り返しましたが、全く完成させることができませんでした。サブプロシージャ同士のつながりが重要なのだろうと思いますが、それをどうやって実現すればよいかは資料を読んでも私の頭では理解・実現困難でした。

指導教授には2日後の月曜日から実験を始めるよう命じられており、明日には完成させなければなりません。先のプログラミングにお詳しい先生とは休日にはコンタクトがとれないので間に合いません。私のゼミにはそのようなプログラミングに詳しい院生の方はおらず、他のゼミにもご相談できる方がおりません。本日も完成させるべくずっと頑張っていたのですが、ついに思うように作動することはなく、完成の見通しが全く立たないため、このサイトにて質問を投稿する決心を致しました。このような事態になったことは完全に私の自業自得であり、私の横着と怠慢故の質問で大変恐縮ですが、本当に困っています。ここ1週間は慢性的に頭痛腹痛に悩まされ、夜も眠れません。どなたかお助け下さい。どうかよろしくお願い申し上げます。

お恥ずかしながら、以下が私が作成したコードになります。
Button1は開始ボタン、Label1は文字を表示するラベル、Trialは試行数カウンタ、StartTimeは表示開始時間、EndTime1は表示終了時間、RespTimeはキーを押した時間、EndTime2は暗転終了時間、Latencyは表示開始からキーが押されるまでの時間、EndFlag1は表示終了、EndFlag2は暗転終了、StimTypeは文字の種類、dataは当座の順番保管場所になります。
(以下作成コード)
Public Class Form1
Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Integer) As Short

Dim Trial As Integer
Dim StartTime, EndTime1, RespTime, EndTime2, Latency(130) As Long
Dim EndFlag1, EndFlag2 As Boolean
Dim StimType(30) As Integer
Dim data(30) As Integer
Dim i As Integer

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Button1.Visible = False
EndFlag1 = False
Trial = 1
ArrangeStim()
StimStream()
End Sub

Private Sub StimStream()←文字の表示
   Label1.Visible = True
StartTime = System.Environment.TickCount
EndFlag2 = False
StimType(Trial) = data(i)
Select Case StimType(Trial)
Case 1
Label1.Text = "文字1"
Case 2
Label1.Text = "文字2"
   (中略)
Case 28
Label1.Text = "文字28"
End Select
Do Until EndFlag1
Application.DoEvents()
EndTime1 = System.Environment.TickCount
If EndTime1 - StartTime > 1000 Then
EndFlag1 = True
End If
Loop
If EndFlag1 = True Then
Trial = Trial + 1
End If
If (&H001 And GetAsyncKeyState(System.Windows.Forms.Keys.Space)) = 1 Then
BlackOut()
End If
End Sub

Private Sub BlackOut()←暗転
Me.BackColor = Color.Black
RespTime = System.Environment.TickCount
Latency(Trial) = RespTime - StartTime
Do Until EndFlag2
Application.DoEvents()
EndTime2 = System.Environment.TickCount
If EndTime2 - RespTime > 10000 Then
EndFlag2 = True
End If
Loop
If EndFlag2 = True Then
Trial = Trial+ 1
StimStream()
End If
End Sub

Private Sub ArrangeStim()←文字のランダム化
Dim r, temp As Integer
For i = 1 To 28
data(i) = i
Next
For i = 1 To 28
r = Int(Rnd() * 28 + 1 - i) + i
temp = data(i)
data(i) = data(r)
data(r) = temp
Next
End Sub
End Class

A 回答 (1件)

その示したプログラムが実際にどんな期待を裏切る動きをするのかくらい示さないと…。


どんな裏切り行為をするのかまで読むのが面倒なので、別のアプローチからのアドバイス。

いきなり全部の動作を行うプログラムから書き始めていないか?
1~5を1ステップずつ作ればデバッグも簡単だ。
今作ってあるモノは破棄して、新しく作り直すことを勧めてみる。

質問文を見る限り、いきなり完璧なモノを作ろうとしているように感じるのだ。
慣れていないならそんな無茶はしてはダメ。
    • good
    • 0
この回答へのお礼

早々のご回答大変ありがとうございました。
プログラミングに関する質問が初めてであり、また非常に焦っていたため、過去の質問等を閲覧するなどして明示すべきことを把握することを怠ってしまいました。大変申し訳ありませんでした。また、読みにくい駄文長文となってしまい、大変失礼致しました。

このプログラムですと、開始ボタンを押すと開始ボタンが消えて文字が出るところまではできるのですが、「文字1」しか表示されず、10秒経っても次の文字に切り替わりません。また、「文字1」の表示中にスペースキーを押すと画面全体が暗転するのですが、10秒経っても暗転状態が終わらず、ずっと暗転したままです。

以前からうまくいかない度に何回も破棄しては1から作り直していたのですが、自分ではステップを踏んだつもりになっていただけで、仰る通りそのひとつひとつがちゃんと作動するかどうかの確かめを怠っていたのだと思います。もう一度、動作をひとつずつ作っていこうと思います。

お礼日時:2015/10/25 11:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!