Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Написать игру "Пятнашки" на WPF  [new]
djmalina
Member

Откуда:
Сообщений: 27
Добрый день!

Необходимо написать игру "Пятнашки" на WPF.

Суть: Загружаем картинку. Она разбивается на 16 квадратов. Из 16 квадратов один пустой. Как только картинку собрали – вывести сообщение "Победа".

Код должен быть максимально простым и с комментариями.

Жду предложения. Указывайте цены и сроки выполнения.
19 ноя 14, 15:53    [16872750]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Шайтан
Member

Откуда: город обречённых
Сообщений: 21830
djmalina,

имхо, лучше бы в ветке "Работа" разместить (или продублировать). Там вероятность может быть повыше
19 ноя 14, 18:12    [16873791]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
djmalina,

на чистом XAML нужно это сделать?
21 ноя 14, 13:17    [16884891]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
Roman Mejtes,
рублей за 300 я бы сделал :))
21 ноя 14, 14:09    [16885296]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
petalvik
Member

Откуда:
Сообщений: 704
Roman Mejtes
рублей за 300 я бы сделал :))

Тьфу на тебя! Не демпингуй!
Я бы сделал это за три штуки баксов и за месяц времени.
Из-за таких вот безответственных зарплаты в отрасли падают, программерам не хватает на хамон и пармезан :(
21 ноя 14, 14:16    [16885358]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
petalvik,

ну я уже сделал, чисто для себя.
А что ты хотел? человек не хочет делать сам, не может сам, пусть платит, 300 рублей не так уж и много :)
Пусть и делов не много.
21 ноя 14, 14:53    [16885726]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
EDUARD SAPOTSKI
Member

Откуда:
Сообщений: 2371
Roman Mejtes
на чистом XAML нужно это сделать?

Roman Mejtes
рублей за 300 я бы сделал :))

Roman Mejtes
ну я уже сделал, чисто для себя.

Да я ящик коньяка готов проставить если покажите реализацию пятнашек на чистом XAML
21 ноя 14, 15:09    [16885859]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
EDUARD SAPOTSKI,

ну чисто на XAML это будет довольно сложно, так как тяжело будет задать условия перемещения элементов на гриде
но вот пример на XAML и C#
код формы на замле:
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfApplication2="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="400" Width="400"
        Background="LightGray">
    <Window.Resources>
        
        <wpfApplication2:PositionToViewBox x:Key="PositionToViewBox"/>
        <wpfApplication2:MultiplyConverter x:Key="MultiplyConverter"/>


        <Style x:Key="BaseKnukkle" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="White">
                            <Grid>
                                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
                                           Foreground="White" FontSize="20">
                                    <TextBlock.Text>
                                        <MultiBinding Converter="{StaticResource MultiplyConverter}">
                                            <Binding Path="(Grid.Column)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}"/>
                                            <Binding Path="(Grid.Row)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}"/>
                                        </MultiBinding>
                                    </TextBlock.Text>
                                </TextBlock>
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        
        <Style TargetType="{x:Type Button}" x:Key="EmptyKnuckleStyle" BasedOn="{StaticResource BaseKnukkle}">
            <Setter Property="Background" Value="Transparent"/>
        </Style>
        
        <Style TargetType="{x:Type Button}" x:Key="KnuckleStyle" BasedOn="{StaticResource BaseKnukkle}">
            <EventSetter Event="Click" Handler="EventSetter_OnHandler"/>
            <Setter Property="Background">
                <Setter.Value>
                    <VisualBrush Visual="{Binding ElementName=ImageSource}">
                        <VisualBrush.Viewbox>
                            <MultiBinding Converter="{StaticResource PositionToViewBox}">
                                <Binding Path="(Grid.Column)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}"/>
                                <Binding Path="(Grid.Row)" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Button}}"/>
                            </MultiBinding>
                        </VisualBrush.Viewbox>
                    </VisualBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
        <Image x:Name="ImageSource" Source="z:\2.png"/>
        <Rectangle Fill="#9FFFFFFF"></Rectangle>
        <UniformGrid Columns="4" Rows="4" x:Name="KnuckleGrid">
            <!-- ReSharper disable Xaml.RedundantAttachedProperty -->
            <Button Grid.Column="0" Grid.Row="0" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="1" Grid.Row="0" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="2" Grid.Row="0" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="3" Grid.Row="0" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="0" Grid.Row="1" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="1" Grid.Row="1" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="2" Grid.Row="1" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="3" Grid.Row="1" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="0" Grid.Row="2" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="1" Grid.Row="2" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="2" Grid.Row="2" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="3" Grid.Row="2" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="0" Grid.Row="3" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="1" Grid.Row="3" Style="{StaticResource KnuckleStyle}"/>
            <Button Grid.Column="2" Grid.Row="3" Style="{StaticResource KnuckleStyle}"/>
            <Button x:Name="Empty" Grid.Column="3" Grid.Row="3" Style="{StaticResource EmptyKnuckleStyle}"/>
            <!-- ReSharper restore Xaml.RedundantAttachedProperty -->
        </UniformGrid>
    </Grid>

