サンプルソースコード「大なり小なりゲーム」

 Visual basic 2010がフリーでダウンロード出来るので、ちょっと落として使ってみました。BASICとか言うけど中身ほとんどDelphiです(-_-;)。ゲームならタイマー割り込み使うところですが、ここではあえて?ボタンを押したら1つ進む、という感覚で作ってますので、メインルーチンはフォームのPaintブロックになってます。

解ると、AVGくらいは楽に作れるんじゃないでしょうか。

visualbasic2010用サンプルプログラム大なり小なりゲーム
※EXEなので、警告とか出ますが気にしない方だけどうぞ

概念の理解
今後は、”アプリの駆動部その物が”マルチタスクで動く可能性があるので意味のない概念かもしれませんが。従来のマルチタスク環境ではプログラムの方が”それ”に合わせる必要があるため、要するにメインルーチンはBASIC(あえて古い)で言うと「行番号を1つ実行する毎に制御をOSに返す」という処理を入れる必要があります。これがちょっと難しいのですが。一応、このソースコードはひな形にはなるでしょうか。

感覚の理解
Windowsは「どんな」OSか?と言うと、やっぱり仕事用のOSですので、規定が「表計算ソフト」とかになります。今のマルチタスク環境は”それ”を動かす上で過不足ないもの、というニュアンスで構築されているため、「特にシングルタスク的な処理は必要なかった」訳です。各セルは独立して動いて数値を保持していて、「計算」ボタンを押すと計算ルーチンが駆動する(電卓が良いサンプルです)。その環境で「ゲーム」を動かそうとすれば相応の対応は必要になるんですが(というか”全く配慮がない”ので解らない)、上にも書いてますが未来形としては「1つのハードの中に複数のマシンが動いている」のがマルチタスクの理想?ではありますので、「マルチタスク」の語感的には感覚が合わない部分が出てくるのはやむを得ない所です。「どっちが正しいのか?」という話で言えば、”今”は、ボタンを押すと次に進む、方がまあ、Windows上としては「正しい」でしょう。


2012/11/26
森宮 照



Public Class Form1
	 '再作画で必要になります。なんかめんどくさい表記です
	Public frm As System.Windows.Forms.PaintEventArgs
	'再作画ルーチン(メインルーチン)を切り替える上の、言うと「行番号」です
	Public line
	'一つのフォーム上で必要になるいわゆる「変数」は、ここで全部定義します。
	Public score, anser, da, db, dc, dd, de, df, dta, dtb, okflg, nxflg, time

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	'フォームがロードされた際に、変数の初期設定をします
	line = 0
	score = 0
	anser = 0
	okflg = 0
	nxflg = 0
 End Sub

 Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
	 '「次へ」ボタンが押されたらラインを1進める処理
	 If nxflg = 1 Then line = line + 1

	 Select Case line
	 Case 0 'タイトルです
		 'フォームのPaintイベントを動かす時、何故か自分のフォーム番号を指定しないと再作画してくれませんが、
		 'しかし”それ”はここでしか取れないので、変数のfrmに入れておきます。
		 frm = e
		 '後は、フォーム上の初期設定です。
		 Label1.Text = "大なり小なりゲーム"
		 Label5.Text = "問題"
		 Label6.Text = "問題"
		 Label4.Text = "何かボタンを押してください。"
		 Label7.Text = "スタンバイ"
		 Button1.Text = "next"
		 score = 0
	 Exit Select


	 Case 1 '問題を作成し、出題します
		 Label9.Text = Str(score) + "点"
		 Label1.Text = "問題を出題します。3つのボタンの一つを押してください"
		 Label4.Text = "AはBより大きいか小さいか?どれ?"
		 Label7.Text = "答えは? "
		 da = Int(Rnd() * (score + 5))
		 db = Int(Rnd() * (score + 5))
		 dc = Int(Rnd() * (score + 5))
		 dd = Int(Rnd() * (score + 5))
		 de = Int(Rnd() * (score + 5))
		 df = Int(Rnd() * (score + 5))
		 dta = da + db + dc : dtb = dd + de + df
		 Label5.Text = Str(da) + "+" + Str(db) + "+" + Str(dc)
		Label6.Text = Str(dd) + "+" + Str(de) + "+" + Str(df)
		 line = 2 : anser = 0 : okflg = 0
	Exit Select

	Case 2 '答えの入力を待ちます
		If anser = 1 And (dta > dtb) Then okflg = 1 : Beep()
		If anser = 2 And (dta < dtb) Then okflg = 1 : Beep()
		If anser = 3 And (dta = dtb) Then okflg = 1 : Beep()
		If anser <> 0 Then line = 3
	Exit Select

	Case 3 '結果を表示しその後を決めます
		If okflg = 1 Then Label7.Text = "正解!" : Beep() : Beep() : score = score + 1 : nxflg = 0 : line = 4
		If okflg = 0 Then Label7.Text = "不正解(−_−;)終了" : line = 4
	Exit Select

	Case Is > 3 '待機処理です
		If nxflg = 1 And okflg = 0 Then line = 0
		If nxflg = 1 And okflg = 1 Then line = 1
	 End Select
 	'「次へ」ボタンの初期化処理です
 	nxflg = 0

 End Sub

 'ここから先は、各ボタンが押された場合の処理です。大概は押されたら再作画しています。
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 	nxflg = 1
 	Beep()
 	Button1.Text = "次へ"
 	Me.OnPaint(frm)
 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
	 anser = 1
	 Me.OnPaint(frm)
 End Sub
 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
	 anser = 2
	 Me.OnPaint(frm)
 End Sub

 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
	 anser = 3
	 Me.OnPaint(frm)
 End Sub

End Class

end