[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/22(Sun) 13:19
投稿者名:tea
Eメール:
URL :
タイトル:
前回の投稿では解決していませんでした・・・。
またよろしくお願いします。どうも解決してなかったみたいです・・・。

タイマーが00:00秒になった直後からタイマーを5秒間待機させて、その間に
プレイヤーが1回だけファウルカウントされた場合にゲームタイマーを1秒戻
して00:01から再開してカウントダウンさせて再度00:00秒になったら次の
クォーター(時間)移動へしたいのです。

しかし、以下のコードではタイマーを5秒間待機させている最中にファウルカ
ウントが1回あっても何事もなかったように次のクォーターへと進んでしまい
ます。

If vsGameTime.Value = 0 Thenが2回記述されているのが問題なんでしょうか?
1秒戻した後のカウントダウンで00:00秒になった場合にブザー音のコードに
は記述していないのにブザー音がなるのも何故なのか?わかりません。

ブレークポイントなどを使って順を追ってコードを見てもわかりませんでした。
どうか教えてください。
よろしくお願いします。

'タイマー'
Private Sub tmrCountDown_Timer()
Dim i As Integer
Dim l As Integer
Dim k As Integer

    If mp.TimeOutting Then
        '' 更新と終了判断。
        With vsTimeOut(mp.TimeOutintgTeamIndex)
            .Value = .Value - 1
            '50秒経過後のブザー'
            If .Value = 10 Then
                BeepBusy
            End If
            If .Value <> 0 Then Exit Sub
        End With
        
        '' タイムアウトの終了。
        '60秒経過後のブザー'
        BeepBusy
        With mp
            .TimeOutting = False
            resetTimeOutClock .TimeOutintgTeamIndex
            cmdTimeOut(.TimeOutintgTeamIndex).Enabled = Game.Team(.TimeOutintgTeamIndex).CanCurrentQuarterTimeOut
            vsTimeOut(.TimeOutintgTeamIndex).Enabled = False
            tmrCountDown.Enabled = False
        End With
    Else
        '---オプションボタンで非表示を選択した場合---
        If vs24Second.Visible = False Then
            '---動作させない---
            vs24Second.Enabled = False
        Else
            '' 更新。
            With vs24Second
                If 0 < .Value Then
                    .Value = .Value - 1
                End If
            '残り5秒から1秒までNBA風にクロック音  '
                For i = 1 To 5
                    If .Value = i Then
                        Beep7
                    End If
                Next
            End With
        End If
        
        'ゲームタイムタイマー(カウントダウンタイマー)
        With vsGameTime
            If 0 < .Value Then
                .Value = .Value - 1
            End If
        End With
        
        '' クオーターの終了。
        ''  次のクオーターへ表示を更新して、停止。
        If vsGameTime.Value = 0 Then
            
            BeepBuzzer2
           '---ブザービーターに備えて5秒間遅らせる。----
            Delay 5000
            
            For l = 0 To 1
                For k = 1 To 5
                    'ゲームメンバーの誰かがファウルカウントされなかった場合
                    If Game.Team(l).GameMember(k).FoulCount = 0 Then
                        '時間待機はなし
                        Delay 0
                    'ゲームメンバーの誰かが1回だけファウルカウントされた場合
                    ElseIf Game.Team(l).GameMember(k).FoulCount = 1 Then
                        vsGameTime.Enabled = True
                        'ゲームタイマーに1秒加えて00:01にする。
                        vsGameTime.Value = 1
                        'ゲームスタートボタンを非表示にする。
                        cmdGameStart.Enabled = False
                        'ゲーム再開ボタンを表示にする。
                        cmdGamePause.Enabled = True
                        '内側のループ(k)を抜ける。
                        Exit For
                        
                    End If
                Next k
                '外側のループ(l)を抜ける。
                Exit For
            Next l
                
            'ゲームタイマーが00:01秒の時
            Select Case vsGameTime.Value
            Case 0
                '00:00秒になったらカウントダウンタイマーを停止。
                tmrCountDown.Enabled = False
                '次のクォーターへ移る。
                readyNextQuarter
                                    
            Case 1
                'ゲームタイムを一時停止
                pauseGame
                'コマンドボタンに"ゲーム再開"を表示
                cmdGamePause.Caption = sPiResetPuase
                'カウントダウンタイマーを停止しておいてcmdGamePauseボタンを
                'クリックしたらカウントダウンタイマーを再開。
                
            End Select
            
            
            '00:00秒になったらカウントダウンタイマーを停止。
            tmrCountDown.Enabled = False
            '次のクォーターへ移る。
            'readyNextQuarter
                        
            
        '' 24 秒の終了。
        ''  ポーズ。ポーズ再開で、進みます。
        ElseIf vs24Second.Value = 0 Then
            '---オプションボタンで非表示を選択した場合---
            If vs24Second.Visible = False Then
                '---動作させない---
                vs24Second.Enabled = False
            Else
                BeepBuzzer
                resetShotClock
                pauseGame
            End If
        End If
    End If
End Sub

投稿時間:2007/07/24(Tue) 14:52
投稿者名:これ
Eメール:
URL :
タイトル:
Re: 前回の投稿では解決していませんでした・・・。
>             For l = 0 To 1
>                 For k = 1 To 5
         〜 中略 〜
>                 Next k
>                 '外側のループ(l)を抜ける。
>                 Exit For
>             Next l

これだと l = 1の処理がされませんが
大丈夫ですか?

投稿時間:2007/07/24(Tue) 15:11
投稿者名:tea
Eメール:
URL :
タイトル:
Re^2: 前回の投稿では解決していませんでした・・・。
> >             For l = 0 To 1
> >                 For k = 1 To 5
>          〜 中略 〜
> >                 Next k
> >                 '外側のループ(l)を抜ける。
> >                 Exit For
> >             Next l
>
> これだと l = 1の処理がされませんが
> 大丈夫ですか?

回答していただき本当にありがとうございます。
試してみましたが確かにおかしいです・・・。
l = 0の方ばかりで動作検証してましたので気がつきませんでした。

今のコードは以下のようになっていますが、依然としてファウルカウント
があった場合に0秒から01秒にして再度タイマーを起動させて0秒になる
とコードの上部のvsGameTime = 0からコードが読み込まれていきます。
これを回避するにはどうしたらよいでしょうか?
どうか教えてください。
よろしくお願いします。

'ゲームタイムタイマー(カウントダウンタイマー)
        With vsGameTime
            If 0 < .Value Then
                .Value = .Value - 1
            End If
        End With
        
        '' クオーターの終了。
        ''  次のクオーターへ表示を更新して、停止。
        If vsGameTime.Value = 0 Then
            
            BeepBuzzer2
           '---ブザービーターに備えて5秒間遅らせる。----
            Delay 5000
            
            For l = 0 To 1
                For k = 1 To 5
                    'ゲームメンバーの誰かがファウルカウントされなかった場合
                    If Game.Team(l).GameMember(k).FoulCount = 0 Then
                        '時間待機はなし
                        Delay 0
                    'ゲームメンバーの誰かが1回だけファウルカウントされた場合
                    ElseIf Game.Team(l).GameMember(k).FoulCount = 1 Then
                        
                        'ゲームタイマーに1秒加えて00:01にする。
                        vsGameTime.Value = 1
                        '一時停止。
                        pauseGame
                        '内側のループ(k)を抜ける。
                        Exit For
                        
                    End If
                Next k
            Next l
                
            '00:00秒になったらカウントダウンタイマーを停止。
            tmrCountDown.Enabled = False
            '次のクォーターへ移る。
            readyNextQuarter

投稿時間:2007/07/24(Tue) 15:57
投稿者名:これ
Eメール:
URL :
タイトル:
Re^3: 前回の投稿では解決していませんでした・・・。
> 今のコードは以下のようになっていますが、依然としてファウルカウント
> があった場合に0秒から01秒にして再度タイマーを起動させて0秒になる
> とコードの上部のvsGameTime = 0からコードが読み込まれていきます。
> これを回避するにはどうしたらよいでしょうか?

断片的な情報しかないので、ズバリ!これが回答!とはいきませんが
00秒の状態が2回発生する可能性があるようですので
今の00秒が 1回目なのか2回目なのかが判断できるフラグを
用意してあげるのはどうですか?
ファウルカウントの判断は1回目の00秒だけでいいんですよね?

投稿時間:2007/07/24(Tue) 16:47
投稿者名:tea
Eメール:
URL :
タイトル:
Re^4: 前回の投稿では解決していませんでした・・・。
> 断片的な情報しかないので、ズバリ!これが回答!とはいきませんが
> 00秒の状態が2回発生する可能性があるようですので
> 今の00秒が 1回目なのか2回目なのかが判断できるフラグを
> 用意してあげるのはどうですか?
> ファウルカウントの判断は1回目の00秒だけでいいんですよね?

ふくさん、回答していただき本当にありがとうございます。
ご指摘のフラグは既に試してみましたがまったく反応せずでした・・・。
コードの記述に問題があったのかもしれませんので再度挑戦してみます。

投稿時間:2007/07/24(Tue) 16:13
投稿者名:ふく
Eメール:
URL :
タイトル:
Re: 前回の投稿では解決していませんでした・・・。
見当違いでしたらごめんなさい。
解答ではありません。

なんか、難しい処理をしているなぁって感じがします。
やりたいことをもっと簡潔に箇条書きすると良いかと思います。

バスケットのことは詳しくないのでちょっと確認。
タイマーが0になったら5秒まつ、とは
表示が0になってから5秒後がほんとの一区切り?

ファールがあった場合表示1秒足すわけですよね、そのときの5秒の残りはどうなるの?
また、1秒のカウントダウンの始まりはいつ?(ファールがあった瞬間?5秒の後?)

再度0になった場合また5秒まつの?
複数ファールはありえるの?あった場合どう処理するの?

僕は高度なプログラムはできませんので、下記のようなフローで描きますが…

タイマーが0になったら5秒間ファールの有無を監視
無→終了
有→表示を1にし、監視終了
  カウントダウン(最初のカウントダウンとは別ルーチン)
  タイマー0で終了。

こんなかんじでは?

投稿時間:2007/07/24(Tue) 16:42
投稿者名:tea
Eメール:
URL :
タイトル:
Re^2: 前回の投稿では解決していませんでした・・・。
ふくさん、回答していただき本当にありがとうございます。

> タイマーが0になったら5秒まつ、とは
> 表示が0になってから5秒後がほんとの一区切り?

表示が0になってから5秒後がほんとの一区切りではなく基本的には00:00
で終了です。しかし、ゲーム時間の00:00秒直後に得点やファウルがあった
場合に対処するためのもので、得点のほうの処理は問題ないんですが、ファ
ウルがあったの場合は通常は審判側が時間を1秒戻して00:01秒からゲーム
を再開するためです。

> ファールがあった場合表示1秒足すわけですよね、そのときの5秒の残りはどうなるの?
> また、1秒のカウントダウンの始まりはいつ?(ファールがあった瞬間?5秒の後?)

ファウルがあった場合時間を戻すかどうか審判団が話し合いを時間を取るの
で5秒経過後は00:01秒にしてpausegameでタイマーを一時停止状態にしてい
ます。再開はcmdgamePauseボタンをクリックして再開させます。

> 再度0になった場合また5秒まつの?
> 複数ファールはありえるの?あった場合どう処理するの?

再度の00:01秒間で得点が入る可能性があるので、00:00秒で5秒待ちますが
、ファウルの可能性はまずないです。

> タイマーが0になったら5秒間ファールの有無を監視
> 無→終了
> 有→表示を1にし、監視終了
>   カウントダウン(最初のカウントダウンとは別ルーチン)
>   タイマー0で終了。

よいアイデアをいただきありがとうございます。
別ルーチンは自分なりに1度コードを記述して試してみたんですが、
何も起こらなくて00:00で終了するにしても、00:01秒で再開して
も最終的に以下のコードを実行しなければいけないのですが、ファ
ウルがあった場合に00:01秒に出来なくて、そのまま次のクォータ
ーに進んでしまいます。
どうもコードがうまく書けないようで失敗の連続です・・・。

'00:00秒になったらカウントダウンタイマーを停止。
tmrCountDown.Enabled = False
'次のクォーターへ移る。
readyNextQuarter

どうか教えてください。
よろしくお願いします。

投稿時間:2007/07/24(Tue) 17:58
投稿者名:ふく
Eメール:
URL :
タイトル:
Re^3: 前回の投稿では解決していませんでした・・・。
こんなかんじかな?
これくらい判ってる!って怒られそうですが…
常連の皆様厳しい突っ込みはご勘弁を。

さて、
フォームにコマンドボタン3こ、ラベル、タイマーコントロール
をおいてください。

コマンドボタン1:時計スタート
コマンドボタン2:ファール有
コマンドボタン3:次のクウォターへ

Option Explicit
Private CntDown As Single
Private CntBase As Single

Private Sub Command1_Click()
    Command1.Enabled = False
    Timer1.Enabled = True  
End Sub

Private Sub Command2_Click()
    Label1.Caption = "1.0"
    CntDown = 0
    CntBase = 1
    Command1.Enabled = True
    Command2.Enabled = False
    Command3.Enabled = False
End Sub

Private Sub Command3_Click()
    Call CntIni
End Sub

Private Sub Form_Load()
    Timer1.Enabled = False
    Timer1.Interval = 500
    Call CntIni

End Sub
Private Sub CntIni()
    Command1.Enabled = True
    Command2.Enabled = False
    Command3.Enabled = False
    CntBase = 10
    Label1.Caption = "10.0"
End Sub

Private Sub Timer1_Timer()
Dim tmp As Single

    Timer1.Enabled = False
    CntDown = CntDown + 1
    tmp = CntBase - CntDown * 0.5
    Label1.Caption = Format$(tmp, "#0.0")

    If tmp <= 0 Then
        Command2.Enabled = True
        Command3.Enabled = True
        Exit Sub
    End If
    
    Timer1.Enabled = True
End Sub

投稿時間:2007/07/25(Wed) 12:29
投稿者名:tea
Eメール:
URL :
タイトル:
Re^4: 前回の投稿では解決していませんでした・・・。
ふくさん、回答していただき本当にありがとうございます。
試行錯誤してみます。
またわからない事が出てきたら質問させていただきます。


> こんなかんじかな?
> これくらい判ってる!って怒られそうですが…
> 常連の皆様厳しい突っ込みはご勘弁を。
>
> さて、
> フォームにコマンドボタン3こ、ラベル、タイマーコントロール
> をおいてください。
>
> コマンドボタン1:時計スタート
> コマンドボタン2:ファール有
> コマンドボタン3:次のクウォターへ
>
> Option Explicit
> Private CntDown As Single
> Private CntBase As Single
>
> Private Sub Command1_Click()
>     Command1.Enabled = False
>     Timer1.Enabled = True  
> End Sub
>
> Private Sub Command2_Click()
>     Label1.Caption = "1.0"
>     CntDown = 0
>     CntBase = 1
>     Command1.Enabled = True
>     Command2.Enabled = False
>     Command3.Enabled = False
> End Sub
>
> Private Sub Command3_Click()
>     Call CntIni
> End Sub
>
> Private Sub Form_Load()
>     Timer1.Enabled = False
>     Timer1.Interval = 500
>     Call CntIni
>
> End Sub
> Private Sub CntIni()
>     Command1.Enabled = True
>     Command2.Enabled = False
>     Command3.Enabled = False
>     CntBase = 10
>     Label1.Caption = "10.0"
> End Sub
>
> Private Sub Timer1_Timer()
> Dim tmp As Single
>
>     Timer1.Enabled = False
>     CntDown = CntDown + 1
>     tmp = CntBase - CntDown * 0.5
>     Label1.Caption = Format$(tmp, "#0.0")
>
>     If tmp <= 0 Then
>         Command2.Enabled = True
>         Command3.Enabled = True
>         Exit Sub
>     End If
>    
>     Timer1.Enabled = True
> End Sub

投稿時間:2007/07/25(Wed) 16:35
投稿者名:tea
Eメール:
URL :
タイトル:
Re^5: 前回の投稿では解決していませんでした・・・。
ふくさん、これさん、回答していただき本当にありがとうございます。

フラグを立てるという方法で試してみましたが実行すると00:00秒後に
ファウルカウントがあった場合に00:01秒と表示されるようになり1歩
前進しました。
しかし、この00:01秒から再開すると00:00秒になった後に次のクォー
ター(2nd)が表示されずに再び00:01秒と表示され再開すると00:00
秒という状態が延々と繰り返されてしまいます・・・。
下記はフラグを追加したコードです。
どうか教えてください。
よろしくお願いします。

'タイマー'
Private Sub tmrCountDown_Timer()
Dim i As Integer
Dim l As Integer
Dim k As Integer
Dim flag As Boolean
    
    'フラグを設置
    flag = False
    
    If mp.TimeOutting Then
        '' 更新と終了判断。
        With vsTimeOut(mp.TimeOutintgTeamIndex)
            .Value = .Value - 1
            '50秒経過後のブザー'
            If .Value = 10 Then
                BeepBusy
            End If
            If .Value <> 0 Then Exit Sub
        End With
        
        '' タイムアウトの終了。
        '60秒経過後のブザー'
        BeepBusy
        With mp
            .TimeOutting = False
            resetTimeOutClock .TimeOutintgTeamIndex
            cmdTimeOut(.TimeOutintgTeamIndex).Enabled = Game.Team(.TimeOutintgTeamIndex).CanCurrentQuarterTimeOut
            vsTimeOut(.TimeOutintgTeamIndex).Enabled = False
            tmrCountDown.Enabled = False
        End With
    Else
        '---オプションボタンで非表示を選択した場合---
        If vs24Second.Visible = False Then
            '---動作させない---
            vs24Second.Enabled = False
        Else
            '' 更新。
            With vs24Second
                If 0 < .Value Then
                    .Value = .Value - 1
                End If
            '残り5秒から1秒までNBA風にクロック音  '
                For i = 1 To 5
                    If .Value = i Then
                        Beep7
                    End If
                Next
            End With
        End If
        
        'ゲームタイムタイマー(カウントダウンタイマー)
        With vsGameTime
            If 0 < .Value Then
                .Value = .Value - 1
            End If
        End With
        
        '' クオーターの終了。
        ''  次のクオーターへ表示を更新して、停止。
        If vsGameTime.Value = 0 Then
            'counter = counter + 1
            
            BeepBuzzer2
           '---ブザービーターに備えて5秒間遅らせる。----
            Delay 5000
            
            For l = 0 To 1
                For k = 1 To 5
                    'ゲームメンバーの誰かがファウルカウントされなかった場合
                    If Game.Team(l).GameMember(k).FoulCount = 0 Then
                        '時間待機はなし
                        Delay 0
                        
                    'ゲームメンバーの誰かが1回だけファウルカウントされた場合
                    ElseIf Game.Team(l).GameMember(k).FoulCount = 1 Then
                        'ゲームタイマーに1秒加えて00:01にする。
                        vsGameTime.Value = 1
                        '一時停止。
                        pauseGame
                        'フラグを立てる。
                        flag = True
                        '内側のループ(k)を抜ける。
                        Exit For
                    End If
                Next k
            Next l
                
            'フラグがTrueの場合
            If flag = True Then
                tmrCountDown.Enabled = False
                '時間が0秒になった時
                If vsGameTime.Value = 0 Then
                    '次のクォーターへ移る。
                    readyNextQuarter
                End If
            Else
                '00:00秒になったらカウントダウンタイマーを停止。
                tmrCountDown.Enabled = False
                '次のクォーターへ移る。
                readyNextQuarter
            End If
                      
        '' 24 秒の終了。
        ''  ポーズ。ポーズ再開で、進みます。
        ElseIf vs24Second.Value = 0 Then
            '---オプションボタンで非表示を選択した場合---
            If vs24Second.Visible = False Then
                '---動作させない---
                vs24Second.Enabled = False
            Else
                BeepBuzzer
                resetShotClock
                pauseGame
            End If
        End If
    End If
End Sub

投稿時間:2007/07/25(Wed) 17:52
投稿者名:
Eメール:
URL :
タイトル:
Re^6: 前回の投稿では解決していませんでした・・・。
横槍で失礼します。
ファウルカウントの判定に問題がありそうな感じですね。

1回目は00:00になってから5秒待機中にファウルがあったか、
2回目以降は追加された1秒+5秒待機中の間にファウルがあったかを判定するべきでは?

今のソースだと、ゲーム中に誰かが1回でもファウルしてたら延々と続いてしまいそうな…。

00:00から00:01にした時点で全員のファウルカウントをクリアするのも方法だとは思いますが、
それだと再開の度に通算5回以上ファウルできちゃうんであまりよろしくないかな?

見当違いだったらごめんなさいね。

投稿時間:2007/07/25(Wed) 18:41
投稿者名:tea
Eメール:
URL :
タイトル:
Re^7: 前回の投稿では解決していませんでした・・・。
> 横槍で失礼します。
> ファウルカウントの判定に問題がありそうな感じですね。
>
> 1回目は00:00になってから5秒待機中にファウルがあったか、
> 2回目以降は追加された1秒+5秒待機中の間にファウルがあったかを判定するべきでは?
>
> 今のソースだと、ゲーム中に誰かが1回でもファウルしてたら延々と続いてしまいそうな…。
>
> 00:00から00:01にした時点で全員のファウルカウントをクリアするのも方法だとは思いますが、
> それだと再開の度に通算5回以上ファウルできちゃうんであまりよろしくないかな?

琴さん、回答本当にありがとうございます。

おっしゃることはもっともなんですが、気になる点は最初の00:00秒ではブザー音が
なるようにしていますが、00:01秒にして再開後に00:00秒になった場合ブザー音は
ならないようコードを記述したつもりなんですが、なぜかブザー音がします・・・。
どう考えてみてもフラグの中のvsGameTime = 0になった場合に記述したコードの上に
あるvsGameTime = 0が作動しているようなんです。
そのために00:01から00:00秒を延々と繰り返すようです。

> 2回目以降は追加された1秒+5秒待機中の間にファウルがあったかを判定するべきでは?

だんだんわからなくなってきました・・・。

回避方法がわかりません。
どうか教えてください。
よろしくお願いします。

投稿時間:2007/07/25(Wed) 21:05
投稿者名:じぇふ
Eメール:
URL :
タイトル:
Re^8: 前回の投稿では解決していませんでした・・・。
>
> だんだんわからなくなってきました・・・。
>
横から失礼します。
やりたいことがわからなくなってきたようですね。
こんなときこそフローチャートの出番かと思います。

どのようなものを作りたいのか、また、どのような条件分岐が必要か。

頭の中だけで考えると、整理したつもりで混乱していることが多々ありますよ。

投稿時間:2007/07/26(Thu) 14:02
投稿者名:
Eメール:
URL :
タイトル:
Re^9: 前回の投稿では解決していませんでした・・・。
自分だったらどう作るかなぁ…と考えてみました。

○カウントダウン処理
 ・カウントダウンの処理を記述。
 ・00:00になったらカウントダウンを停止させて総ファウル数の取得。
  5秒待機後にクォーター終了処理を実行。

○クォーター終了処理
 ・総ファウル数の取得。
 ・00:00時点との総ファウル数に差異があれば00:01としてカウントダウン再開。
 ・ファウル数が同数なら次のクォーターへ。もしくはゲーム終了?

○総ファウル数取得処理
 ・両チーム全選手のファウル数をカウントし、総数を返す。


こんな感じでやりたいことを挙げていって、ソレに細かい処理の部分を肉付けしていけば
フローチャートは簡単に書けると思いますよ。

クォーター終了処理と総ファウル数の取得処理を外に出してみました。
どちらもカウントダウンの度に処理するものでもありませんし、
絶対にカウントダウン処理の中に書かなければならない理由も無いと思うので。

ファウル数取得は関数化させずに、ファウル発生イベント時に
ゲーム中のトータルファウル数を納める変数に+1する形でもOKだと思います。
関数だと2チーム5人分のみカウントするとメンバーチェンジに対応できないので
出場選手全員分をカウントする必要がありますね。

投稿時間:2007/07/26(Thu) 17:32
投稿者名:tea
Eメール:
URL :
タイトル:
Re^10: 前回の投稿では解決していませんでした・・・。
琴さん、回答本当にありがとうございます。
下記の助言は初心者に毛がは得たようなレベルの私には本当に助かります。

助言をいただいている「ふくさん」も同様な意見をお持ちのようなので
下記の項目を踏まえつつフローチャートを書いてみます。

> 自分だったらどう作るかなぁ…と考えてみました。
>
> ○カウントダウン処理
>  ・カウントダウンの処理を記述。
>  ・00:00になったらカウントダウンを停止させて総ファウル数の取得。
>   5秒待機後にクォーター終了処理を実行。
>
> ○クォーター終了処理
>  ・総ファウル数の取得。
>  ・00:00時点との総ファウル数に差異があれば00:01としてカウントダウン再開。
>  ・ファウル数が同数なら次のクォーターへ。もしくはゲーム終了?
>
> ○総ファウル数取得処理
>  ・両チーム全選手のファウル数をカウントし、総数を返す。
>
>
> こんな感じでやりたいことを挙げていって、ソレに細かい処理の部分を肉付けしていけば
> フローチャートは簡単に書けると思いますよ。
>
> クォーター終了処理と総ファウル数の取得処理を外に出してみました。
> どちらもカウントダウンの度に処理するものでもありませんし、
> 絶対にカウントダウン処理の中に書かなければならない理由も無いと思うので。
>
> ファウル数取得は関数化させずに、ファウル発生イベント時に
> ゲーム中のトータルファウル数を納める変数に+1する形でもOKだと思います。
> 関数だと2チーム5人分のみカウントするとメンバーチェンジに対応できないので
> 出場選手全員分をカウントする必要がありますね。

投稿時間:2007/07/26(Thu) 13:31
投稿者名:ふく
Eメール:
URL :
タイトル:
Re^6: 前回の投稿では解決していませんでした・・・。
タイマーイベントが複数おきているでは?
下記のようにプロージャに入ったら
動作をとめて、出るときに動作させたらいかがでしょうか?

処理分時間精度が落ちますが、きっと問題ないでしょう。
あるならVBでは作らないはずですから。。。

Private Sub Timer1_Timer()
    Timer1.Enabled = False
    '
    '   処理
    '
    Timer1.Enabled = True
End Sub

投稿時間:2007/07/26(Thu) 15:18
投稿者名:tea
Eメール:
URL :
タイトル:
Re^7: 前回の投稿では解決していませんでした・・・。
ふくさん、回答していただきほんとうにありがとうございます。

> タイマーイベントが複数おきているでは?

まさにその通りだと思います。

> 下記のようにプロージャに入ったら
> 動作をとめて、出るときに動作させたらいかがでしょうか?
> 処理分時間精度が落ちますが、きっと問題ないでしょう。
> あるならVBでは作らないはずですから。。。
>
> Private Sub Timer1_Timer()
>     Timer1.Enabled = False
>     '
>     '   処理
>     '
>     Timer1.Enabled = True
> End Sub

早速試しましたが、結果は以前と何も変わらない結果でした・・・。

理解できないのは何故下に記述したvsGameTime = 0に到達したら上に記述した
vsGameTime = 0が作動するのか?なんですよね。
こういうものなんでしょうか?
それともやはりコードの記述の仕方に問題があるんでしょうか?
どうか教えてください。
よろしくお願いします。

投稿時間:2007/07/26(Thu) 16:37
投稿者名:ふく
Eメール:
URL :
タイトル:
Re^8: 前回の投稿では解決していませんでした・・・。
フラグはモジュールレベルか
static で宣言しないとまずくないですか?

タイマーイベントが起こるたびに初期化されますよ。

インターバルは1000なのかな?


> 理解できないのは何故下に記述したvsGameTime = 0に到達したら上に記述した
> vsGameTime = 0が作動するのか?なんですよね。

上と下?ちょっと意味不明です。

> こういうものなんでしょうか?

そういうコードです。

> それともやはりコードの記述の仕方に問題があるんでしょうか?
> どうか教えてください。

できることなら仕様から検討しなおしたほうが良いかと…

琴さんもおっしゃるように00:00になってからのプロージャを
考えたほうが良いかと、
タイマーイベントは勝手にイベントが起きますから、
必要最小限のコードにしないと僕は制御不能です。

また、イレギュラーコードをレギュラーコードにずらずら書くのは
診にくいですよ。
ぼくはイレギュラーな部分はcallで呼びます。

投稿時間:2007/07/26(Thu) 17:14
投稿者名:tea
Eメール:
URL :
タイトル:
Re^9: 前回の投稿では解決していませんでした・・・。
ふくさん、回答していただき本当にありがとうございます。

ご指摘していただいたstatic宣言を行いました。

インターバルは1000です。

vsGameTime = 0の記述がプロシージャ内に2箇所あり、1つは
クォーター終了時のvsGameTime = 0、もう1つはファウルがあ
った場合に再度00:01秒からカウントダウンした後の00:00
秒になった場合のvsGameTime = 0を意味しています。
説明不足ですいません。

コードは気が付けばかなり長くなってきましたので、これから
ふくさんのおっしゃる通りcallにしたいと思います。

また、仕様から変更したほうがいいのでは?というご指摘ですが、
皆さんの助言もあってようやくここまでたどり着き、あとは
readyNextQuarterへ進めばいいという、ただそれだけなのに・・
・という悔しい気持ちでいっぱいですが、どうしようもないみた
いですので見直しを行いたいと思います。

> フラグはモジュールレベルか
> static で宣言しないとまずくないですか?
>
> タイマーイベントが起こるたびに初期化されますよ。
>
> インターバルは1000なのかな?
>
>
> > 理解できないのは何故下に記述したvsGameTime = 0に到達したら上に記述した
> > vsGameTime = 0が作動するのか?なんですよね。
>
> 上と下?ちょっと意味不明です。
>
> > こういうものなんでしょうか?
>
> そういうコードです。
>
> > それともやはりコードの記述の仕方に問題があるんでしょうか?
> > どうか教えてください。
>
> できることなら仕様から検討しなおしたほうが良いかと…
>
> 琴さんもおっしゃるように00:00になってからのプロージャを
> 考えたほうが良いかと、
> タイマーイベントは勝手にイベントが起きますから、
> 必要最小限のコードにしないと僕は制御不能です。
>
> また、イレギュラーコードをレギュラーコードにずらずら書くのは
> 診にくいですよ。
> ぼくはイレギュラーな部分はcallで呼びます。

投稿時間:2007/07/27(Fri) 16:27
投稿者名:tea
Eメール:
URL :
タイトル:
Re^10: 前回の投稿では解決していませんでした・・・。
ご指示いただいたフローチャートを下手なりに書いて下記コードを
記述してみました。

結果はFor文( l = 1 to 6 で1クォーターから再延長戦までで計6
)を入れると、ゲーム終了後にファウルを1つ追加しても自動的に次
のクォーターへ進んでしまいます。

ただFor文をはずして.QuarterFoulCount(l)に1クォーターの(1)を
入れて実行して第1クォーターのみ試してみると第1クォーター終了
後の5秒待機期間中にファウルカウントがあった場合は正常に動作し
ました。

For文をはずして第1クォーターのみですが正常動作が可能になった事
は大変うれしいのですが、第1クォーターから再延長戦までのコードを
どう記述するか?で困っています。
下記コードはFor文の前に'を入れています。
どうか教えてください。
よろしくお願いします。

'クォーター終了後の5秒間待機中の処理
Private Function AfterQuarter()

Dim i As Integer
Dim h As Integer
Dim l As Integer

    '' クオーターの終了。
    ''  次のクオーターへ表示を更新して、停止。
    If vsGameTime.Value = 0 Then
        '1stクォーターからダブルオーバータイム(2OT)まで
        'For l = 1 To 6
            'Aチームの1クォーターのチーム全員のファウル数を変数に入れる。
            i = Game.Team(0).QuarterFoulCount(1)
            'Bチームの1クォーターのチーム全員のファウル数を変数に入れる。
            h = Game.Team(1).QuarterFoulCount(1)
                
        BeepBuzzer2
        '---ブザービーターに備えて5秒間遅らせる。----
        Delay 5000
            
        '5秒待機後のチーム全員のファウル数を比較して同じ場合は次のクォーターへ
        If i = Game.Team(0).QuarterFoulCount(1) Then
            If h = Game.Team(1).QuarterFoulCount(1) Then
                '次のクォーターへ
                readyNextQuarter
                'ループを抜ける。
                'Exit For
            End If
        End If
        
        '5秒待機後のチーム全員のファウル数を比較してファウル数が
        '合わない場合は1秒戻して再開。
        If i <> Game.Team(0).QuarterFoulCount(1) Then
            If h = Game.Team(1).QuarterFoulCount(1) Then
                vsGameTime.Value = 1
            End If
        ElseIf h <> Game.Team(1).QuarterFoulCount(1) Then
            If i = Game.Team(0).QuarterFoulCount(1) Then
                vsGameTime.Value = 1
            End If
        ElseIf h <> Game.Team(1).QuarterFoulCount(1) Then
            If i <> Game.Team(0).QuarterFoulCount(1) Then
                vsGameTime.Value = 1
            End If
        End If
        'Next l
    
        '一時停止。
        pauseGame
End if

投稿時間:2007/07/27(Fri) 17:10
投稿者名:これ
Eメール:
URL :
タイトル:
Re^11: 前回の投稿では解決していませんでした・・・。
気が付くとずいぶん伸びてますね。

AfterQuarter()は各クォーター終了後の処理と書いてありながら
この中で1〜6回ループする意味がわかりません。
各クォーター向けのループは別にあるのではないでしょうか?
それともここがメインのループ?

Forループをはずすとうまくながれてるのですから
ここへは現在のクォーターが入った変数なりを渡して
1つのクォーターだけに対する終了判断にしては?

書かれたフローを見直してみてはいかがでしょう?

投稿時間:2007/07/27(Fri) 17:14
投稿者名:
Eメール:
URL :
タイトル:
Re^11: 前回の投稿では解決していませんでした・・・。
処理を見るにカウントが00:00になった後の処理だと思うので、
その中でクォーター数のループはおかしいですね。

1クォーター分のカウントダウン処理を最長6回ループさせて、
そのループの最後で00:00になったときに5秒待機中の処理を呼び出す事になると思います。


・・・内容被っちゃいました(笑)

投稿時間:2007/07/27(Fri) 19:40
投稿者名:tea
Eメール:
URL :
タイトル:
ようやく出来ました。
これさん、ふくさん、琴さん、じぇふさん、これまで回答していただき
本当にありがとうございました。
ようやく出来ました。
7日間もこれだけに悩みました・・・。
今後もよろしくお願いします。

完成したコードは下記です。

Private Function AfterQuarter()

Dim i As Integer
Dim h As Integer
Dim l As Integer

l = Game.Quarter

    '' クオーターの終了。
    ''  次のクオーターへ表示を更新して、停止。
    If vsGameTime.Value = 0 Then
            'Aチームの1クォーターのチーム全員のファウル数を変数に入れる。
            i = Game.Team(0).QuarterFoulCount(l)
            'Bチームの1クォーターのチーム全員のファウル数を変数に入れる。
            h = Game.Team(1).QuarterFoulCount(l)
                
        BeepBuzzer2
        '---ブザービーターに備えて5秒間遅らせる。----
        Delay 5000
            
        '5秒待機後のチーム全員のファウル数を比較して同じ場合は次のクォーターへ
        If i = Game.Team(0).QuarterFoulCount(l) Then
            If h = Game.Team(1).QuarterFoulCount(l) Then
                '次のクォーターへ
                readyNextQuarter
            End If
        End If
        
        '5秒待機後のチーム全員のファウル数を比較してファウル数が
        '合わない場合は1秒戻して再開。
        If i <> Game.Team(0).QuarterFoulCount(l) Then
            If h = Game.Team(1).QuarterFoulCount(l) Then
                vsGameTime.Value = 1
            End If
        ElseIf h <> Game.Team(1).QuarterFoulCount(l) Then
            If i = Game.Team(0).QuarterFoulCount(l) Then
                vsGameTime.Value = 1
            End If
        ElseIf h <> Game.Team(1).QuarterFoulCount(l) Then
            If i <> Game.Team(0).QuarterFoulCount(l) Then
                vsGameTime.Value = 1
            End If
        End If
          
        '一時停止。
        pauseGame
    End If
End Function