added console application

This commit is contained in:
KäseToatz
2024-11-05 19:01:21 +01:00
parent d1bfecbfef
commit 754db562af
15 changed files with 292 additions and 26 deletions

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Memory.Logic\Memory.Logic.csproj" />
</ItemGroup>
</Project>

29
Memory.Cmd/Program.cs Normal file
View File

@ -0,0 +1,29 @@
using Memory.Logic;
namespace Memory.Cmd
{
internal class Program
{
static void Main()
{
Game game = new();
Renderer renderer = new(game);
while (!game.IsFinished())
{
renderer.Render();
Console.Write("Enter card number: ");
try
{
game.ClickCard(game.Cards[int.Parse(Console.ReadLine()!) - 1]);
}
catch (Exception)
{
Console.WriteLine("Invalid card number given.");
Console.ReadLine();
}
Console.Clear();
}
renderer.Render();
}
}
}

94
Memory.Cmd/Renderer.cs Normal file
View File

@ -0,0 +1,94 @@
using Memory.Logic;
using System;
using System.Reflection;
namespace Memory.Cmd
{
internal class Renderer(Game game)
{
private readonly Game game = game;
private static string FormatNumber(int number)
{
string num = "";
int padding = Game.DECKSIZE.ToString().Length - number.ToString().Length;
for (int i = 0; i < padding; i++)
{
num += '0';
}
num += number;
return num;
}
private static void DrawCard(Card card, int index, int column, int row)
{
string num = FormatNumber(card.ID);
string cardNr = FormatNumber(index);
int cardWidth = Game.DECKSIZE.ToString().Length + 4;
for (int i = 0; i < Game.GRIDSIZE; i++)
{
Console.CursorLeft += (cardWidth + 1) * column;
Console.CursorTop = i + ((Game.GRIDSIZE + 1) * row);
for (int j = 0; j < cardWidth; j++)
{
if (i == 0)
{
Console.Write('#');
}
else if (i == Game.GRIDSIZE - 1)
{
if (j > 1 && j < cardWidth - 2)
{
Console.Write(cardNr[j - 2]);
}
else
{
Console.Write('#');
}
}
else if (j == 0 || j == cardWidth - 1)
{
Console.Write('#');
}
else if (i == Game.GRIDSIZE / 2 && j > 1 && j < cardWidth - 2)
{
if (card.Selected())
{
Console.Write(num[j - 2]);
}
else
{
Console.Write('*');
}
}
else
{
Console.Write(' ');
}
}
Console.Write('\n');
}
}
public void Render()
{
for (int i = 0; i < game.Cards.Count; i++)
{
Card card = game.Cards[i];
if (!card.Completed)
{
if (card.Selected())
{
Console.ForegroundColor = ConsoleColor.Green;
}
else
{
Console.ForegroundColor= ConsoleColor.Red;
}
DrawCard(game.Cards[i], i + 1, i % Game.GRIDSIZE, i / Game.GRIDSIZE);
Console.ForegroundColor = ConsoleColor.White;
}
}
}
}
}

9
Memory.Gui/App.xaml Normal file
View File

@ -0,0 +1,9 @@
<Application x:Class="Memory.Gui.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Memory.Gui"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

14
Memory.Gui/App.xaml.cs Normal file
View File

@ -0,0 +1,14 @@
using System.Configuration;
using System.Data;
using System.Windows;
namespace Memory.Gui
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

View File

@ -1,9 +1,9 @@
<Window x:Class="Memory.MainWindow" <Window x:Class="Memory.Gui.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Memory" xmlns:local="clr-namespace:Memory.Gui"
mc:Ignorable="d" mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"> Title="MainWindow" Height="450" Width="800">
<Grid> <Grid>

View File

