私はゲームを終了し、スコアを表示するために別のタイマークラスを使用しますが、数秒後に同じスコアで前のゲームに戻ります。これは私が不足しているタイマのためです。画面上のゲームが表示されたら、待つ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");
}
}
}
'Timer.Stop' ???実行している問題についてより明確に理解できますか? – BradleyDotNET
私は 'await Task.Delay(1000)'を使って数字を変更し、一定時間後にそれを元に戻します。私はまた、画面上でゲームを実行する別個のTimerクラスを持っています。問題は、タイマークラスが消えて画面が表示され、 'await Task.Delay'タイマーが終了して実行を継続するときです。 – ShadowRiot
fwiw、私はそのタイマーを呼び出さないでしょう。いずれにしても、遅れてゲームが終了したかどうかを確認することはできませんか?つまり、技術的には競争条件がありますが、(プログラムの設計などの面では)おそらく問題ではないようです。 – BradleyDotNET