Document

程
式
實
習
報
告
電子二甲 20 號陳韋勳
程式:百萬富翁
程式作者: 方灝良
程式畫面:
Form 1 個
Listbox 1 個
Image
Label
7個
27 個
Timer
2個
動作原理:
主要是利用 Label 的文字變換,以達成問答的趣味性
加上各種求助方法,以及 Timer 的倒數,能使遊戲者像
是真的在超級大富翁遊戲一樣
程式碼
Option Explicit
Dim EQ() As MType, NQ() As MType, HQ() As MType '問題集
Dim EQNum As Integer, NQNum As Integer, HQNum As Integer '問題數
Dim CanAnswer As Boolean '是否許可作答
Dim InQuestion As Byte '在百萬大道上的位置
Dim AnsweringQ As Byte '作答中的題號
Dim x As Byte, y As Byte '迴圈變數
Private Type MType
QName As String
Line 10 個
AName(3) As String
CorrectA As Byte
HaveAns As Boolean
End Type
Private Function ChangeToABCD(Num As Byte) As String
Select Case Num
Case 0
ChangeToABCD = "A"
Case 1
ChangeToABCD = "B"
Case 2
ChangeToABCD = "C"
Case 3
ChangeToABCD = "D"
End Select
End Function
Private Sub Form_Load()
On Error GoTo Error
Randomize
'讀入問題集
Dim FPath As String, F As Integer, Change As Variant
FPath = IIf(App.Path = "C:\", App.Path, App.Path & "\")
FPath = FPath & "Millionaire.dat"
F = FreeFile
Open FPath For Input As F
Input #F, Change
EQNum = Change - 1
ReDim EQ(EQNum)
Input #F, Change
NQNum = Change - 1
ReDim NQ(NQNum)
Input #F, Change
HQNum = Change - 1
ReDim HQ(HQNum)
For x = 0 To EQNum
Line Input #F, EQ(x).QName
For y = 0 To 3
Line Input #F, EQ(x).AName(y)
Next
Line Input #F, Change
EQ(x).CorrectA = Change
Next
For x = 0 To NQNum
Line Input #F, NQ(x).QName
For y = 0 To 3
Line Input #F, NQ(x).AName(y)
Next
Line Input #F, Change
NQ(x).CorrectA = Change
Next
For x = 0 To HQNum
Line Input #F, HQ(x).QName
For y = 0 To 3
Line Input #F, HQ(x).AName(y)
Next
Line Input #F, Change
HQ(x).CorrectA = Change
Next
Close #F
Exit Sub
Error:
MsgBox "讀入問題集錯誤!", vbExclamation
End
End Sub
'使用「問現場觀眾」
Private Sub imgci_Click()
If CanAnswer And imgci.Tag = 0 Then
CanAnswer = False
ciline(0).Visible = True
ciline(1).Visible = True
imgci.Tag = 1
imgChart.Visible = True
Timer1.Interval = 4500
End If
End Sub
'使用「問朋友」
Private Sub imgco_Click()
If CanAnswer And imgco.Tag = 0 Then
CanAnswer = False
imgco.Tag = 1
coline(0).Visible = True
coline(1).Visible = True
lblLeftTime.Visible = True
lstco.Visible = True
Timer1.Interval = 999
Timer2.Interval = 1
Timer2.Tag = 0
End If
End Sub
'使用「五十五十」
Private Sub imgff_Click()
Dim CA As Byte, TakeOut(1) As Byte
If CanAnswer And imgff.Tag = 0 Then
imgff.Tag = 1
ffline(0).Visible = True
ffline(1).Visible = True
If InQuestion < 5 Then
CA = EQ(AnsweringQ).CorrectA
ElseIf InQuestion < 10 Then
CA = NQ(AnsweringQ).CorrectA
Else
CA = HQ(AnsweringQ).CorrectA
End If
ReTry1:
TakeOut(0) = Int(Rnd * 3)
If TakeOut(0) = CA Then GoTo ReTry1
ReTry2:
TakeOut(1) = Int(Rnd * 3)
If TakeOut(1) = TakeOut(0) Or TakeOut(1) = CA Then GoTo ReTry2
lblAnswer(TakeOut(0)).Caption = ""
lblAnswer(TakeOut(1)).Caption = ""
End If
End Sub
'對應問題作出動作
Private Sub imgYes_Click()
If lblTalk.Caption = "開始嗎?" Then
lblMoney(0).BackColor = &H80FF&
imgYes.Visible = False
lblTalk.Caption = "看看問什麼?"
Timer1.Interval = 2000
ElseIf lblTalk.Caption = "放棄嗎?" Then
imgYes.Visible = False
imgShapes1.Visible = False
For x = 0 To 3
lblAnswer(x).Visible = False
Next
lblQuestion.Visible = False
imgShapes2.Visible = True
If InQuestion = 0 Then
lblGetMoney.Caption = "$0"
Else
lblGetMoney.Caption = lblMoney(InQuestion - 1).Caption
End If
lblTalk.Caption = "共獲獎金"
Timer1.Interval = 5000
ElseIf lblTalk.Caption = "最後答案?" Then
Dim IsCorrect As Boolean
imgChart.Visible = False
For x = 0 To 3
lblPercent(x).Visible = False
lines(x).Visible = False
Next
For x = 0 To 3
If lblAnswer(x).BackColor = &H80FF& Then
If InQuestion < 5 Then
If x = EQ(AnsweringQ).CorrectA Then IsCorrect = True
ElseIf InQuestion < 10 Then
If x = NQ(AnsweringQ).CorrectA Then IsCorrect = True
Else
If x = HQ(AnsweringQ).CorrectA Then IsCorrect = True
End If
If IsCorrect Then
lblTalk.Caption = "答案是對的!"
lblAnswer(x).BackColor = &HFF00&
imgYes.Visible = False
Timer1.Interval = 200
Exit Sub
Else
lblTalk.Caption = "答案是錯的!"
imgYes.Visible = False
If InQuestion < 5 Then
lblAnswer(EQ(AnsweringQ).CorrectA).BackColor = &HFF00&
ElseIf InQuestion < 10 Then
lblAnswer(NQ(AnsweringQ).CorrectA).BackColor = &HFF00&
Else
lblAnswer(HQ(AnsweringQ).CorrectA).BackColor = &HFF00&
End If
Timer1.Interval = 4000
Exit Sub
End If
End If
Next
End If
End Sub
'按下選擇
Private Sub lblAnswer_Click(Index As Integer)
If Not CanAnswer Then Exit Sub
lblAnswer(Index).BackColor = &H80FF&
For x = 0 To 3
If x <> Index Then
lblAnswer(x).BackColor = &H0
End If
Next
lblTalk.Caption = "最後答案?"
imgff.Enabled = False
imgco.Enabled = False
imgci.Enabled = False
End Sub
'主要計時器
Private Sub Timer1_Timer()
If Timer1.Interval = 2000 Then '決定問題及顯示問題
ReTry:
If InQuestion < 5 Then
AnsweringQ = Int(Rnd * (EQNum + 1))
If EQ(AnsweringQ).HaveAns Then GoTo ReTry
EQ(AnsweringQ).HaveAns = True
ElseIf InQuestion < 10 Then
AnsweringQ = Int(Rnd * (NQNum + 1))
If NQ(AnsweringQ).HaveAns Then GoTo ReTry
NQ(AnsweringQ).HaveAns = True
Else
AnsweringQ = Int(Rnd * (HQNum + 1))
If HQ(AnsweringQ).HaveAns Then GoTo ReTry
HQ(AnsweringQ).HaveAns = True
End If
If InQuestion < 5 Then
lblQuestion.Caption = EQ(AnsweringQ).QName
ElseIf InQuestion < 10 Then
lblQuestion.Caption = NQ(AnsweringQ).QName
Else
lblQuestion.Caption = HQ(AnsweringQ).QName
End If
Timer1.Interval = 3000
ElseIf Timer1.Interval = 3000 Then '顯示 A 答案
If InQuestion < 5 Then
lblAnswer(0).Caption = "A." & EQ(AnsweringQ).AName(0)
ElseIf InQuestion < 10 Then
lblAnswer(0).Caption = "A." & NQ(AnsweringQ).AName(0)
Else
lblAnswer(0).Caption = "A." & HQ(AnsweringQ).AName(0)
End If
Timer1.Interval = 1000
ElseIf Timer1.Interval = 1000 Then '顯示其他答案
For x = 1 To 3
If lblAnswer(x).Caption = "" Then
If InQuestion < 5 Then
lblAnswer(x).Caption = Chr(65 + x) & "." & EQ(AnsweringQ).AName(x)
ElseIf InQuestion < 10 Then
lblAnswer(x).Caption = Chr(65 + x) & "." & NQ(AnsweringQ).AName(x)
Else
lblAnswer(x).Caption = Chr(65 + x) & "." & HQ(AnsweringQ).AName(x)
End If
Exit For
End If
Next
If x = 3 Then
lblTalk.Caption = "放棄嗎?"
Timer1.Interval = 0
imgYes.Visible = True
CanAnswer = True
End If
ElseIf Timer1.Interval = 200 Then '閃爍正確答案
For x = 0 To 3
If lblAnswer(x).BackColor = &H80FF& Then '橙變綠
lblAnswer(x).BackColor = &HFF00&
Timer1.Interval = 1500
ElseIf lblAnswer(x).BackColor = &HFF00& Then '綠變橙
lblAnswer(x).BackColor = &H80FF&
End If
Next
ElseIf Timer1.Interval = 1500 Then '顯示暫得金錢
For x = 0 To 3
If lblAnswer(x).BackColor = &HFF00& Then
imgShapes1.Visible = False
For y = 0 To 3
lblAnswer(y).Caption = ""
Next
lblQuestion.Caption = ""
lblAnswer(x).BackColor = &H0
imgShapes2.Visible = True
If InQuestion = 14 Then
lblGetMoney.Font.Name = "新細明體"
lblGetMoney.Caption = "百萬富翁"
lblTalk.Caption = "恭喜你成為---"
Timer1.Interval = 5000
Else
lblGetMoney.Caption = lblMoney(InQuestion).Caption
Timer1.Interval = 3500
End If
End If
Next
ElseIf Timer1.Interval = 4000 Then '答錯後判斷獎金
imgShapes1.Visible = False
For x = 0 To 3
lblAnswer(x).Visible = False
Next
lblQuestion.Visible = False
imgShapes2.Visible = True
If InQuestion < 5 Then
lblGetMoney.Caption = "$0"
ElseIf InQuestion < 10 Then
lblGetMoney.Caption = "$8000"
Else
lblGetMoney.Caption = "$60000"
End If
lblTalk.Caption = "共獲獎金"
Timer1.Interval = 5000
ElseIf Timer1.Interval = 3500 Then '轉新問題
lblMoney(InQuestion).BackColor = &H0
InQuestion = InQuestion + 1
lblMoney(InQuestion).BackColor = &H80FF&
imgff.Enabled = True
imgco.Enabled = True
imgci.Enabled = True
imgShapes2.Visible = False
lblGetMoney.Caption = ""
imgShapes1.Visible = True
lblTalk.Caption = "看看問什麼?"
CanAnswer = False
Timer1.Interval = 2000
ElseIf Timer1.Interval = 999 Then '「問朋友」計時
lblLeftTime.Caption = lblLeftTime.Caption - 1
If lblLeftTime.Caption = "0" Then
Timer1.Interval = 0
Timer2.Interval = 0
lblLeftTime.Visible = False
lstco.Visible = False
CanAnswer = True
End If
ElseIf Timer1.Interval = 4500 Then '「問現場觀眾」結果顯示
Dim CA As Byte, LeftPercent As Byte, AddTo As Byte
Timer1.Interval = 0
If InQuestion < 5 Then
CA = EQ(AnsweringQ).CorrectA
ElseIf InQuestion < 10 Then
CA = NQ(AnsweringQ).CorrectA
Else
CA = HQ(AnsweringQ).CorrectA
End If
lblPercent(CA).Caption = 100 - (InQuestion + 1) * 6
LeftPercent = 100 - lblPercent(CA).Caption
Do
LeftPercent = LeftPercent - 1
AddTo = Int(Rnd * 4)
lblPercent(AddTo).Caption = lblPercent(AddTo).Caption + 1
Loop Until LeftPercent = 0
For x = 0 To 3
lines(x).Y1 = lines(x).Y2 - ((lines(x).Y2 - lines(x).Y1) / 100 * Val(lblPercent(x).Caption))
lblPercent(x).Caption = lblPercent(x).Caption & "%"
lines(x).Visible = True
lblPercent(x).Visible = True
Next
CanAnswer = True
ElseIf Timer1.Interval = 5000 Then '完結倒數
End
End If
End Sub
'「問朋友」談話內容
Private Sub Timer2_Timer()
Dim QN As String, CA As Byte
If InQuestion < 5 Then
QN = EQ(AnsweringQ).QName
CA = EQ(AnsweringQ).CorrectA
ElseIf InQuestion < 10 Then
QN = NQ(AnsweringQ).QName
CA = NQ(AnsweringQ).CorrectA
Else
QN = HQ(AnsweringQ).QName
CA = HQ(AnsweringQ).CorrectA
End If
Select Case Timer2.Tag
Case 0
lstco.AddItem "(請問" & QN & ")"
Timer2.Interval = 4000
Timer2.Tag = 1
Case 1
lstco.AddItem "讓我想想..."
Timer2.Interval = 1000 * (1 + InQuestion + Int(Rnd * 30))
Timer2.Tag = 2
Case 2
Select Case Int(Rnd * 10)
Case 0, 1
lstco.AddItem "沒錯的話應該是" & ChangeToABCD(Int(Rnd * 4))
Timer2.Tag = 3
Case 2
lstco.AddItem "不知呀!自己試試吧!"
Timer2.Tag = 4
Case Else
lstco.AddItem "沒錯的話應該是" & ChangeToABCD(CA)
Timer2.Tag = 3
End Select
Timer2.Interval = 1000
Case 3
lstco.AddItem "(那我試試吧!謝謝!)"
Timer2.Interval = 3000
Timer2.Tag = 5
Case 4
lstco.AddItem "(那算吧...)"
Timer2.Interval = 3000
Timer2.Tag = 5
Case 5
If lstco.Visible Then
Timer1.Interval = 0
Timer2.Interval = 0
lblLeftTime.Visible = False
lstco.Visible = False
CanAnswer = True
End If
End Select
End Sub
完成畫面
心得:
做了這個報告之後,我覺得程式設計是一種多元化的東西
死死的幾樣函數,屬性,方法,但經由每個工程師的手後,每
個人所呈現的東西盡不相同,就算是一樣的東西,程式碼跟處
理方式不一定都一樣,VISUAL BASIC只是基礎,
不過要學的東西還是很多