@ -9,7 +9,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
namespace Memory namespace Memory.Gui
{ {
/// <summary> /// <summary>
/// Interaction logic for MainWindow.xaml /// Interaction logic for MainWindow.xaml

View File

@ -1,13 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<StartupObject>Memory.Program</StartupObject>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup /> <PropertyGroup />
<ItemGroup>
<ApplicationDefinition Update="App.xaml">
<SubType>Designer</SubType>
</ApplicationDefinition>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="MainWindow.xaml"> <Page Update="MainWindow.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>

20
Memory.Logic/Card.cs Normal file
View File

@ -0,0 +1,20 @@
namespace Memory.Logic
{
public class Card(int id)
{
public int ID { get; } = id;
public bool IsChoice1 { get; set; } = false;
public bool IsChoice2 { get; set; } = false;
public bool Completed { get; set; } = false;
public bool Matches(Card card)
{
return ID == card.ID;
}
public bool Selected()
{
return IsChoice1 || IsChoice2;
}
}
}

67
Memory.Logic/Game.cs Normal file
View File

@ -0,0 +1,67 @@
namespace Memory.Logic
{
public class Game
{
public const int DECKSIZE = 10;
public const int GRIDSIZE = 5;
public List<Card> Cards { get; } = CreateDeck(DECKSIZE);
private static List<Card> CreateDeck(int pairs)
{
List<Card> cards = [];
for (int i = 1; i < pairs + 1; i++)
{
cards.Add(new(i));
cards.Add(new(i));
}
Random random = new();
return [..cards.OrderBy(card => random.Next())];
}
public Card? GetChoice1()
{
return Cards.FirstOrDefault(card => card.IsChoice1);
}
public Card? GetChoice2()
{
return Cards.FirstOrDefault(card => card.IsChoice2);
}
public bool IsFinished()
{
return Cards.All(card => card.Completed);
}
public void ClickCard(Card card)
{
Card? choice1 = GetChoice1();
Card? choice2 = GetChoice2();
if (!card.Completed)
{
if ((choice1 == null && choice2 == null) || (choice1 != null && choice2 != null))
{
if (choice1 != null)
{
choice1.IsChoice1 = false;
}
if (choice2 != null)
{
choice2.IsChoice2 = false;
}
card.IsChoice1 = true;
}
else if (choice1 != null && choice2 == null && choice1 != card)
{
card.IsChoice2 = true;
if (choice1.Matches(card))
{
choice1.Completed = true;
card.Completed = true;
// handle score etc
}
}
}
}
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -3,7 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.9.34701.34 VisualStudioVersion = 17.9.34701.34
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memory", "src/Memory.csproj", "{8380EF7C-6F0D-488A-9B88-409696E4565F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memory.Logic", "Memory.Logic\Memory.Logic.csproj", "{2490BF43-EFD6-4BE0-B231-860EB3508360}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memory.Gui", "Memory.Gui\Memory.Gui.csproj", "{6E520079-0F1A-434A-82F8-56D3D5B57645}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memory.Cmd", "Memory.Cmd\Memory.Cmd.csproj", "{36DBAAC0-3FEC-4C5C-8330-C1BD2D08BD05}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -11,10 +15,18 @@ Global
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8380EF7C-6F0D-488A-9B88-409696E4565F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2490BF43-EFD6-4BE0-B231-860EB3508360}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8380EF7C-6F0D-488A-9B88-409696E4565F}.Debug|Any CPU.Build.0 = Debug|Any CPU {2490BF43-EFD6-4BE0-B231-860EB3508360}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8380EF7C-6F0D-488A-9B88-409696E4565F}.Release|Any CPU.ActiveCfg = Release|Any CPU {2490BF43-EFD6-4BE0-B231-860EB3508360}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8380EF7C-6F0D-488A-9B88-409696E4565F}.Release|Any CPU.Build.0 = Release|Any CPU {2490BF43-EFD6-4BE0-B231-860EB3508360}.Release|Any CPU.Build.0 = Release|Any CPU
{6E520079-0F1A-434A-82F8-56D3D5B57645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E520079-0F1A-434A-82F8-56D3D5B57645}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E520079-0F1A-434A-82F8-56D3D5B57645}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E520079-0F1A-434A-82F8-56D3D5B57645}.Release|Any CPU.Build.0 = Release|Any CPU
{36DBAAC0-3FEC-4C5C-8330-C1BD2D08BD05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{36DBAAC0-3FEC-4C5C-8330-C1BD2D08BD05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{36DBAAC0-3FEC-4C5C-8330-C1BD2D08BD05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{36DBAAC0-3FEC-4C5C-8330-C1BD2D08BD05}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -1,15 +0,0 @@
using System.Windows;
namespace Memory
{
internal partial class Program
{
[STAThread]
public static void Main()
{
Application app = new();
MainWindow mainWindow = new();
app.Run(mainWindow);
}
}
}