</Window>

код формы C#
        private void Swap(UIElementCollection list, UIElement arg1, UIElement arg2)
        {
            var index1 = list.IndexOf(arg1);
            var index2 = list.IndexOf(arg2);
            list.Remove(arg1);
            list.Insert(index2, arg1);
            list.Remove(arg2);
            list.Insert(index1, arg2);
        }

        public UIElement GetKnukle(UIElementCollection list, int column, int row)
        {
            foreach (UIElement i in list)
            {
                var iRow = Grid.GetRow(i);
                var iColumn = Grid.GetColumn(i);
                if (row == iRow && column == iColumn) return i;
            }
            return null;
        }

        private UIElement GetEmpty(UIElementCollection list)
        {
            return GetKnukle(list, 3, 3);

        }

        private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
        {
            var childrens = KnuckleGrid.Children;
            var knukle = (Button)sender;
            var empty = GetEmpty(childrens);

            var emptyIndex = childrens.IndexOf(empty);
            var knukleIdex = childrens.IndexOf(knukle);
            var delta = Math.Abs(emptyIndex - knukleIdex);


            if (delta == 1 || delta == 4)
            {
                Swap(childrens, knukle, empty);
            }
        }

и пара конвертеров:
    class MultiplyConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            var column = (int) values[0];
            var row = (int)values[1];
            var result = (row*4 + column) + 1;
            return result.ToString(CultureInfo.InvariantCulture);
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    public class PositionToViewBox : IMultiValueConverter
    {
        private const int Size = 4;
        const double Step = 1.0 / Size;

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values[0] == DependencyProperty.UnsetValue) return new Rect(0,0,0,0);
            var x = (int)values[0];
            var y = (int)values[1];
            return new Rect(x * Step, y * Step, Step, Step);
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
23 ноя 14, 15:36    [16892114]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
monstrilla
Member

Откуда:
Сообщений: 129
Roman Mejtes,

заинтересовало. скопировал код, но вижу только белое пустое окошко.
правда я закоментарил строку, не представляю какая картинка должна быть. можете скинуть? но мне кажется, она не должна повлиять на работоспособность приложения...

<Image x:Name="ImageSource" Source="z:\2.png"/>
25 ноя 14, 09:08    [16899988]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
monstrilla
Member

Откуда:
Сообщений: 129
а хотя поглядел по именам контролов. точно влияет :)
25 ноя 14, 09:10    [16899997]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
monstrilla
Member

Откуда:
Сообщений: 129
у меня проблема в том, что не вызывается ни разу ни один конвертер. никаких ошибок в окне вывода не вижу. ошибок и предупреждений в студии тоже нет.
25 ноя 14, 09:44    [16900117]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
monstrilla
Member

Откуда:
Сообщений: 129
я забыл вызвать InitializeComponent() :Е

жизнь - боль, не повторяйте ошибок
25 ноя 14, 10:18    [16900268]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
monstrilla,

там всё просто работает :) есть контрол Image в него загружается картинка.
далее с помощью конвертора я получаю координаты и размер (Rect) для создания VisualBrush, VisualBrush замечательная кисть копирующая контрол. Проще говоря я создаю кисть у которой ViewBox указывает на область которую надо скопировать для фишки.
Потом все кнопки с этой кистью я кидаю на Grid и когда кнопка нажата проверяю, если между пустой костяшкой и нажатой разница
ровна 1 или 4 (что соответствует верхней, нижней, правой и левой) меняю их местами в коллекции грида. профит.
25 ноя 14, 18:33    [16904076]     Ответить | Цитировать Сообщить модератору
 Re: Написать игру "Пятнашки" на WPF  [new]
monstrilla
Member

Откуда:
Сообщений: 129
Roman Mejtes,

как работает - предельно ясно, я просто затупил с InitializeComponent() спросонья :)

конечно, по идее нужно делать рандомную расстановку элементов, т.е. переносить инициализацию пятнашек из кзамла в кодбехайнд + добавить логику определения решена головоломка или нет. Ну это уже пусть djmalina допиливает.
26 ноя 14, 16:12    [16909134]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить