Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/43: Рейтинг темы: голосов - 43, средняя оценка - 4.51
136 / 57 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
1
.NET 4.x

Алгоритм пятнашек

23.02.2013, 09:54. Просмотров 8116. Ответов 18
Метки нет (Все метки)


Я хочу сам написать игру пятнашки, пожалуйста не кидайте готовые программы, Хочу сам по практиковаться.
В принципы я понял как это сделать, вот я так думаю
- надо создать 16 кнопок и пронумеровать их, 16 - кнопку сделать прозрачной
- занести кнопки в массив
- а дальше обрабатывать события click и менять Left / Top от позиции
- если кнопки стали вряд один (1,2,3 ... 15) победа

Но возник один нюанс не как не могу понять как сделать вот этот пункт (а дальше обрабатывать события click и менять Left / Top от позиции) то есть на сколько позицией двигать, как расшитать если ли пустое место для движения и т.д.

Может вы мне подскажите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2013, 09:54
Ответы с готовыми решениями:

Создание цикла для "Пятнашек". Увеличить количество TextBox
Как дописать код для создания 6 textBox занимающих всю форму,а не 3х ,как сейчас???:wall: ...

Возможные оптимизации кода "пятнашек"
Добрый вечер. Недавно начал изучать WinForms, для тренировки решил сделать игру пятнашки, но с...

Алгоритм автоматического сбора "пятнашек"
Программу, в ее стандартном виде(для пользователя) я написал. Теперь нужно прикрутить возможность...

Рандом для пятнашек
Вот посмотрите. Разработал вот такой алгоритм для разброса костяшек по форме procedure...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
18
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
23.02.2013, 10:03 2
ну, во-первых создай массив с кнопками в 16 штук, сделай кнопки через наследование и добавь туда свойство - которое отражает её позицию, т.е. лучше всего как Point, при нажатии на кнопку, проверяешь есть ли рядом та самая пустая кнопка, то меняешь их местами..
Button_Clikc, естественно для всех кнопок нужно сделать один...
В принципе вся прога занимает 20-30 строк...
0
136 / 57 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
23.02.2013, 10:08  [ТС] 3
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
ну, во-первых создай массив с кнопками в 16 штук, сделай кнопки через наследование и добавь туда свойство - которое отражает её позицию, т.е. лучше всего как Point, при нажатии на кнопку, проверяешь есть ли рядом та самая пустая кнопка, то меняешь их местами..
Button_Clikc, естественно для всех кнопок нужно сделать один...
В принципе вся прога занимает 20-30 строк...
Лекго говорить что 20-30 мин. вы еще больше сказали что у меня куча вопросов
1) как это сделать создай массив с кнопками в 16 штук, сделай кнопки через наследование ?
2)добавь к массиву кнопок свойство - которое отражает её позицию, т.е. лучше всего как Point ?
3) роверяешь есть ли рядом та самая пустая кнопка, то меняешь их местами.?

Можете хоть на примере объяснить ?
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
23.02.2013, 13:29 4
Спасибо за тему, я как раз на свой сайт её добавил, там подробное объяснение, как что делать и куда нажимать, будут вопросы, продолжай задавать, отвечу обязательно:
Пятнашки
0
Эксперт .NET
14849 / 11236 / 2949
Регистрация: 17.09.2011
Сообщений: 18,822
23.02.2013, 15:38 5
Вариант с кнопками - это, конечно же, оверкилл.
Я бы сделал обычный двумерный массив и отрисовывал его в методе Paint.
И элементов на форме будет меньше, и больший контроль за визуальным представлением, и проще реализовать саму логику игры.
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
23.02.2013, 15:43 6
Цитата Сообщение от kolorotur Посмотреть сообщение
проще реализовать саму логику игры.
Я там ссылку скинул на весь код с описанием, там же можно и проект скачать, как я и говорил - 20-30 строк...
Сомневаюсь, что в Paint Это проще сделать... Хотя процедуры те же самые будут, можно даже переписать это почти не меняя кода...
1
136 / 57 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
23.02.2013, 18:30  [ТС] 7
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Я там ссылку скинул на весь код с описанием, там же можно и проект скачать, как я и говорил - 20-30 строк...
Сомневаюсь, что в Paint Это проще сделать... Хотя процедуры те же самые будут, можно даже переписать это почти не меняя кода...
а вы самоучка ?

