Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 17.04.2017
Сообщений: 8

Игра "Арканоид" - уничтожение блоков

30.06.2017, 21:42. Показов 8068. Ответов 56

Студворк — интернет-сервис помощи студентам
Ребят, такая проблема, не могу написать код, для уничтожения мячиком каждого блока по отдельности, помогите с кодом.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Исходник:
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
namespace Game___Арканоид
{
    public partial class Form1 : Form
    {
        SolidBrush A = new SolidBrush(Color.White);
        Rectangle rect = new Rectangle(415, 400, 150, 18);
        int I = 415;
        int II = 565;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        int mode = 1;
        // Движение шарика + отскоки
        int x = 485;
        int y = 385;
        int dx = 2;
        int dy = 2;
        int w = 975;
        int h = 450;
        int r = 3;
 
        // Движение плотформы
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Left)
            {
                rect.Location = new Point(rect.Left - 50, rect.Top);
                I = I - 50;
                II = II - 50;
            }
            if (e.KeyCode == Keys.Right)
            {
                rect.Location = new Point(rect.Left + 50, rect.Top);
                I = I + 50;
                II = II + 50;
            }
            Refresh();
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            switch (mode)
            {
                // Меню 
                case 1:
                    g.FillRectangle(Brushes.Gray, 390, 140, 200, 170);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 390, 140, 390, 310);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 390, 310, 590, 310);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 590, 310, 590, 140);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 590, 140, 390, 140);
                    g.DrawString("Начать игру", new Font("Times New Roman", 16), new SolidBrush(Color.Black), 432, 160);
                    g.DrawString("Правила", new Font("Times New Roman", 16), new SolidBrush(Color.Black), 448, 190);
                    g.DrawString("Таблица рекордов", new Font("Times New Roman", 16), new SolidBrush(Color.Black), 405, 220);
                    break;
                // Игровое окно 
                case 2:
                    timer1.Start();
                    int[,] map = new int[5, 5];
                    string[] lines = File.ReadAllLines("Map.txt");
                    string[,] num = new string[lines.Length, lines[0].Split(' ').Length];
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] temp = lines[i].Split(' ');
                        for (int j = 0; j < temp.Length; j++)
                            map[j, i] = Int32.Parse(temp[j]);
                    }
                    
                    for (int i = 0; i < 5; i++)
                    {
                        for (int j = 0; j < 5; j++)
                        {
                            int k = 195 + i * 120;
                            int t = 70 + j * 30;
                            if (map[i, j] == 1)
                            {
                                g.FillRectangle(Brushes.White, k, t , 110, 20);
                            }
                        }
                    }
                    g.FillEllipse(Brushes.DarkOrange, x, y, 15, 15); // Шарик
                    x -= dx;
                    y -= dy;
                    if (y >= 385 && (x >= I && x <= II)) // Отскок от платформы
                    {
                        dy = -dy;
                    }
                    if (y >= 440)   // Исчезновение шарика
                    {
                        mode = 1;
                        x = 485;
                        y = 385;
                        dy = -dy;
                        dx = -dx;
                        timer1.Stop();
                        mode = 1;
                        this.Invalidate();
                    }
                    else
                    {
                        if (y <= 50)
                        {
                            dy = -dy;
                        }
                        if (x - r <= 0 || x + r >= w) // шарик стукнулся о вертикальную границу
                        {
                            dx = -dx;
                        }
                        if (y - r <= 0 || y + r >= h) // шарик стукнулся о горизональную границу
                        {
                            dy = -dy;
                        }    
                    }
                    // Отрисовка платформы
                    g.FillRectangle(A, rect);
                    g.FillRectangle(Brushes.Gray, 0, 0, 1000, 50);
                    g.DrawString("Меню", new Font("Times New Roman", 15), new SolidBrush(Color.Black), 13, 13);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 10, 11, 75, 11);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 75, 11, 75, 40);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 75, 40, 10, 40);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 10, 40, 10, 11);
                    break;
                // Правила 
                case 3:
                    g.FillRectangle(Brushes.Gray, 340, 160, 300, 125);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 340, 160, 640, 160);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 640, 160, 640, 285);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 640, 285, 340, 285);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 340, 285, 340, 160);
                    g.DrawString("   Цель игры «Арканоид» - уничтожить\n" +
                    "мячом все цветные панельки.\n" +
                    "   С помощью кнопок «влево – вправо»\n" +
                    "управляй платформой.\n", new Font("Times New Roman", 12), new SolidBrush(Color.Black), 350, 170);
                    g.DrawString("Назад", new Font("Times New Roman", 12), new SolidBrush(Color.Black), 465, 255);
                    timer1.Stop();
                    break;
            }
        }
 
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            Graphics g = CreateGraphics();
            switch (mode)
            {
                case 1:
                    // Кнопка "Начать игру"   
                    if (e.X >= 430 && e.X <= 590 && e.Y >= 140 && e.Y <= 180)
                    {
                        mode = 2;
                        this.Invalidate();
                    }
                    // Кнопка "Правила"   
                    if (e.X >= 430 && e.X <= 590 && e.Y >= 190 && e.Y <= 218)
                    {
                        mode = 3;
                        this.Invalidate();
                        timer1.Start();
                    }
                    break;
                    // Кнопка "Таблица результатов"   
                    if (e.X >= 10 && e.X <= 75 && e.Y >= 11 && e.Y <= 40)
                    {
                        mode = 1;
                        this.Invalidate();
                    }
                    break;
                // Кнопка "Меню"   
                case 2:
                    if (e.X >= 10 && e.X <= 75 && e.Y >= 11 && e.Y <= 40)
                    {
                        mode = 1;
                        this.Invalidate();
                        timer1.Stop();
                        x = 485;
                        y = 385;
                    }
                    break;
                // Кнопка "Назад"    
                case 3:
                    if (e.X >= 440 && e.X <= 520 && e.Y >= 250 && e.Y <= 280)
                    {
                        mode = 1;
                        this.Invalidate();
                    }
                    break;
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }   
     }
 }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Место в коде, где нужно написать код уничтожения блоков:
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
// Игровое окно 
                case 2:
                    timer1.Start();
                    int[,] map = new int[5, 5];
                    string[] lines = File.ReadAllLines("Map.txt");
                    string[,] num = new string[lines.Length, lines[0].Split(' ').Length];
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] temp = lines[i].Split(' ');
                        for (int j = 0; j < temp.Length; j++)
                            map[j, i] = Int32.Parse(temp[j]);
                    }
                    
                    for (int i = 0; i < 5; i++)
                    {
                        for (int j = 0; j < 5; j++)
                        {
                            int k = 195 + i * 120;
                            int t = 70 + j * 30;
                            if (map[i, j] == 1)
                            {
                                g.FillRectangle(Brushes.White, k, t , 110, 20);
                            }
                        }
                    }
                    g.FillEllipse(Brushes.DarkOrange, x, y, 15, 15); // Шарик
                    x -= dx;
                    y -= dy;
                    if (y >= 385 && (x >= I && x <= II)) // Отскок от платформы
                    {
                        dy = -dy;
                    }
                    if (y >= 440)   // Исчезновение шарика
                    {
                        mode = 1;
                        x = 485;
                        y = 385;
                        dy = -dy;
                        dx = -dx;
                        timer1.Stop();
                        mode = 1;
                        this.Invalidate();
                    }
                    else
                    {
                        if (y <= 50)
                        {
                            dy = -dy;
                        }
                        if (x - r <= 0 || x + r >= w) // шарик стукнулся о вертикальную границу
                        {
                            dx = -dx;
                        }
                        if (y - r <= 0 || y + r >= h) // шарик стукнулся о горизональную границу
                        {
                            dy = -dy;
                        }    
                    }
                    // Отрисовка платформы
                    g.FillRectangle(A, rect);
                    g.FillRectangle(Brushes.Gray, 0, 0, 1000, 50);
                    g.DrawString("Меню", new Font("Times New Roman", 15), new SolidBrush(Color.Black), 13, 13);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 10, 11, 75, 11);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 75, 11, 75, 40);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 75, 40, 10, 40);
                    g.DrawLine(new Pen(Color.LightGreen, 4), 10, 40, 10, 11);
                    break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Скриншот прикрепил:
