Old project. New ones to come.
This commit is contained in:
parent
b11182136f
commit
4147a29fdc
@ -27,3 +27,7 @@ I have about 1-2 weeks for each project. Check the Git commits for specific date
|
|||||||
- Data transfer is automatically encrypted behind the scenes (though the server decrypts it when it gets it).
|
- Data transfer is automatically encrypted behind the scenes (though the server decrypts it when it gets it).
|
||||||
- Allows for as many people to connect as need be.
|
- Allows for as many people to connect as need be.
|
||||||
- The client is somewhat janky, but the server has zero issues from my testing.
|
- The client is somewhat janky, but the server has zero issues from my testing.
|
||||||
|
- TypingTest
|
||||||
|
- A small game I made in like 2 hours. Using a list of words, it picks one at random and the user has to type it out.
|
||||||
|
- It has a one-minute timer, and highlights the letters you got right.
|
||||||
|
- Shows results as characters per minute, words per minute, and accuracy percentage at the end.
|
||||||
|
|||||||
25
TypingTest/TypingTest.sln
Normal file
25
TypingTest/TypingTest.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.11.35327.3
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypingTest", "TypingTest\TypingTest.csproj", "{24319734-E4AB-4E2F-B0DA-EFAA2355BC45}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{24319734-E4AB-4E2F-B0DA-EFAA2355BC45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{24319734-E4AB-4E2F-B0DA-EFAA2355BC45}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{24319734-E4AB-4E2F-B0DA-EFAA2355BC45}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{24319734-E4AB-4E2F-B0DA-EFAA2355BC45}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {43E3DBB7-D6A6-4E07-813F-8922D2A0AAB2}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
133
TypingTest/TypingTest/Program.cs
Normal file
133
TypingTest/TypingTest/Program.cs
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/**********722871**********
|
||||||
|
* Date: 10/25/2024
|
||||||
|
* Programmer: Kyle Gilbert
|
||||||
|
* Program Name: TypingTest
|
||||||
|
* Program Description: Gives you a real typing challenge with obscure and large words.
|
||||||
|
**************************/
|
||||||
|
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace TypingTest;
|
||||||
|
|
||||||
|
public static class Program
|
||||||
|
{
|
||||||
|
public static void Main()
|
||||||
|
{
|
||||||
|
Console.WriteLine("Start typing to begin.\n");
|
||||||
|
|
||||||
|
string dataset = PickRandomDataset();
|
||||||
|
Console.WriteLine("\x1b[90m" + dataset);
|
||||||
|
Console.SetCursorPosition(0, 2);
|
||||||
|
|
||||||
|
bool cancel = false;
|
||||||
|
Console.CancelKeyPress += (o, e) =>
|
||||||
|
{
|
||||||
|
if (!cancel)
|
||||||
|
{
|
||||||
|
e.Cancel = true;
|
||||||
|
cancel = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
Console.Title = "";
|
||||||
|
bool started = false;
|
||||||
|
DateTime startTime = DateTime.MinValue;
|
||||||
|
DateTime endTime = DateTime.MaxValue;
|
||||||
|
TimeSpan timer = TimeSpan.FromMinutes(1);
|
||||||
|
int charsTyped = 0, mistakesTyped = 0, wordsTyped = 0,
|
||||||
|
lenTyped = 0;
|
||||||
|
CancellationTokenSource token = new();
|
||||||
|
while (index < dataset.Length && DateTime.Now < endTime && !cancel)
|
||||||
|
{
|
||||||
|
ConsoleKeyInfo key = Console.ReadKey(true);
|
||||||
|
if (!started)
|
||||||
|
{
|
||||||
|
startTime = DateTime.Now;
|
||||||
|
endTime = startTime + timer;
|
||||||
|
started = true;
|
||||||
|
DisplayTimer(timer, token.Token);
|
||||||
|
}
|
||||||
|
char expected = dataset[index];
|
||||||
|
if (key.KeyChar == expected)
|
||||||
|
{
|
||||||
|
lock (LOCK)
|
||||||
|
{
|
||||||
|
int prevLeft = Console.CursorLeft;
|
||||||
|
Console.Write("\x1b[92m" + expected);
|
||||||
|
if (prevLeft == Console.WindowWidth - 1) Console.WriteLine();
|
||||||
|
}
|
||||||
|
charsTyped++;
|
||||||
|
lenTyped++;
|
||||||
|
index++;
|
||||||
|
if (expected == ' ' || index == dataset.Length - 1) wordsTyped++;
|
||||||
|
}
|
||||||
|
else if (!char.IsControl(key.KeyChar))
|
||||||
|
{
|
||||||
|
lock (LOCK)
|
||||||
|
{
|
||||||
|
int curLeft = Console.CursorLeft, curTop = Console.CursorTop;
|
||||||
|
Console.Write("\x1b[91m" + key.KeyChar);
|
||||||
|
Console.SetCursorPosition(curLeft, curTop);
|
||||||
|
}
|
||||||
|
charsTyped++;
|
||||||
|
mistakesTyped++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
token.Cancel();
|
||||||
|
endTime = DateTime.Now;
|
||||||
|
TimeSpan duration = endTime - startTime;
|
||||||
|
int prevTop = Console.CursorTop;
|
||||||
|
Console.Write(new string(' ', dataset.Length - lenTyped));
|
||||||
|
Console.SetCursorPosition(0, prevTop);
|
||||||
|
|
||||||
|
double wpm = wordsTyped / duration.TotalMinutes,
|
||||||
|
cpm = (charsTyped - mistakesTyped) / duration.TotalMinutes,
|
||||||
|
accuracy = 100.0 * (charsTyped - mistakesTyped) / charsTyped;
|
||||||
|
|
||||||
|
Console.WriteLine($"\x1b[0m\n\nGood work! You typed {wordsTyped} words in {duration.Minutes}:{duration.Seconds:00}:{duration.Milliseconds:000}!");
|
||||||
|
Console.WriteLine($"Characters per minute: {cpm:0.00}, Words per minute: {wpm:0.00}.");
|
||||||
|
Console.WriteLine($"Accuracy: {accuracy:0.00}%");
|
||||||
|
|
||||||
|
while (true) Console.ReadKey(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly object LOCK = new();
|
||||||
|
|
||||||
|
private static string PickRandomDataset()
|
||||||
|
{
|
||||||
|
StreamReader reader = new("words.txt");
|
||||||
|
string[] lines = reader.ReadToEnd().Split('\n', StringSplitOptions.TrimEntries);
|
||||||
|
reader.Close();
|
||||||
|
|
||||||
|
Random rand = new();
|
||||||
|
int chars = 0;
|
||||||
|
StringBuilder result = new();
|
||||||
|
while (chars < 500)
|
||||||
|
{
|
||||||
|
int index = rand.Next(0, lines.Length);
|
||||||
|
string word = lines[index];
|
||||||
|
|
||||||
|
chars += word.Length + 1;
|
||||||
|
result.Append(word + " ");
|
||||||
|
}
|
||||||
|
return result.ToString();
|
||||||
|
}
|
||||||
|
private static async void DisplayTimer(TimeSpan max, CancellationToken cancel)
|
||||||
|
{
|
||||||
|
DateTime start = DateTime.Now;
|
||||||
|
while (!cancel.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
DateTime cur = DateTime.Now;
|
||||||
|
TimeSpan delta = cur - start;
|
||||||
|
lock (LOCK)
|
||||||
|
{
|
||||||
|
int prevLeft = Console.CursorLeft, prevTop = Console.CursorTop;
|
||||||
|
Console.SetCursorPosition(0, 0);
|
||||||
|
Console.Write($"\x1b[0mTimer: {delta.Minutes}:{delta.Seconds:00}.{delta.Milliseconds:000} / {max.Minutes}:{max.Seconds:00}");
|
||||||
|
Console.SetCursorPosition(prevLeft, prevTop);
|
||||||
|
}
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
TypingTest/TypingTest/TypingTest.csproj
Normal file
16
TypingTest/TypingTest/TypingTest.csproj
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="words.txt">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
370104
TypingTest/TypingTest/words.txt
Normal file
370104
TypingTest/TypingTest/words.txt
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user