2017-01-03 7 views
-2

私はゲームを終了し、スコアを表示するために別のタイマークラスを使用しますが、数秒後に同じスコアで前のゲームに戻ります。これは私が不足しているタイマのためです。画面上のゲームが表示されたら、待つTask.Delay()をどうやって止めますか? C#で

ゲームオーバー画面が表示されたら、これらのタイマーを停止するにはどうすればよいですか?

私は 'await Task.Delay(1000)'を使って数字を変更し、一定時間後にそれを元に戻します。私はまた、画面上でゲームを実行する別のTimerクラスを持っています。

using PetrolStationGame; 
using System; 
using System.Threading; 
using System.Threading.Tasks; 


namespace ConsoleApplication1 
{ 


    internal class Program 
    { 
     internal static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; // Arrays for each pump 
     internal static int choice; //Dictates player choice 

     internal static int flag = 0; 

     internal static int CarsWaiting = 0; 
     internal static int CarsServiced = 0; 
     internal static int FuelLitresSold = 0; 
     internal static decimal IncomeMade = 0; 
     internal static int Fuel = 15; 
     internal static decimal PetrolPrice = 2; 
     internal static decimal Commission = 0; 
     //internal static double CommissionRate = 0.1; 
     //private static object timer; 





     internal static void petrol() 
     { 

      EndGameTimer.endgametimer(); 
      //RefreshTimer.refreshtimer(); 
      var tokenSource2 = new CancellationTokenSource(); 
      CancellationToken ct = tokenSource2.Token; 

      do 
      { 
       PetrolStationGame(); //Loads petrol station pumps 
       choice = int.Parse(Console.ReadLine()); 
       CarsWaitingTimer.carswaitingtimer(); 

       if (arr[choice] != 'B') 
       { 
        ServeCar(); 

       } 
       else 
       { 
        Console.WriteLine("The pump {0} is already being used", choice); 
        Console.WriteLine("Press Enter to Continue"); 
        Console.ReadLine(); 

       } 

       if (Console.KeyAvailable == false) 
       { 
        Thread.Sleep(400); 
       } 


       else 
       { 
        Thread.Sleep(400); 
       } 




      } while (flag != 1); 

      PetrolStationGame(); 
      Console.Clear(); 

      if (flag == 1) 
      { 
       Console.WriteLine("Game Over"); 
      } 
      else 
      { 
       Console.WriteLine("Draw"); 
      } 
      Console.ReadLine(); 
     } 


     internal static async void ServeCar() 
     { 
      var tokenSource2 = new CancellationTokenSource(); 
      CancellationToken ct = tokenSource2.Token; 

      { 

       int tmp = choice; 
       arr[tmp] = 'B'; 
       CarsServiced++; 
       FuelLitresSold = Fuel + FuelLitresSold; 
       IncomeMade = FuelLitresSold * PetrolPrice; 

       Commission = IncomeMade/100; 
       await Task.Delay(15000); // Time delay 
       arr[tmp] = (char)(tmp + 48); 
       PetrolStationGame(); 
       Console.WriteLine("A pump has become free!"); 



      } 
      tokenSource2.Cancel(); 
     } 

     internal static void SpawnCar() 
     { 


      CarsWaiting++; 

     } 



     internal static void PetrolStationGame() 
     { 

      Console.Clear(); 
      Console.WriteLine("Cars Serviced {0}", CarsServiced); 
      Console.WriteLine("Litres of Fuel Sold {0}", FuelLitresSold); 
      Console.WriteLine("Income made: £{0}", IncomeMade); 
      Console.WriteLine("Commission: £{0}", Commission); 
      Console.WriteLine("Cars Waiting {0}", CarsWaiting); 
      Console.WriteLine("    "); 
      Console.WriteLine(" {0} {1} {2}", arr[1], arr[2], arr[3]); 
      Console.WriteLine(" "); 
      Console.WriteLine("    "); 
      Console.WriteLine(" {0} {1} {2}", arr[4], arr[5], arr[6]); 
      Console.WriteLine(" "); 
      Console.WriteLine("    "); 
      Console.WriteLine(" {0} {1} {2}", arr[7], arr[8], arr[9]); 
      Console.WriteLine("    "); 

     } 

     internal static async void GameOver() 
     { 

      Console.Clear(); 
      Console.WriteLine("GAME OVER!"); 
      Console.WriteLine(""); 
      Console.WriteLine("Cars Serviced {0}", CarsServiced); 
      Console.WriteLine("Litres of Fuel Sold {0}", FuelLitresSold); 
      Console.WriteLine("Income made: £{0}", IncomeMade); 
      Console.WriteLine("Commission Made: £{0}", Commission); 
      Console.WriteLine("Cars Left Waiting {0}", CarsWaiting); 
      Console.WriteLine(""); 
      Console.WriteLine("Game Will Close in 5 seconds"); 




     } 
    } 
} 
+0

'Timer.Stop' ???実行している問題についてより明確に理解できますか? – BradleyDotNET

+0

私は 'await Task.Delay(1000)'を使って数字を変更し、一定時間後にそれを元に戻します。私はまた、画面上でゲームを実行する別個のTimerクラスを持っています。問題は、タイマークラスが消えて画面が表示され、 'await Task.Delay'タイマーが終了して実行を継続するときです。 – ShadowRiot

+0

fwiw、私はそのタイマーを呼び出さないでしょう。いずれにしても、遅れてゲームが終了したかどうかを確認することはできませんか?つまり、技術的には競争条件がありますが、(プログラムの設計などの面では)おそらく問題ではないようです。 – BradleyDotNET

答えて

1

あなたが取り消すことができます:Timerクラスが消灯し、画面を表示し、タイマー終了していないと

私のコードを実行し続け「Task.Delay待つ」をするときの問題は、次のようにですタスク(Task.Delayを含む)。詳細な説明はhereです。

その記事から、あなたはこのようなキャンセルトークンを作成します。

var tokenSource2 = new CancellationTokenSource(); 
CancellationToken ct = tokenSource2.Token; 

あなたはその後、Task.Delayにトークンを渡すことができます。これらをどこかに保存して、タスクをキャンセルできるようにしてください。

+0

ありがとう、私はちょうど私のコードにそれを入れる方法を理解しようとしています:P – ShadowRiot

+0

タスクのキャンセルは* cooperative *です。この場合、 'Task.Delay'はあなたと協力します。あなたが遅れから戻った後にゲームの終了フラグをチェックするだけです。 – BradleyDotNET

+0

CancellationTokenに 'Cancel'メソッドがありません –

関連する問題