powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Написать игру "Пятнашки" на WPF
14 сообщений из 14, страница 1 из 1
Написать игру "Пятнашки" на WPF
    #38810896
djmalina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

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

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

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

Жду предложения. Указывайте цены и сроки выполнения.
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38811080
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalina,

имхо, лучше бы в ветке "Работа" разместить (или продублировать). Там вероятность может быть повыше
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38813115
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
djmalina,

на чистом XAML нужно это сделать?
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38813212
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
рублей за 300 я бы сделал :))
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38813226
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesрублей за 300 я бы сделал :))
Тьфу на тебя! Не демпингуй!
Я бы сделал это за три штуки баксов и за месяц времени.
Из-за таких вот безответственных зарплаты в отрасли падают, программерам не хватает на хамон и пармезан :(
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38813301
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,

ну я уже сделал, чисто для себя.
А что ты хотел? человек не хочет делать сам, не может сам, пусть платит, 300 рублей не так уж и много :)
Пусть и делов не много.
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38813323
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesна чистом XAML нужно это сделать?
Roman Mejtesрублей за 300 я бы сделал :))
Roman Mejtesну я уже сделал, чисто для себя.
Да я ящик коньяка готов проставить если покажите реализацию пятнашек на чистом XAML
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38814408
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKI,

ну чисто на XAML это будет довольно сложно, так как тяжело будет задать условия перемещения элементов на гриде
но вот пример на XAML и C#
код формы на замле:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
<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#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
        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);
            }
        }


и пара конвертеров:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    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();
        }
    }
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38815767
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

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

Код: xml
1.
<Image x:Name="ImageSource" Source="z:\2.png"/>
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38815769
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а хотя поглядел по именам контролов. точно влияет :)
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38815800
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня проблема в том, что не вызывается ни разу ни один конвертер. никаких ошибок в окне вывода не вижу. ошибок и предупреждений в студии тоже нет.
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38815827
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я забыл вызвать InitializeComponent() :Е

жизнь - боль, не повторяйте ошибок
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38816550
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

там всё просто работает :) есть контрол Image в него загружается картинка.
далее с помощью конвертора я получаю координаты и размер (Rect) для создания VisualBrush, VisualBrush замечательная кисть копирующая контрол. Проще говоря я создаю кисть у которой ViewBox указывает на область которую надо скопировать для фишки.
Потом все кнопки с этой кистью я кидаю на Grid и когда кнопка нажата проверяю, если между пустой костяшкой и нажатой разница
ровна 1 или 4 (что соответствует верхней, нижней, правой и левой) меняю их местами в коллекции грида. профит.
...
Рейтинг: 0 / 0
Написать игру "Пятнашки" на WPF
    #38817535
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

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

конечно, по идее нужно делать рандомную расстановку элементов, т.е. переносить инициализацию пятнашек из кзамла в кодбехайнд + добавить логику определения решена головоломка или нет. Ну это уже пусть djmalina допиливает.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Написать игру "Пятнашки" на WPF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]