2016-01-28 5 views
-1

Я создаю очень простую версию игры жизни. (https://en.wikipedia.org/wiki/Conway's_Game_of_Life)C# простая игра жизни в WPF

Я использую массив 30x80 для отслеживания ячеек как живых, так и мертвых. Вот мой код для начальной позиции ячеек. Я пытаюсь сделать это в WPF

Вот мой код для генерации начального положения.

public void fixedArray() 
{ 
    char characterForGame = getCharacterForGame(); 

    //char[,] gameArray = new char[30, 80]; 
    for (int i = 0; i < 30; i++) 
    { 
     for (int j = 0; j < 80; j++) 
     { 
      gameArray[i, j] = ' '; 
     } 
    } 
    //Sets initial cells 
    gameArray[1, 25] = characterForGame; 
    gameArray[2, 23] = characterForGame; 
    gameArray[2, 25] = characterForGame; 
    gameArray[3, 13] = characterForGame; 
    gameArray[3, 14] = characterForGame; 
    gameArray[3, 21] = characterForGame; 
    gameArray[3, 22] = characterForGame; 
    gameArray[3, 35] = characterForGame; 
    gameArray[3, 36] = characterForGame; 
    gameArray[4, 12] = characterForGame; 
    gameArray[4, 16] = characterForGame; 
    gameArray[4, 21] = characterForGame; 
    gameArray[4, 22] = characterForGame; 
    gameArray[4, 35] = characterForGame; 
    gameArray[4, 36] = characterForGame; 
    gameArray[5, 1] = characterForGame; 
    gameArray[5, 2] = characterForGame; 
    gameArray[5, 11] = characterForGame; 
    gameArray[5, 17] = characterForGame; 
    gameArray[5, 21] = characterForGame; 
    gameArray[5, 22] = characterForGame; 
    gameArray[6, 1] = characterForGame; 
    gameArray[6, 2] = characterForGame; 
    gameArray[6, 11] = characterForGame; 
    gameArray[6, 15] = characterForGame; 
    gameArray[6, 17] = characterForGame; 
    gameArray[6, 18] = characterForGame; 
    gameArray[6, 23] = characterForGame; 
    gameArray[6, 25] = characterForGame; 
    gameArray[7, 11] = characterForGame; 
    gameArray[7, 17] = characterForGame; 
    gameArray[7, 25] = characterForGame; 
    gameArray[8, 12] = characterForGame; 
    gameArray[8, 16] = characterForGame; 
    gameArray[9, 13] = characterForGame; 
    gameArray[9, 14] = characterForGame; 

    printArray(); 
} 

мой вопрос достаточно широк, но я не могу найти много, когда я Google, вероятно, из-за моей плохой терминологии. Как я буду делать анимацию, чтобы я мог печатать этот массив на каждой итерации? В используемом текстовом книге показан пример анимации Timeline, но только .xaml.

+0

Чтобы быть откровенным, ваш пример явно выводит на консольное окно (ширина 80 символов). Поэтому вам нужно прояснить вопрос, хотите ли вы сделать что-то конкретное в WPF или .Net GDI. В какой момент, ваш вопрос в значительной степени, как мне сделать графику в WPF ... –

+0

@MeirionHughes жаль, что я сказал, что мой вокал плохой, что затрудняет поиск соответствующих ответов. Да, массив, который мне нужен, чтобы «оживить», действительно просто нужно напечатать определенное количество раз в текстовом блоке. – kalenpw

ответ

1

Если вы хотите создать простую игру, используя C#, тогда я предлагаю попробовать XNA или MonoGame. Вы не должны беспокоиться о рендеринге, освежении и т. Д. Посмотрите его в сети, это не так сложно, как вы думаете.

UPDATE:

Здесь вы идете предполагая, что вы есть WrapPanel с именем сор ..

XAML: за

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
    <Grid> 
     <WrapPanel Name="wp"> 

     </WrapPanel> 
    </Grid> 
</Window> 

Код:

private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      int fixedHeight = 50; 
      int fixedWidth = 50; 
      char[,] gameArray = new char[30, 80]; 
      wp.Orientation = Orientation.Horizontal; 
      wp.MaxWidth = gameArray.GetLength(1) * fixedWidth; 

      for (int i = 0; i < gameArray.GetLength(0); i++) 
      { 
       for (int j = 0; j < gameArray.GetLength(1); j++) 
       { 
        wp.Children.Add(
         new System.Windows.Controls.Button 
         { 
          Content = string.Format("{0}-{1}", i, j), 
          Height = fixedHeight, 
          Width = fixedWidth, 
         } 
         ); 
       } 
      } 
     } 
+0

Это для класса, поэтому я должен использовать формы WPF. – kalenpw

+1

Вы должны были упомянуть об этом на своем посту.В любом случае, как XNA, так и MonoGame поддерживает XAML –

+0

Неплохо, что я отредактирую это, есть ли у вас какие-либо предложения просто распечатать массив с заданным количеством времени по – kalenpw

3

Чтобы ответить на ваш вопрос, как для этого в WPF ...

Добавить окно:

<Window x:Class="WpfApplication1.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:WpfApplication1" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     mc:Ignorable="d" 
     Title="MainWindow" 
     Height="350" 
     Width="525"> 

    <Window.DataContext> 
     <local:MyViewModel/> 
    </Window.DataContext> 

    <ItemsControl ItemsSource="{Binding MyArray}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical"></StackPanel> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ItemsControl ItemsSource="{Binding}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Horizontal"></StackPanel> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding}" /> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 

    </ItemsControl> 
</Window> 

добавить новый файл:

namespace WpfApplication1 
{ 
    public class MyViewModel 
    { 
     public char[][] MyArray { get; set; } 

     public MyViewModel() 
     { 
      MyArray = new char[30][]; 

      for (int row = 0; row < 30; row++) 
      { 
       MyArray[row] = new char[80]; 

       for (int col = 0; col < 80; col++) 
       { 
        MyArray[row][col] = 'O'; 
       } 
      } 
     } 
    } 
} 

Это должно помочь вам:

enter image description here

Если вы реализуете INotifyPropertyChanged рисунок на ViewModel , и используйте ObservableCollection вместо массивов (вы все еще можете вставьте их), то при обновлении элементов, вид автоматически изменится.

Затем вы можете заменить DataTemplate символьным элементом на графику. Выбор шаблонов также может быть полезен здесь.

Много, что вы могли бы сделать, что я отправлю для вас.

Смежные вопросы