Миниатюры
Игра "Арканоид" - уничтожение блоков  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2017, 21:42
Ответы с готовыми решениями:

Игра "Арканоид", нужен код уничтожения мячиком блоков
Ребят, такая проблема, не могу написать код уничтожения мячиком блоков, помогите с кодом. Исходник: namespace Game___Арканоид { ...

Игра Арканоид
Добрый день! Создал(По видео уроку) игру Арканоид на c# Visual Basic, Не могу додумать как сделать так, чтобы: 1) При проигрыше,...

Игра "Арканоид"
Ребята, я создаю игру &quot;Арканоид&quot;, и в ходе написания кода столкнулся с тремя проблемками: 1) Как сделать так, чтобы нарисованный шарик...

56
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
29.07.2017, 22:11
Студворк — интернет-сервис помощи студентам
Аналогичная проблема.
Миниатюры
Игра "Арканоид" - уничтожение блоков  
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
30.07.2017, 14:57
Веселый, В первом случае перенесите инициализацию в конструктор. например, для скорости в конструкторе напишите следующее: Velocity = 3;

Во втором
C#
1
public int Width => Size.Width;
На
C#
1
public int Width { get {return Size.Width;}}
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
30.07.2017, 22:50
thank you my friend.
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
30.07.2017, 23:46
sldp,опять я застрял.Не могу найти причину.
Миниатюры
Игра "Арканоид" - уничтожение блоков   Игра "Арканоид" - уничтожение блоков  
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
31.07.2017, 08:35
Веселый, Ну в первом случае это уже вы что-то намудрили) Может метод Start удалили. Проверьте в исходном проекте.
Во втором нужно было, как и в прошлые разы, заменить изначально на public Rectangle Bounds { get { return new Rectangle(...); } }
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
02.08.2017, 10:25
sldp,Вы мне скажите.В моём коде где ошибка???Почему шарик иногда отбивается от подвижной стенки Золотого блока ,а иногда нет! Где моя лажа ??? Неужели всё дело в пикселях???
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
02.08.2017, 10:35
Посмотрите на работу данного приложения . Точность абсолютная! Если бы я при переписке ошибся хоть на 1 мм размера формы ,приложение не работало бы!
Вложения
Тип файла: rar Копия Пятнашки_исправление.rar (93.6 Кб, 10 просмотров)
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
02.08.2017, 15:37
Может всё дело в подвижности одной - правой стенки золотого блока ? Левая - неподвижная отбивает чётко.

