C# :: Aufgabe #200 :: Lösung #1
2 Lösungen

#200
Auslosung der Figurenaufstellung beim Chess960
Anfänger - C#
von hollst
- 12.02.2018 um 18:33 Uhr
Beim Chess960, auch Fischer-Random-Chess genannt, wird die
Ausgangsposition der acht weißen Offiziere ausgelost, wobei
zwei Regeln zu beachten sind:
1.) der König muss zwischen den zwei Türmen stehen (damit Rochaden möglich bleiben) und
2.) die zwei Läufer müssen ungleichfarbig sein.
Die schwarzen Offiziere werden spiegelsymmetrisch angeordnet (Bild 1, Beispielaufstellung),
alle anderen Schachspielregeln bleiben erhalten.
Man schreibe ein (vorzugsweise GUI-) Programm, das diesen Auslosungsregeln entspricht und eine
der möglichen 960 zufälligen Startpositionen rückgibt.
Ausgangsposition der acht weißen Offiziere ausgelost, wobei
zwei Regeln zu beachten sind:
1.) der König muss zwischen den zwei Türmen stehen (damit Rochaden möglich bleiben) und
2.) die zwei Läufer müssen ungleichfarbig sein.
Die schwarzen Offiziere werden spiegelsymmetrisch angeordnet (Bild 1, Beispielaufstellung),
alle anderen Schachspielregeln bleiben erhalten.
Man schreibe ein (vorzugsweise GUI-) Programm, das diesen Auslosungsregeln entspricht und eine
der möglichen 960 zufälligen Startpositionen rückgibt.
#1

von hollst (13980 Punkte)
- 25.02.2018 um 15:28 Uhr
Hier wird der Zeichensatz CHESS BERLIN verwended: http://www.enpassant.dk/chess/downl/berlin.zip (CHESS ALPHA ist bei den Leerfeldern nicht proportional (glaub ich))
C#-Code
C#-Code

<Window x:Class="Chess960_WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Chess960_WPF" mc:Ignorable="d" Title="Chess969_WPF" Height="500" Width="500" WindowStartupLocation="CenterScreen"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Margin="5" Orientation="Horizontal"> <Button x:Name="bt_normal" Content=" startpos normal " Click="bt_normal_Click"/> <Button x:Name="bt_random960" Content=" random960 " Width="75" Click="bt_random960_Click" Margin="5,0,0,0"/> </StackPanel> <TextBox x:Name="textBox" Margin="5" Grid.Row="1" TextWrapping="Wrap" FontFamily="Chess Berlin" FontSize="48" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> </Grid> </Window>

using System; using static System.Console; using System.Collections.Generic; using System.Text; using System.Windows; namespace Chess960_WPF { public partial class MainWindow : Window { private Random random = new Random(); private Chess960_Class.CHESS960 c960; public MainWindow() { InitializeComponent(); c960 = new Chess960_Class.CHESS960(random); WriteLine(c960.string_position_CONSOLE); this.textBox.Text = c960.string_position_CHESS_BERLIN_normalschach; } private void bt_random960_Click(object sender, RoutedEventArgs e) { c960 = new Chess960_Class.CHESS960(random); this.textBox.Text = c960.string_position_CHESS_BERLIN; } private void bt_normal_Click(object sender, RoutedEventArgs e) { this.textBox.Text = c960.string_position_CHESS_BERLIN_normalschach; } } } namespace Chess960_Class { public class CHESS960 { public int[] position_white_officers { get; private set; } public int[] position_white_officers_normalschach { get; private set; } public string string_position_CONSOLE; public string string_position_CHESS_BERLIN; public string string_position_CHESS_BERLIN_normalschach; public CHESS960(Random rand) { position_white_officers = new int[8]; position_white_officers_normalschach = new int[8]; for (var i = 0; i < position_white_officers_normalschach.Length; i++) position_white_officers_normalschach[i] = i; List<int> list = null; bool pos_valid = false; while (!pos_valid) { list = new List<int>(); for (var i = 0; i < position_white_officers.Length; i++) { bool bo_okay = false; int next = -1; while (!bo_okay) { next = rand.Next(8); bo_okay = !list.Contains(next); } list.Add(next); } pos_valid = bo_valid(list); } position_white_officers = list.ToArray(); string_position_CONSOLE = position(position_white_officers); string_position_CHESS_BERLIN = position_CHESS_ALPHA(position_white_officers); string_position_CHESS_BERLIN_normalschach = position_CHESS_ALPHA(position_white_officers_normalschach); } private bool bo_valid(List<int> input) { int king = 4, pos_king = input.IndexOf(king); int rock1 = 0, rock2 = 7, pos_rock1 = input.IndexOf(rock1), pos_rock2 = input.IndexOf(rock2); int bishop1 = 2, bishop2 = 5, pos_bishop1 = input.IndexOf(bishop1), pos_bishop2 = input.IndexOf(bishop2); return Math.Max(pos_rock1, pos_rock2) > pos_king && Math.Min(pos_rock1, pos_rock2) < pos_king && (pos_bishop1 + pos_bishop2) % 2 == 1; } private static string position(int[] L) { StringBuilder sb = new StringBuilder(); string[][] officers = new string[][] { new string[] { "wT ", "wS ", "wL ", "wD ", "wK ", "wL ", "wS ", "wT " }, new string[] { "bT ", "bS ", "bL ", "bD ", "bK ", "bL ", "bS ", "bT " } }; string[] pawns_blank = new string[] { "wP ", "sP ", " . " }; for (var j = 0; j < 8; j++) sb.Append(officers[1][L[j]]); sb.AppendLine(); for (var j = 0; j < 8; j++) sb.Append(pawns_blank[1]); sb.AppendLine(); for (var i = 0; i < 4; i++) { for (var j = 0; j < 8; j++) sb.Append(pawns_blank[2]); sb.AppendLine(); } for (var j = 0; j < 8; j++) sb.Append(pawns_blank[0]); sb.AppendLine(); for (var j = 0; j < 8; j++) sb.Append(officers[0][L[j]]); return sb.ToString(); } //http://www.enpassant.dk/chess/downl/berlin.zip private static string position_CHESS_ALPHA(int[] L) { StringBuilder sb = new StringBuilder(); string[][] officers = new string[][] { new string[] { "R", "H", "B", "Q", "K", "B", "H", "R", "r", "h", "b", "q", "k", "b", "h", "r",}, new string[] { "t", "j", "n", "w", "l", "n", "j", "t", "T", "J", "N", "W", "L", "N", "J", "T" } }; string[] pawns_blank = new string[] { "P", "o", " ", "p", "O", "+" }; for (var j = 0; j < 8; j++) { int jj; jj = j % 2 == 0 ? 0 : 8; sb.Append(officers[1][L[j] + jj]); } sb.AppendLine(); for (var j = 0; j < 8; j++) { int jj; jj = j % 2 == 1 ? 1 : 4; sb.Append(pawns_blank[jj]); } sb.AppendLine(); for (var i = 0; i < 4; i++) { for (var j = 0; j < 8; j++) { int jj; jj = (j + i) % 2 == 0 ? 2 : 2 + 3; sb.Append(pawns_blank[jj]); } sb.AppendLine(); } for (var j = 0; j < 8; j++) { int jj; jj = j % 2 == 1 ? 0 : 0 + 3; sb.Append(pawns_blank[jj]); } sb.AppendLine(); for (var j = 0; j < 8; j++) { int jj; jj = j % 2 == 0 ? 0 : 8; sb.Append(officers[0][L[j] + jj]); } return sb.ToString(); } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1