Добавлено через 6 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Вариант с кнопками - это, конечно же, оверкилл.
Я бы сделал обычный двумерный массив и отрисовывал его в методе Paint.
И элементов на форме будет меньше, и больший контроль за визуальным представлением, и проще реализовать саму логику игры.
А как вашу идею можно реализовать ?
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
23.02.2013, 20:33 8
Цитата Сообщение от Sylar9 Посмотреть сообщение
а вы самоучка
Да, с 2009 года занимаюсь с небольшими перерывами...
0
136 / 57 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
23.02.2013, 21:05  [ТС] 9
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Да, с 2009 года занимаюсь с небольшими перерывами...
у меня к вам вопрос, я читаю книгу, но практику придумать не могу , что можно написать простенького , калькулятор, блокнот, угдай число, а дальше не могу придумать
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
23.02.2013, 22:08 10
Я изначально захотел написать простенькую игрушку, типа тетрис, и с этого и начал искать инфу, как и что делать... Алгоритм по сути у меня в голове сразу был, как компьютер должен это делать наиболее оптимальным способом я понимал, а как это сделать - с этим были сложности... Т.е. первую игру я писал полгода по учебнику...
Сегодня пятнашки за несколько минут написал, т.к. почти все знал как осуществить, и реализовывал это неоднократно...

Ставь себе задачи, решай их, форум в этом плане очень помогает, а именно поиск ответов на вопросы, которые здесь задают, я себе форум год назад создавал для этой цели, за полгода освоил Паскаль, Делфи, С++, VBA...
0
51 / 51 / 14
Регистрация: 12.01.2013
Сообщений: 770
23.02.2013, 22:52 11
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Я изначально захотел написать простенькую игрушку, типа тетрис, и с этого и начал искать инфу, как и что делать... Алгоритм по сути у меня в голове сразу был, как компьютер должен это делать наиболее оптимальным способом я понимал, а как это сделать - с этим были сложности... Т.е. первую игру я писал полгода по учебнику...
Сегодня пятнашки за несколько минут написал, т.к. почти все знал как осуществить, и реализовывал это неоднократно...

Ставь себе задачи, решай их, форум в этом плане очень помогает, а именно поиск ответов на вопросы, которые здесь задают, я себе форум год назад создавал для этой цели, за полгода освоил Паскаль, Делфи, С++, VBA...
а не дашь скайп, хотел еще многое что узнать у вас
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
24.02.2013, 03:48 12
aleks16pilipenko - Skype
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 3
13.06.2013, 15:19 13
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Спасибо за тему, я как раз на свой сайт её добавил, там подробное объяснение, как что делать и куда нажимать, будут вопросы, продолжай задавать, отвечу обязательно:
Пятнашки
В принципе проект практичен, но только все фишки сразу в правильном порядке, как сделать чтобы их перемешивать в случайном, а потом уж реализовывать процесс игры?
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
13.06.2013, 19:46 14
Цитата Сообщение от eXtence Посмотреть сообщение
как сделать чтобы их перемешивать в случайном, а потом уж реализовывать процесс игры?
Я бы сделал двойной вложенный цикл. В первом случайное число делать, а во втором проверять, не занято ли место. Если занято, то снова случайное число. В принципе здесь вариаций много, как это сделать, в любом случае через два цикла...
Сейчас некогда, но могу и код написать, если нужно...
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 3
13.06.2013, 22:02 15
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Я бы сделал двойной вложенный цикл. В первом случайное число делать, а во втором проверять, не занято ли место. Если занято, то снова случайное число. В принципе здесь вариаций много, как это сделать, в любом случае через два цикла...
Сейчас некогда, но могу и код написать, если нужно...
Очень буду признателен за код!

Добавлено через 29 минут
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
В принципе здесь вариаций много, как это сделать, в любом случае через два цикла...
У меня примерно есть одна мысль... Создать кнопку при нажатии которой фишки начнут рандомно меняться с пустой до приостоновления, только прошу помощи в осуществлении...
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
18.06.2013, 09:36 16
Цитата Сообщение от eXtence Посмотреть сообщение
У меня примерно есть одна мысль... Создать кнопку при нажатии которой фишки начнут рандомно меняться с пустой до приостоновления, только прошу помощи в осуществлении...
Это слишком долго... Я другой вариант сделал, вот весь код:
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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Windows.Forms;
using System.Drawing;
 
