Skip to content

Commit f9d9ff3

Browse files
committed
Added Graphics
1 parent f6c72dc commit f9d9ff3

File tree

11 files changed

+169
-30
lines changed

11 files changed

+169
-30
lines changed
Loading
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using MattEland.FSharpGeneticAlgorithm.Logic;
2+
3+
namespace MattEland.FSharpGeneticAlgorithm.WindowsClient
4+
{
5+
internal class ActorViewModel : NotifyPropertyChangedBase
6+
{
7+
private readonly Actors.Actor _actor;
8+
9+
public ActorViewModel(Actors.Actor actor)
10+
{
11+
_actor = actor;
12+
}
13+
14+
// Subtract 1 since my data's indexes start at 1 instead of 0
15+
public int PosX => _actor.Pos.X - 1;
16+
public int PosY => _actor.Pos.Y - 1;
17+
18+
public string Text => Actors.getChar(_actor).ToString();
19+
20+
public string ImagePath
21+
{
22+
get
23+
{
24+
if (_actor.ActorKind.Equals(Actors.ActorKind.Acorn))
25+
{
26+
return "Acorn.png";
27+
}
28+
29+
if (_actor.ActorKind.Equals(Actors.ActorKind.Doggo))
30+
{
31+
return "Doggo.png";
32+
}
33+
34+
if (_actor.ActorKind.Equals(Actors.ActorKind.Rabbit))
35+
{
36+
return "Rabbit.png";
37+
}
38+
39+
if (_actor.ActorKind.Equals(Actors.ActorKind.Tree))
40+
{
41+
return "Tree.png";
42+
}
43+
44+
if (_actor.ActorKind.Equals(Actors.ActorKind.NewSquirrel(true)))
45+
{
46+
return "SquirrelAcorn.png";
47+
}
48+
49+
if (_actor.ActorKind.Equals(Actors.ActorKind.NewSquirrel(false)))
50+
{
51+
return "Squirrel.png";
52+
}
53+
54+
return null;
55+
}
56+
}
57+
}
58+
}
Loading
Loading

MattEland.FSharpGeneticAlgorithm.WindowsClient/MainViewModel.cs

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
using System.Text;
1+
using System.Collections.Generic;
2+
using System.Collections.ObjectModel;
3+
using System.Linq;
4+
using System.Windows.Media;
25
using MattEland.FSharpGeneticAlgorithm.Logic;
36