Добавлено через 2 минуты
Может я не понимаю процесса ограничения массива точек "Золотого блока"???

Добавлено через 4 часа 52 минуты
Калаур !!!
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
02.08.2017, 19:02
Веселый, Пятнашки?
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
03.08.2017, 18:08
sldp,это просто как пример . Фишки ходят по форме абсолютно точно.Не заходят одна на другую.Ошибки исключены.Я видимо где-то в Арканоиде допустил ошибку.Шарик иногда проходит внутрь Золотого блока .Возможно ошибка здесь - dx или +dx.
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
04.08.2017, 23:09
sldp,я пытался запустить вашу программу в VS 2010.Хотел детально изучить.Но где-то ошибся.На скрине видно что появился только background . Шарик и блоки не отрисовались.Где я ошибся ???
Миниатюры
Игра "Арканоид" - уничтожение блоков  
Вложения
Тип файла: rar TestArkanoidF.rar (508.7 Кб, 3 просмотров)
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
05.08.2017, 10:30
Как это исправить или изменить код ???

Моя сторона левая.Справа исходная.
Миниатюры
Игра "Арканоид" - уничтожение блоков  
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
05.08.2017, 10:46
sldp,что Вы имели ввиду под этой фразой :"возможно вы перемещаете контролы"???
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18339 / 14265 / 5370
Регистрация: 17.03.2014
Сообщений: 28,927
Записей в блоге: 1
05.08.2017, 10:52
Цитата Сообщение от Веселый Посмотреть сообщение
Как это исправить или изменить код ???
C#
1
if (_level != null) _level.Draw();
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
05.08.2017, 14:00
Цитата Сообщение от Веселый Посмотреть сообщение
sldp,я пытался запустить вашу программу в VS 2010.Хотел детально изучить.Но где-то ошибся.На скрине видно что появился только background . Шарик и блоки не отрисовались.Где я ошибся ???
Ваша проблема в том, что вы сразу взялись за изучение технологий (WF/GDI). Сначала изучите C#. Изучите ООП.
В данном случае ничего не работало из-за вашего непонимания "что есть свойства".

