[英]Stopwatch c# game
我正在嘗試在 C# 中創建 MAZE 游戲,我對制作秒表有點困惑(我希望它從關卡的開始開始並在獲勝時停止)來打印關卡的時間。 我不明白在哪里以及如何正確添加它。 所以這是我的主要游戲邏輯。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace Labyrinth
{
class Level
{
private Field gameField;
private Player player;
public Thread keyThread;
public PressedKey key;
public enum PressedKey
{
Left, Right, Up, Down, Fire, None
}
public bool Game;
public Level(int level)
{
Console.CursorVisible = false;
Game = true;
StartThread();
new LevelLoader(level).LoadField(out gameField, out player);
}
public void UpdateField()
{
PlayerAction();
PutCharactersOnField();
Thread.Sleep(50);
}
private void PutCharactersOnField()
{
for (int y = 0; y < gameField.Height; y++)
{
for (int x = 0; x < gameField.Width; x++)
{
if (!(gameField[x, y] is Wall) && !((gameField[x, y] is Key)) && !((gameField[x, y] is Door)))
{
gameField[x, y] = new Empty();
}
}
}
gameField[player.X, player.Y] = player;
}
private void PlayerAction()
{
int dx = 0, dy = 0;
switch (key)
{
case PressedKey.Up:
dy = -1;
break;
case PressedKey.Down:
dy = 1;
break;
case PressedKey.Left:
dx = -1;
break;
case PressedKey.Right:
dx = 1;
break;
}
player.Rotate(dx, dy);
if (gameField.CanMakeStep(player.X + dx, player.Y + dy))
{
player.MakeStep(dx, dy);
key = PressedKey.None;
}
}
public void PrintLevel()
{
gameField.Print();
player.Draw();
LivesMessage();
if (Door.count == 0)
{
Win();
};
}
private void Win()
{
Game = false;
keyThread.Interrupt();
Console.Beep();
Console.Clear();
Console.WriteLine("COngrats! You win");
Console.ReadKey();
Help WinMenu = new Help();
WinMenu.Menu();
}
private void ConsoleMessage(int x, int y, string message)
{
Console.SetCursorPosition(x, y);
Console.Write(message);
}
private void LivesMessage()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.BackgroundColor = ConsoleColor.Black;
ConsoleMessage(0, gameField.Height + 1, "Doors Left: " + Door.count);
ConsoleMessage(0, gameField.Height + 2, "Keys Left: " + Key.count);
}
private void StartThread()
{
key = PressedKey.None;
keyThread = new Thread(KeysInput);
keyThread.Start();
}
private void KeysInput()
{
while (Game)
{
var currntKey = Console.ReadKey(true);
switch (currntKey.Key)
{
case ConsoleKey.W:
key = PressedKey.Up;
break;
case ConsoleKey.UpArrow:
key = PressedKey.Up;
break;
case ConsoleKey.A:
key = PressedKey.Left;
break;
case ConsoleKey.LeftArrow:
key = PressedKey.Left;
break;
case ConsoleKey.D:
key = PressedKey.Right;
break;
case ConsoleKey.RightArrow:
key = PressedKey.Right;
break;
case ConsoleKey.S:
key = PressedKey.Down;
break;
case ConsoleKey.DownArrow:
key = PressedKey.Down;
break;
default:
key = PressedKey.None;
break;
}
}
}
}
}
我對這樣的主題很陌生,所以我會很感激任何幫助。 我可以在哪里以及如何添加秒表? 我應該做一個秒表分離 class 還是只是某種方法?
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 10; i++)
Console.ReadKey();
Console.WriteLine();
stopWatch.Stop();]
TimeSpan ts = stopWatch.Elapsed;
Console.WriteLine($"{ts.Seconds:00}:{ts.Milliseconds:00}");
Console.ReadKey();
您根本不應該為此使用Stopwatch
,因為 class 確實用於診斷(線索是它的命名空間System.Diagnostics
)。
您對玩家玩游戲需要多長時間感興趣,這可以使用DateTime
來完成。 您可以將其中 2 個與Subtract
進行比較,它會返回一個TimeSpan
實例 - 您可以使用它來確定玩家玩游戲所花費的秒數/分鍾數/時間。
在創建關卡時存儲一個startTime
(我假設這是游戲“開始”的時間點)
private DateTime startTime;
public Level(int level)
{
Console.CursorVisible = false;
Game = true;
StartThread();
new LevelLoader(level).LoadField(out gameField, out player);
startTime = DateTime.UtcNow;
}
然后當游戲結束時將其與DaweTime.Now
進行比較(我假設這是在Win
內部,但可能在其他地方):
private void Win()
{
Game = false;
keyThread.Interrupt();
Console.Beep();
Console.Clear();
var timeTaken = DateTime.UtcNow.Subtract(startTime);
Console.WriteLine($"You took {timeTaken.TotalSeconds} seconds");
Console.WriteLine("COngrats! You win");
Console.ReadKey();
Help WinMenu = new Help();
WinMenu.Menu();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.