程 式 實 習 報 告 電子二甲 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只是基礎, 不過要學的東西還是很多
© Copyright 2026 Paperzz