47
namespace MattEland.FSharpGeneticAlgorithm.WindowsClient
58
{
69
internal class MainViewModel : NotifyPropertyChangedBase
710
{
811
private Simulator.GameState _state;
12+
private readonly ObservableCollection<ActorViewModel> _actors = new ObservableCollection<ActorViewModel>();
913

1014
public MainViewModel()
1115
{
@@ -17,6 +21,8 @@ public MainViewModel()
1721

1822
public ActionCommand MoveCommand { get; }
1923

24+
public IEnumerable<ActorViewModel> Actors => _actors;
25+
2026
private void Move(object direction)
2127
{
2228
// Parameter validation / cleansing
@@ -55,43 +61,35 @@ public Simulator.GameState State
5561
set
5662
{
5763
_state = value;
58-
OnPropertyChanged(nameof(TextGrid));
64+
65+
_actors.Clear();
66+
foreach (var actor in _state.World.Actors.Where(a => a.IsActive))
67+
{
68+
_actors.Add(new ActorViewModel(actor));
69+
}
70+
71+
OnPropertyChanged(nameof(GameStatusBrush));
5972
OnPropertyChanged(nameof(GameStatusText));
6073
OnPropertyChanged(nameof(TurnsLeftText));
6174
}
6275
}
63-
64-
public string TextGrid => BuildAsciiGrid();
65-
76+
6677
public string GameStatusText => _state.SimState switch
6778
{
6879
Simulator.SimulationState.Won => "Won",
6980
Simulator.SimulationState.Lost => "Lost",
7081
_ => "Simulating"
7182
};
7283

84+
public Brush GameStatusBrush => _state.SimState switch
85+
{
86+
Simulator.SimulationState.Won => Brushes.MediumSeaGreen,
87+
Simulator.SimulationState.Lost => Brushes.LightCoral,
88+
_ => Brushes.LightGray
89+
};
90+
7391
public string TurnsLeftText => _state.TurnsLeft == 1
7492
? "1 Turn Left"
7593
: $"{_state.TurnsLeft} Turns Left";
76-
77-
78-
private string BuildAsciiGrid()
79-
{
80-
var world = _state.World;
81-
var sb = new StringBuilder();
82-
83-
for (int y = 1; y <= world.MaxY; y++)
84-
{
85-
for (int x = 1; x <= world.MaxX; x++)
86-
{
87-
sb.Append(World.getCharacterAtCell(x, y, world));
88-
}
89-
90-
// Advance to the next line
91-
sb.AppendLine();
92-
}
93-
94-
return sb.ToString();
95-
}
9694
}
9795
}

MattEland.FSharpGeneticAlgorithm.WindowsClient/MainWindow.xaml

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
xmlns:local="clr-namespace:MattEland.FSharpGeneticAlgorithm.WindowsClient"
77
mc:Ignorable="d"
88
Title="WPF Core C# talking to F# Tutorial by Matt Eland"
9-
Width="450" Height="355"
9+
Width="755" Height="650"
1010
Background="Black"
1111
Foreground="White"
1212
d:DataContext="{d:DesignInstance local:MainViewModel}">
@@ -22,11 +22,11 @@
2222
</Window.Resources>
2323
<DockPanel>
2424
<!-- Status Bar -->
25-
<StatusBar DockPanel.Dock="Bottom">
25+
<StatusBar DockPanel.Dock="Bottom" Background="{Binding GameStatusBrush}" FontWeight="Bold">
2626
<StatusBarItem>
2727
<TextBlock Text="{Binding TurnsLeftText}"></TextBlock>
2828
</StatusBarItem>
29-
<StatusBarItem>
29+
<StatusBarItem HorizontalAlignment="Right">
3030
<TextBlock Text="{Binding GameStatusText}"></TextBlock>
3131
</StatusBarItem>
3232
</StatusBar>
@@ -46,8 +46,71 @@
4646
<Button Style="{StaticResource CommandButtonStyle}" Command="{Binding ResetCommand}">Restart</Button>
4747
</StackPanel>
4848
<!-- Main UI -->
49-
<Grid Margin="10">
50-
<TextBlock FontFamily="Courier New" Text="{Binding TextGrid}" FontSize="18"></TextBlock>
49+
<Grid Margin="10" Background="Green">
50+
<Image Source="Grass.png" Stretch="Fill" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Image>
51+
<Viewbox Stretch="Uniform">
52+
<Border BorderThickness="1" BorderBrush="DarkGreen">
53+
<ItemsControl ItemsSource="{Binding Path=Actors}" Width="130" Height="130">
54+
<ItemsControl.ItemTemplate>
55+
<ItemContainerTemplate>
56+
<Border d:DataContext="{d:DesignInstance local:ActorViewModel}"
57+
BorderBrush="Black"
58+
BorderThickness="1"
59+
ToolTip="{Binding ImagePath}">
60+
<Image Source="{Binding ImagePath}"
61+
HorizontalAlignment="Stretch"
62+
VerticalAlignment="Stretch"
63+
Stretch="Fill">
64+
</Image>
65+
</Border>
66+
</ItemContainerTemplate>
67+
</ItemsControl.ItemTemplate>
68+
<ItemsControl.ItemsPanel>
69+
<ItemsPanelTemplate>
70+
<Grid>
71+
<Grid.ColumnDefinitions>
72+
<ColumnDefinition></ColumnDefinition>
73+
<ColumnDefinition></ColumnDefinition>
74+
<ColumnDefinition></ColumnDefinition>
75+
<ColumnDefinition></ColumnDefinition>
76+
<ColumnDefinition></ColumnDefinition>
77+
<ColumnDefinition></ColumnDefinition>
78+
<ColumnDefinition></ColumnDefinition>
79+
<ColumnDefinition></ColumnDefinition>
80+
<ColumnDefinition></ColumnDefinition>
81+
<ColumnDefinition></ColumnDefinition>
82+
<ColumnDefinition></ColumnDefinition>
83+
<ColumnDefinition></ColumnDefinition>
84+
<ColumnDefinition></ColumnDefinition>
85+
</Grid.ColumnDefinitions>
86+
<Grid.RowDefinitions>
87+
<RowDefinition></RowDefinition>
88+
<RowDefinition></RowDefinition>
89+
<RowDefinition></RowDefinition>
90+
<RowDefinition></RowDefinition>
91+
<RowDefinition></RowDefinition>
92+
<RowDefinition></RowDefinition>
93+
<RowDefinition></RowDefinition>
94+
<RowDefinition></RowDefinition>
95+
<RowDefinition></RowDefinition>
96+
<RowDefinition></RowDefinition>
97+
<RowDefinition></RowDefinition>
98+
<RowDefinition></RowDefinition>
99+
<RowDefinition></RowDefinition>
100+
</Grid.RowDefinitions>
101+
</Grid>
102+
</ItemsPanelTemplate>
103+
</ItemsControl.ItemsPanel>
104+
<ItemsControl.ItemContainerStyle>
105+
<Style TargetType="ContentPresenter">
106+
<Setter Property="Grid.Column" Value="{Binding PosX}" />
107+
<Setter Property="Grid.Row" Value="{Binding PosY}" />
108+
</Style>
109+
</ItemsControl.ItemContainerStyle>
110+
</ItemsControl>
111+
</Border>
112+
</Viewbox>
113+
<!--<TextBlock FontFamily="Courier New" Text="{Binding TextGrid}" FontSize="18"></TextBlock>-->
51114
</Grid>
52115
</DockPanel>
53116
</Window>

MattEland.FSharpGeneticAlgorithm.WindowsClient/MattEland.FSharpGeneticAlgorithm.WindowsClient.csproj

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,28 @@
77
<ApplicationIcon>KillAllDefectsSymbol.ico</ApplicationIcon>
88
</PropertyGroup>
99

10+
<ItemGroup>
11+
<None Remove="Acorn.png" />
12+
<None Remove="Doggo.png" />
13+
<None Remove="Grass.png" />
14+
<None Remove="Rabbit.png" />
15+
<None Remove="Squirrel.png" />
16+
<None Remove="SquirrelAcorn.png" />
17+
<None Remove="Tree.png" />
18+
</ItemGroup>
19+
1020
<ItemGroup>
1121
<ProjectReference Include="..\MattEland.FSharpGeneticAlgorithm.Logic\MattEland.FSharpGeneticAlgorithm.Logic.fsproj" />
1222
</ItemGroup>
1323

24+
<ItemGroup>
25+
<Resource Include="Acorn.png" />
26+
<Resource Include="Doggo.png" />
27+
<Resource Include="Grass.png" />
28+
<Resource Include="Rabbit.png" />
29+
<Resource Include="Squirrel.png" />
30+
<Resource Include="SquirrelAcorn.png" />
31+
<Resource Include="Tree.png" />
32+
</ItemGroup>
33+
1434
</Project>
Loading
Loading
Loading

0 commit comments

Comments
 (0)