ps. 10я студия не на много слабее в требованиях к железу, чем та же 15я. Попробуйте обновиться
Вложения
Тип файла: rar TestArkanoidF.rar (524.2 Кб, 5 просмотров)
1
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
06.08.2017, 21:08
sldp,извините,а зачем Вы используете словарь в приложении??? Я закоментил часть кода в классе .Ничего не поменялось.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static class SpriteData
    {
        static readonly Dictionary<string, Image> _sprites = new Dictionary<string, Image>();
        //public static string ImagesFolderPath { get; set; } = Path.Combine(Environment.CurrentDirectory, "Sprite"); //  папка    со     спрайтами 
        public static string ImagesFolderPath { get{return Path.Combine(Environment.CurrentDirectory, "Sprite");}}
        //public int Width { get {return Size.Width;}}
        // костыльно, но суть ясна
        public static Image Load(string name)
        {
           // if (_sprites.ContainsKey(name))
                //return _sprites[name];
            var img = Image.FromFile(Path.Combine(ImagesFolderPath, name));
            //_sprites.Add(name, img);
            return img;
        }
    }
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
07.08.2017, 09:17
Веселый, Для того, чтоб каждый раз не загружать одинаковые текстуры. Если текстура такая уже есть в словаре, то он ее просто вернет
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
07.08.2017, 11:37
sldp,если Вы утверждаете что абсолютно разбираетесь в ООП , то почему не можете объяснить причину ошибок в моём приложении. Введите в свою программу "Золотой блок" с правой подвижной стенкой блока и заставьте изменяться
длину блока.Я тестировал свою программу без золотого блока.Работает как Ваша.
0
310 / 318 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
07.08.2017, 16:55
Веселый, Во-первых, я такого не утверждал. Во-вторых, у вас в коде нет никакого ООП. Я вам показал пример, от которого можно отталкиваться, добавлять новые блоки, улучшалки и т.п.. Вы же продолжаете идти своей дорогой. Ваш выбор. Через отладку смотрите что не так и фиксите
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
07.08.2017, 17:02
sldp,и всё-таки вижу вы не надеетесь на координатную сетку в форме . Сужу по методу в условном операторе .

C#
1
2
3
4
5
   if (_ball.Bounds.IntersectsWith(block.Bounds) && block.IsAlive)
              {
                   block.IsAlive = false;
                   _ball.Collide(block);
              }
Добавлено через 3 минуты
sldp,насчёт ООП Вы правы .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2017, 17:02

Игра "Арканоид". Сообщения пользователям
Пишу игру - арканоид if (ballPos.Y &gt; this._сlientRectangle.Height) { _gameState = false; } ...

Арканоид. Уничтожение кирпичей
Добрый день всем. Пишу игру Арканоид (по экрану летает мяч, нужно не дать ему упасть вниз отбивая его полоской снизу и разбивая кирпичи в...

Арканоид. Алгоритм отбивания шара от блоков
Всем привет. Пишу арканоид на С++ с помощью winapi. Уже доделал, но никак не могу придумать нормальный алгоритм отбивания шара от блоков. У...

Арканоид. Как сделать так, чтобы шарик отскакивал от блоков?
Здравствуйте дорогие форумчане! Я недавно начал изучать паскаль и возник следующий вопрос: как сделать так, чтобы шарик отскакивал от...

Игра Арканоид!!!
помогите с игрой!!!! вот что я написал: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые алгоритмы, которые не западно ориентированной философии кода, без уведомлений и объяснений.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru