Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
lirkangel
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 13
1

Paintbox или же лабиринт

25.01.2013, 17:02. Просмотров 1427. Ответов 4
Метки нет (Все метки)

Добрый день, сообственно я на данный момент пытаюсь написать программу, которая находит путь из лабиринта по принципу левый руки. Вот поискал тут на форумах тему про перемещение, анимации в picturebox так и не нашел.
Т.е я хочу чтобы по button точка начала двигаться.
Лабиринт это уже нарисованная картинка, находящейся в background picture.
Собственно вот и button
Кликните здесь для просмотра всего текста
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
 private void button2_Click(object sender, EventArgs e)
        {            
            i = Convert.ToInt32(textBox1.Text);
            j = Convert.ToInt32(textBox2.Text);
            dot = new int[2] { i, j };
            Graphics g = pictureBox1.CreateGraphics();
            
            while (i - 30 < 0) //условия выхода, т.е должен дойти до верхний границы экрана
            {
                if ((j < 129) && (j > 359)) //первая преграда
                {
                    pictureBox1.Refresh();
                    g.FillRectangle(Brushes.Black, i - 10, j, 2, 2);
                }
                else
                {
                    if ((i - 30 < 146))
                    {
                        pictureBox1.Refresh();
                        g.FillRectangle(Brushes.Black, i - 10, j, 2, 2);
 
                    }
                }
 
            }
            
        }

Но почему-то не могу его двигать. Даже не рисуется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2013, 17:02
Ответы с готовыми решениями:

Рисование на paintbox'e
Помогите плиз. Суть такова, на форме есть paintbox, нужно, чтобы после загрузки...

Рисование в PaintBox с использованием CreateGraphics
Почему на PaintBox ничего не рисуется с помощью CreateGraphics? private void...

Лабиринт на C#
Вообщем надо написать игру лабиринт на C# . Игры до этого не писал . Знаю что...

Игра лабиринт!
Необходимо создать программу-игру лабаиринт!! на форме!! очень срочно нужно у...

Игра лабиринт
using System; using System.Collections.Generic; using System.Linq; using...

4
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
25.01.2013, 18:12 2
Если честно я не совсем понял ваш код, но для того чтобы точка двигалась, вам нужно по таймеру менять её координаты, и обновлять pictureBox1. И я не совсем понимаю как вы будете на картинке лабиринта искать путь, разве что только если пути будут выделены каким - то цветом, но тогда вам придется анализировать цвет пикселей, а это займет приличное кол-во времени. Я помню, в универе делали программку "поиск кратчайшего пути в лабиринте", так там карту лабиринта мы задавали двумерной матрицей, типа такого:
11110111
11100011
11011011
11111011
0 - разрешенный маршрут, 1 - стены.
ЗЫ. Может я вас не правильно понял, но по этому куску кода вырванного из контекста понять что вам нужно тяжело.
0
Sergey_B
163 / 163 / 57
Регистрация: 08.01.2013
Сообщений: 335
25.01.2013, 18:34 3
Вот набросал по быстрому пример движения объектов, по кнопке шарик начинает движение по pictureBox1.
1
Вложения
Тип файла: rar ball.rar (45.8 Кб, 44 просмотров)
lirkangel
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 13
25.01.2013, 18:44  [ТС] 4
Я тоже подумал насчет анализа цвет пикселя и т.д, но мне тут предлагали что для начало лучше вписать какую-нибудь преграду т.е вписать координату этого преграда, потом заставить пиксель обойти его. Но для начало у меня даже пиксель не двигается
0
Psilon
Master of Orion
Эксперт .NET
6001 / 4851 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
25.01.2013, 20:16 5
lirkangel, логика должна быть отделена от изображения, для этого тысячи людей трудились над паттернами вроде MVC, MVVM,... Создайте класс, в котором есть массив булевских выражение: true если можно туда пойти и false если нельзя. Определите координаты входа и выхода и хотя бы сделайте, чтобы машина отвечала, можно ли пройти из начала в конец или нельзя. После этого можно уже добавлять вывод на экран. Для этого напишите отдельный класс визуализатора, который будет получать игровой массив как параметр, и выводить карту в виде картинки. Вот например у меня в игре это так реализовано:
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
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
 
namespace Snake
{
    public enum TerrainInfo
    {
        LastHead,
        Food,
        NewHead,
        Tail,
    }
 
    public class Visualizer
    {
        public int CellSize { get; private set; }
        public Size MapSizeInPixels { get; private set; }
        private readonly Color backgroundColor = Color.Black;
        private readonly Color barrierColor = Color.Red;
 
        private readonly Dictionary<TerrainInfo, Color> dict;
 
        private Bitmap map;
 
 
        public Visualizer()
        {
            dict = new Dictionary<TerrainInfo, Color>
                       {
                           {TerrainInfo.Tail,  backgroundColor},
                           {TerrainInfo.Food, Color.Blue},
                           {TerrainInfo.LastHead, Color.Green}, 
                           {TerrainInfo.NewHead, Color.GreenYellow},
                       };
            MapSizeInPixels = new Size();
            CellSize = 10;
        }
 
        public Bitmap PaintBackground(IEnumerable<Point> list, HashSet<Point> barriers, Point foodStartCoords)
        {
            if (map == null)
                map = new Bitmap(MapSizeInPixels.Width, MapSizeInPixels.Height);
            using (var g = Graphics.FromImage(map))
                g.Clear(Color.Black);
            foreach (var p in barriers.Select(barrier => new Point(barrier.X*CellSize, barrier.Y*CellSize))) //переводим точку из игровых координат в абсолютные
            {
                for (int i = 0; i < CellSize; i++)
                    for (int j = 0; j < CellSize; j++)
                        map.SetPixel(p.X + i, p.Y + j, barrierColor);
            }
            DrawCell(foodStartCoords, TerrainInfo.Food);
            return map;
        }
 
        public Bitmap PaintTurn(SnakeTurnInfo turnInfo)
        {
            DrawCell(turnInfo.TailToClean, TerrainInfo.Tail);
            DrawCell(turnInfo.OldHeadToClean, TerrainInfo.LastHead);
            DrawCell(turnInfo.NewHead, TerrainInfo.NewHead);
            DrawCell(turnInfo.NewFood, TerrainInfo.Food);
            return map;
        }
 
 
        private void DrawCell(Point? coords,TerrainInfo terrain)
        {
            if (coords == null)
                return;
            var p = new Point(coords.Value.X * CellSize, coords.Value.Y * CellSize);
            for (int i = 1; i < CellSize - 1; i++)
                for (int j = 1; j < CellSize - 1; j++)
                    map.SetPixel(p.X + i, p.Y + j, dict[terrain]);
        }
 
 
        private void GetCellSize(bool zoom)
        {
            CellSize = zoom ? 15 : 10; //Устанавливаем размер ячейки
        }
 
        public void Initialize(Size size, bool zoom)
        {
            GetCellSize(zoom);
            MapSizeInPixels = new Size(size.Width * CellSize, size.Height * CellSize);
        }
    }
}
Добавлено через 3 минуты
Быдлокод еще тот, но в принципе смысл в нем какой-то имеется.
В частности строчка 46. Мы получаем массив игровых координат (номеров ячеек), после этого номер ячейки переводим в координаты относительно битмапа и рисуем. Но сама игра не знает, что мы делаем с этими ячейками. Так и проявляется отделение логики от изображения. Отсутствие привязки к логики значит, что вы можете изменить виндовое приложение на консольное ничего не переписывая в классе игры, изменив только класс визуализатора. Это называется принцип закрытости/открытости и принцип единственности ответственности (SRP)
1
25.01.2013, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2013, 20:16

Лабиринт из панелей
За пару месяцев попыток изучения Windows form C# в свободное от безделья время...

Игра Лабиринт на C#
Посоветуйте пожалуйста литературу/статьи/уроки для создания игры Лабиринт на...

Волновой алгоритм и лабиринт! C#
Здравствуйте, у меня два вопроса. первый: как сгенирировать лабиринт?...


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

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

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