namespace _8Game15
{
    public partial class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
        private Button button1;
        private Button button2;
        public Form1()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(99, 2);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(89, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "Размешать";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(1, 2);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(92, 23);
            this.button2.TabIndex = 2;
            this.button2.Text = "Собрать";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.button2);
            this.Name = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
 
        }
        MyButton[] Butons = new MyButton[16];
        Random rand = new Random();
        Point Nothing = new Point(5, 5);
 
        private void Form1_Load(object sender, EventArgs e)
        {
            int i = 0;
            for (int y = 0; y < 4; y++)
            {
                for (int x = 0; x < 4; x++)
                {
                    Butons[i] = new MyButton();
                    Butons[i].Size = new Size(50, 50);
                    Butons[i].Click += new EventHandler(Buttons_Click);
                    Butons[i].Location = new Point(12 + x * 56, 41 + y * 56);
                    Butons[i].Pozition = new Point(x, y);
                    this.Controls.Add(Butons[i]);
                    Butons[i].Text = ((i++) + 1).ToString();
                }
            }
            Butons[15].Visible = false;
        }
        private void Buttons_Click(object sender, EventArgs e)
        {
            MyButton Now = (MyButton)sender;
            int x = Math.Abs(Now.Pozition.X - Butons[15].Pozition.X);
            int y = Math.Abs(Now.Pozition.Y - Butons[15].Pozition.Y);
            if ((x == 1 && y == 0) || (x == 0 && y == 1))
            {
                Point P = Now.Pozition;
                Now.Pozition = Butons[15].Pozition;
                Butons[15].Pozition = P;
                Now.Location = new Point(12 + Now.Pozition.X * 56, 41 + Now.Pozition.Y * 56);
                Butons[15].Location = new Point(12 + Butons[15].Pozition.X * 56, 41 + Butons[15].Pozition.Y * 56);
                if (victory()) MessageBox.Show("Вы победили!");
            }
        }
        private bool victory()
        {
            int i = 0;
            for (int y = 0; y < 4; y++)
                for (int x = 0; x < 4; x++)
                    if (Butons[i++].Location != new Point(12 + x * 56, 41 + y * 56)) return false;
            return true;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int i = 0;
            for (int y = 0; y < 4; y++)
                for (int x = 0; x < 4; x++)
                {
                    Butons[i].Location = new Point(12 + x * 56, 41 + y * 56);
                    Butons[i++].Pozition = new Point(x, y);
                }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            for (i = 0; i < 16; i++)
                Butons[i].Pozition = Nothing;
            for (int y = 0; y < 4; y++)
                for (int x = 0; x < 4; x++)
                {
                    while (Butons[i = rand.Next(0, 16)].Pozition != Nothing)
                    { }
                    Butons[i].Location = new Point(12 + x * 56, 41 + y * 56);
                    Butons[i].Pozition = new Point(x, y);
                }
        }
    }
    public class MyButton : Button
    {
        public Point Pozition;
    }
}
1
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 3
19.06.2013, 15:35 17
Благодарю, очень помогло! Но проще в старый код было добавить кусочек из этого, а именно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MyButton[] Butons = new MyButton[16];
        Random rand = new Random();
        Point Nothing = new Point(5, 5);
 
private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            for (i = 0; i < 16; i++)
                Butons[i].Pozition = Nothing;
            for (int y = 0; y < 4; y++)
                for (int x = 0; x < 4; x++)
                {
                    while (Butons[i = rand.Next(0, 16)].Pozition != Nothing)
                    { }
                    Butons[i].Location = new Point(12 + x * 56, 41 + y * 56);
                    Butons[i].Pozition = new Point(x, y);
                }
        }
Но все же огромное спасибо)
0
)))
610 / 409 / 55
Регистрация: 31.12.2009
Сообщений: 2,324
Записей в блоге: 3
19.06.2013, 22:04 18
Цитата Сообщение от eXtence Посмотреть сообщение
Но проще в старый код было добавить кусочек из этого
В принципе я старый код и перебрал...
Больше всего над этим парился:
Цитата Сообщение от eXtence Посмотреть сообщение
while (Butons[i = rand.Next(0, 16)].Pozition != Nothing)
{ }
Один раз видел что-то подобное, теперь вот сам попробовал сделать, минут 20 на это убил.
0
-48 / 6 / 1
Регистрация: 26.06.2011
Сообщений: 140
29.06.2015, 11:01 19
А как в windows phone это написать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2015, 11:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Random для пятнашек
public partial class Form1 : Form { public int arrX = new int; public int...

Перемещение пятнашек в рамках поля
Итак, конечная цель - продвинутая версия пятнашек, грубо говоря. По тачу нужно перемещать...

Проверка на наличие решения пятнашек
int HaveSolution( void ) { int i, j; int inv = 0; for(i = 0; i &lt; NUMBS; i++) {...

Объявление двумерного массива для пятнашек
Подскажите, пожалуйста, касательно создания двумерного массива для пятнашек - в виде кнопок или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.