С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 2
Регистрация: 09.06.2016
Сообщений: 19
1

Понять алгоритм Тетриса в консоли

12.10.2016, 20:19. Показов 2660. Ответов 5

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, помогите новичку! Разбираю игру Тетрис и не могу понять несколько моментов:

1. в классе Field есть методы проверки возможности сдвига фигуры вправо/влево. И я хоть убей, не могу понять их алгоритма((( насколько я поняла: мы берем координаты игрового поля и проверяем наличие фигуры в них. НО! К примеру у нас фигура Вертикальная линия (Line в позиции 2 или 4),мы проверяем возможность сдвига влево:
C#
1
2
3
4
5
                              for (int i = 0; i < 4; i++)
                                {
                                    if (tetrisField[curY + i, curX] ==true|| curX == 0)
                                        return false;
                                }
о чем здесь речь?

2. что дает нам этот цикл (в Main)?
C#
1
2
3
 for (int i = 0; i < 10 - f.level; i++) //количество итераций цикла имитирует скорость
                {
                    System.Threading.Thread.Sleep(50);



Код:
Кликните здесь для просмотра всего текста
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace EventProject
{
    delegate void Up();
    delegate void Down();
    delegate void Left();
    delegate void Right();
 
    class EventUp
    {
        // Объявляем событие
        public event Up UpEvent;
 
        // Используем метод для запуска события
        public void UpUserEvent()
        {
            UpEvent();
        }
    }
 
 
    class EventDown
    {
        // Объявляем событие
        public event Down DownEvent;
 
        // Используем метод для запуска события
        public void DownUserEvent()
        {
            DownEvent();
        }
    }
 
    class EventLeft
    {
        // Объявляем событие
        public event Left LeftEvent;
 
        // Используем метод для запуска события
        public void LeftUserEvent()
        {
            LeftEvent();
        }
    }
 
    class EventRight
    {
        // Объявляем событие
        public event Right RightEvent;
 
        // Используем метод для запуска события
        public void RightUserEvent()
        {
            RightEvent();
        }
    }
 
    public enum FigType { line, square, rightL, leftL, pyramide, leftZ, rightZ }; //перечисление возможных фигур
 
    //класс фигура
    class Figura
    {
        public bool[,] matrix = new bool[4, 4]; //матрица контейнер для размещения фигур
        public FigType type; //тип фигуры
        public int position; //положение фигуры
 
 
        //стирание фигуры
        public void Clear(bool[,] m)
        {
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 4; j++)
                    m[i, j] = false;
        }
 
        //создание фигуры
        public void Create(FigType figtype)
        {
            Clear(matrix); //стираем фигуру
            this.type = figtype;
            this.position = 1;
            switch (figtype) //анализируем переданную в функцию фигуру
            {
                case FigType.line: //линия
                    {
                        for (int i = 0; i < 4; i++)
                            matrix[0, i] = true;
                        break;
                    }
 
                case FigType.square: //квадрат
                    {
                        for (int i = 0; i < 2; i++)
                            for (int j = 0; j < 2; j++)
                                matrix[i, j] = true;
                        break;
                    }
 
                case FigType.leftL:
                    {
                        for (int i = 0; i < 3; i++)
                            matrix[0, i] = true;
                        matrix[1, 2] = true;
                        break;
                    }
 
                case FigType.rightL:
                    {
                        for (int i = 0; i < 3; i++)
                            matrix[0, i] = true;
                        matrix[1, 0] = true;
                        break;
                    }
 
                case FigType.pyramide:
                    {
                        for (int i = 0; i < 3; i++)
                            matrix[1, i] = true;
                        matrix[0, 1] = true;
                        break;
                    }
 
                case FigType.leftZ:
                    {
                        matrix[0, 0] = true; matrix[1, 0] = true;
                        matrix[1, 1] = true; matrix[2, 1] = true;
                        break;
                    }
 
                case FigType.rightZ:
                    {
                        matrix[0, 1] = true; matrix[1, 0] = true;
                        matrix[1, 1] = true; matrix[2, 0] = true;
                        break;
                    }
            }
 
        }
 
        //вращение фигуры
        public void Rotate()
        {
            if (this.position == 4) //если текущая позиция =4
            {
                this.position = 1; //в начальное положение
            }
                
 
            this.position++; //меняем положение
 
            switch (type)
            {
                case FigType.line: //если линия
                    {
                        //int k;
                        if (matrix[0, 0] == true)
                        {
                            Clear(matrix);
                            for (int k = 0; k < 4; k++)
                                matrix[k, 1] = true;  
                        }
                        else
                        {
                            Clear(matrix);
                            for (int k = 0; k < 4; k++)
                                matrix[0, k] = true;
                        }
                        break;
                    }
 
                case FigType.square: //если квадрат
                    {
                        return;
                    }
 
                default: //остальные виды фигур (так как они зеркально похожи)
                    {
                        bool[,] tempFig = new bool[4, 4]; //создаем матрицу для временной фигуры
                        Clear(tempFig); //очищаем временную матрицу
 
                        for (int j = 3 - 1, c = 0; j >= 0; j--, c++) //указываем на какие клетки во временной матрице фигуры будут меняться клетки фигуры при вращении на одну позицию
                            for (int i = 0; i < 3; i++)
                                tempFig[c, i] = matrix[i, j];
 
                        Clear(matrix); //очищаем осовную матрицу (затираем фигуру )
 
                        for (int f = 0; f < 3; f++)
                            for (int d = 0; d < 3; d++)
                                matrix[f, d] = tempFig[f, d]; //рисуем новую фигуру (перевернутую)
                        break;
                    }
            }
 
        }
 
 
    }
 
    //класс игрового поля
    class Field
    {
        public Figura fig = new Figura(); //фигура
        int width; //ширина поля
        int height; //высота поля
        static bool[,] tetrisField; //игровое поле
        int curY; //текущая координата у
        int curX; //текущая координата х
        public int scores; //очки за игру
        public int level;
 
        //конструктор
        public Field(int w, int h)
        {
            this.width = w;
            this.height = h;
            tetrisField = new bool[height, width];
            level = 0;
            scores = 0;
        }
        //отрисовка поля с фигурой на нем
        public void DrawField()
        {
 
            for (int i = 0; i < height - 1; i++)
            {
                for (int j = 1; j < width - 1; j++)
                {
                    Console.CursorLeft = j;//устанавливаем курсор
                    Console.CursorTop = i;
                    if (tetrisField[i, j] == false) Console.WriteLine(" ");//заполняем поле пробелами
                    else Console.WriteLine("@"); //рисуем фигуру там, где true
                }
                Console.WriteLine();
            }
 
            Console.WriteLine("\n   Level " + this.level);
            Console.WriteLine("\n  Scores " + this.scores);
        }
 
        //помечаем фигуру на игровом поле как true
        public void Copy()
        {
            int x = curX; //временные переменные координаты для заполнения части поля
            int y = curY;
 
            for (int i = 0; i < 4; i++)
            {
                x = curX;
 
                for (int j = 0; j < 4; j++)
                {
                    if (fig.matrix[i, j] == true)
                        tetrisField[y, x] = true;
                    x++;
                }
                y++;
            }
        }
 
        //создание новой фигуры
        public void NewFig()
        {
            Random r = new Random();
            curY = 0;
            curX = 5;
 
            FigType t = (FigType)r.Next(0, 7); //рандомим тип фигуры
            fig.Create(t); //создаем эту фигуру
 
            this.Copy(); //помечаем фигуру         
 
        }
 
        //движение фигуры вниз
        public void Move()
        {
            this.ClearPrevious(); //очищаем предыдущий шаг
            curY++; //сдвгаем координату на один вниз
            this.Copy();
            this.DrawField();//отрисовыаем новое поле с фигурой
 
        }
 
        //стирание предыдущего шага
        public void ClearPrevious()
        {
            int m = 0;
            int n = 0;
 
            for (int i = curY; i < curY + 4; i++)
            {
                for (int j = curX; j < curX + 4; j++)
                {
                    if (fig.matrix[m, n] == true)
                        tetrisField[i, j] = false;
                    n++; //переходим на ячейку вправо
                }
                m++; //переходим на ячейку вниз
                n = 0;
            }
 
        }
 
        //проверка возможности вращения фигуры
        public bool CheckRotation()
        {
 
            return false;
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2016, 20:19
Ответы с готовыми решениями:

Не могу понять алгоритм решения
Дано натуральные числа n и m (50&lt;m&lt;n). Вычислить: static void Main(string args) { ...

Алгоритм движения змейки и роста в консоли
Пишу змейку, сделал движение 1-го символа. Много пытаюсь сделать движение с несколькими символами...

Программирование тетриса
Ребята , есть попытка создания игры &quot;ТЕТРИС&quot; на VS 2010 . Железо PC не позволяет поздние версии.Но...

Не могу понять, почему появляется окно консоли
Здравствуйте уважаемые форумчане. Я только начинаю учиться программировать на яве, ну и придумал...

5
0 / 0 / 2
Регистрация: 09.06.2016
Сообщений: 19
12.10.2016, 20:31  [ТС] 2
Продолжение кода:
Кликните здесь для просмотра всего текста
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
 //проверка возможности смещения влево
        public bool CheckLeft()
        {
            switch (fig.type)
            {
                case FigType.line:
                    {
                        if (fig.position == 1 || fig.position == 3)
                        {
                            if (tetrisField[curY, curX - 1] == true || curX == 1)
                                return false;
                            else
                                return true;
                        }
 
                        else
                        {
                            if (fig.position == 2 || fig.position == 4)
                            {
                                for (int i = 0; i < 4; i++)
                                {
                                    if (tetrisField[curY + i, curX]==true || curX == 0)
                                        return false;
                                }
                                return true;
                            }
                        }
                        break;
                    }
 
                case FigType.square:
                    {
                        if (tetrisField[curY, curX - 1] == true || tetrisField[curY + 1, curX - 1] == true || curX == 1)
                            return false;
                        else
                            return true;
                    }
 
                case FigType.rightL:
                    {
                        if (fig.position == 1)
                        {
                            if (tetrisField[curY, curX - 1] == true || tetrisField[curY + 1, curX - 1] == true || curX == 1)
                                return false;
                            else
                                return true;
                        }
 
                        else
                        {
                            if (fig.position == 2)
                            {
                                for (int i = 0; i < 3; i++)
                                {
                                    if (tetrisField[curY + i, curX - 1] == true || curX == 1)
                                        return false;
                                }
                                return true;
                            }
 
                            if (fig.position == 3)
                            {
                                if (tetrisField[curY + 2, curX - 1] == true || tetrisField[curY + 1, curX + 1] == true || curX == 1)
                                    return false;
                                else
                                    return true;
                            }
 
                            if (fig.position == 4)
                            {
                                if (tetrisField[curY, curX] == true || tetrisField[curY + 1, curX + 1] == true || tetrisField[curY + 2, curX + 1] || curX == 0)
                                    return false;
                                else
                                    return true;
                            }
 
                        }
                        break;
                    }
 
                case FigType.leftL:
                    {
                        if (fig.position == 1)
                        {
                            if (tetrisField[curY, curX - 1] == true || tetrisField[curY + 1, curX + 1] == true || curX == 1)
                                return false;
                            else
                                return true;
                        }
 
                        else
                        {
                            if (fig.position == 2)
                            {
                                for (int i = 0; i < 3; i++)
                                {
                                    if (tetrisField[curY + i, curX - 1] == true || curX == 1)
                                        return false;
                                }
                                return true;
                            }
 
                            if (fig.position == 3)
                            {
                                if (tetrisField[curY + 1, curX - 1] == true || tetrisField[curY + 2, curX - 1] == true || curX == 1)
                                    return false;
                                else
                                    return true;
                            }
 
                            if (fig.position == 4)
                            {
                                if (tetrisField[curY + 2, curX] == true || tetrisField[curY + 1, curX + 1] == true || tetrisField[curY, curX + 1] == true || curX == 0)
                                    return false;
                                else
                                    return true;
                            }
 
                        }
                        break;
                    }
 
и так далее все фигуры и варианты смещения вправо, вниз
 
[size="1"][color="grey"][I]Добавлено через 4 минуты[/I][/color][/size]
и последняя часть кода:
 
 //проверка достижения "потолка"
        public bool IsAtBottom()
        {
            switch (fig.type)
            {
                case FigType.line:
                    {
                        for (int i = 0; i < 4; i++)
                        {
                            if (tetrisField[1, curX + i] == true) return true;
                        }
 
                        break;
                    }
 
                case FigType.square:
                    {
                        if (tetrisField[2, curX] == true || tetrisField[2, curX + 1] == true) return true;
                        break;
                    }
 
                case FigType.rightL:
                    {
                        if (tetrisField[2, curX] == true || tetrisField[1, curX + 1] == true || tetrisField[1, curX + 2] == true) return true;
                        break;
                    }
 
                case FigType.leftL:
                    {
                        if (tetrisField[1, curX] == true || tetrisField[1, curX + 1] == true || tetrisField[2, curX + 2]) return true;
                        break;
                    }
 
                case FigType.pyramide:
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            if (tetrisField[2, curX + i] == true) return true;
                        }
                        break;
                    }
 
                case FigType.leftZ:
                    {
                        if (tetrisField[2, curX] == true || tetrisField[3, curX + 1] == true) return true;
                        break;
                    }
 
                case FigType.rightZ:
                    {
                        if (tetrisField[3, curX] == true || tetrisField[2, curX + 1] == true) return true;
                        break;
                    }
            }
 
            return false;
        }
 
        //проверка линии
        public bool CheckLine()
        {
            int counter = 0; //счетчик занятых ячеек в линии
            int k = 0;
 
            for (int i = 0; i < height; i++)
            {
                counter = 0;
                for (int j = 0; j < width; j++)
                {
                    if (tetrisField[i, j] == true) counter++; //подсчет занятых ячеек в линии
                    if (counter == 10)
                    {
                        k = i; //запоминаем линию в которой все ячейки заняты
                        break;
                    }
                }
            }
 
            if (k == 0) return false;
 
            else
            {
                for (int i = 0; i < width; i++)
                {
                    tetrisField[k, i] = false;
                }
 
                for (int i = k; i > 0; i--)
                {
                    for (int j = 0; j < width; j++)
                    {
                        tetrisField[i, j] = tetrisField[i - 1, j];
                    }
                }
                this.scores += 100;
                if (scores == 1000)
                {
                    level++;
                    scores = 0;
                }
                return true;
            }
 
        }
 
        //обработчик события вверх: поворот фигуры
        public void UpFig()
        {
            this.ClearPrevious();
            fig.Rotate();
            this.Copy();//отображение
        }
 
        //обработчик события вниз: падение фигуры
        public void DownFig()
        {
            while (this.CheckDown() == true) this.Move();
        }
 
        //обработчик события влево: смещение фигуры влево
        public void LeftFig()
        {
            if (CheckLeft() == true)
            {
                this.ClearPrevious();
                curX--;
                this.Copy();
            }
            else return;
        }
 
        //обработчик события вправо: смещение фигуры вправо
        public void RightFig()
        {
            if (CheckRight() == true)
            {
                this.ClearPrevious();
                curX++;
                this.Copy();
            }
            else return;
        }
 
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            Console.BackgroundColor = ConsoleColor.White;
            for (int i = 0; i < 20; i++)
            {
 
                Console.CursorLeft = 0;
                Console.CursorTop = i;
                Console.WriteLine("0");
            }
 
            for (int i = 1; i < 12; i++)
            {
                Console.CursorLeft = i;
                Console.CursorTop = 19;
                Console.WriteLine("0");
            }
 
            for (int i = 0; i < 20; i++)
            {
                Console.CursorLeft = 11;
                Console.CursorTop = i;
                Console.WriteLine("0");
            }
 
            Console.BackgroundColor = ConsoleColor.Black;
 
            Field f = new Field(12, 20);
 
            f.NewFig();
 
            f.DrawField();
 
            //создание объектов событий нажатия клавиш
            EventUp up = new EventUp(); //вверх
            EventDown down = new EventDown(); //вниз
            EventLeft left = new EventLeft(); // влево
            EventRight right = new EventRight(); //вправо
 
            up.UpEvent += f.UpFig;
            down.DownEvent += f.DownFig;
            left.LeftEvent += f.LeftFig;
            right.RightEvent += f.RightFig;
 
            ConsoleKeyInfo cki;
 
            while (true)
            {
                if (f.CheckDown() == true) f.Move();
                else
                {
                    while (true)
                    {
                        bool flag = f.CheckLine();
                        if (flag == false) break;
                    }
                    f.NewFig();
                    if (f.IsAtBottom() == true) break;
                }
 
 
                for (int i = 0; i < 10 - f.level; i++) //количество итераций цикла имитирует скорость
                {
                    System.Threading.Thread.Sleep(50);
                    if (Console.KeyAvailable)
                    {
                        cki = Console.ReadKey();
 
 
                        switch (cki.Key)
                        {
                            case ConsoleKey.UpArrow: //стрелка вверх
                                {
                                    //if (f.CheckRotation() == false) break;
                                    up.UpUserEvent(); //обработчик события
                                    f.DrawField(); //перерисовка поля
                                    break;
                                }
 
                            case ConsoleKey.DownArrow:
                                {
                                    down.DownUserEvent();
                                    break;
                                }
 
                            case ConsoleKey.LeftArrow:
                                {
                                    left.LeftUserEvent();
                                    f.DrawField(); //перерисовка поля
                                    break;
                                }
 
                            case ConsoleKey.RightArrow:
                                {
                                    right.RightUserEvent();
                                    f.DrawField();
                                    break;
                                }
 
                            default:
                                {
                                    break;
                                }
                        }
 
                    }
                }
 
 
            }
 
            Console.Clear();
 
            Console.WriteLine("\n\n\n      GAME OVER");
            Console.WriteLine("\n   TOTAL SCORES " + (f.level * 1000 + f.scores) + "\n\n\n\n\n\n\n\n\n");
 
        }
    }
}
0
29 / 29 / 18
Регистрация: 09.03.2016
Сообщений: 198
12.10.2016, 20:39 3
Для кода на сайте есть специальные функции, чтобы сделать его читабельным.
1
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
13.10.2016, 09:23 4
Оно вообще работает так, как должно работать?

Вторая часть проверки на сдвиг влево мне, если честно, тоже не понятна. Первая, в случае, когда поворот фигуры нечётный, более-менее логична, хоть и вызывает вопросы. Но вот вторая проверка (могу предположить, что это проверка для случая, когда фигура расположена горизонтально) больше похожа на проверку фигуры на поворот, нежели на сдвиг влево. Хотя как видно поворот фигур в этой игре вообще не реализован, так что вполне возможно, что эта вторая проверка никогда не понадобится.

Насчёт цикла в Main, как и написано в комментарии, этот цикл управляет скоростью игры - тем, как быстро происходят события в игре. Поскольку Field.level содержит номер "уровня" игры то, чем больше это число, тем меньшее количество раз будет проходить цикл, следовательно меньше будет задержек, а скорость игры будет выше. Хотя опять же не понятно, что произойдёт, когда игрок доберётся до 10-ого уровня, игра просто перестанет обрабатывать нажатия кнопок.
1
0 / 0 / 2
Регистрация: 09.06.2016
Сообщений: 19
13.10.2016, 10:51  [ТС] 5
Пока не разобралась с сайтом(((

Добавлено через 8 минут
в том то и дело, что все работает. Я уже и рисовала, и гуглила ..... не могу понять эти проверки(((

Добавлено через 2 минуты
вот весь код
Вложения
Тип файла: rar tetris.rar (46.3 Кб, 19 просмотров)
0
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
13.10.2016, 12:26 6
Что ж, поковырявшись немного, я могу предположить лишь одно - проблема такая же, с которой я сталкивался, когда сам писал тетрис.
Фигура "линия", она же "палка" - несимметрична при поворотах в рамках реалий тетриса. В связи с этим координата, указывающая на позицию фигуры на поле не всегда указывает в верхний левый угол фигуры. При начальном положении фигуры "горизонтально" - её координата совпадает с верхним левым углом. Но после разворачивания фигуры в вертикальное положение, её координата оказывается смещённой на 1 клетку влево, т.е. координата показывает не совсем точно на фигуру.
Не знаю, насколько понятно я это объяснил, но если не вдаваться в подробности, то:
при горизонтальном положении координата фигуры правильная и поэтому проверку на смещение влево можно произвести так:
C#
1
2
3
4
5
6
7
if (fig.position == 1 || fig.position == 3)
{
    if (tetrisField[curY, curX - 1] == true || curX == 1)
        return false;
    else
        return true;
}
... а при вертикальном положении координата фигуры смещена по X влево на 1 клетку, поэтому проверку на смещение влево нужно производить так:
C#
1
2
3
4
5
6
7
8
9
10
if (fig.position == 2 || fig.position == 4)
{
    for (int i = 0; i < 4; i++)
    {
        if (tetrisField[curY + i, curX]==true || curX == 0)
            return false;
    }
    return true;
 
}
Другими словами, это костыль разработчика. Если бы координата фигуры всегда точно указывала на её крайний левый верхний угол вне зависимости от текущего поворота, то код проверки на смещение влево вас бы не смутил и выглядел бы скорее всего так:
C#
1
2
3
4
5
6
7
8
9
10
if (fig.position == 2 || fig.position == 4)
{
    for (int i = 0; i < 4; i++)
    {
        if (tetrisField[curY + i, curX - 1]==true || curX  == 1)
            return false;
    }
    return true;
 
}
Надеюсь, исправленный вариант не вызывает такого же недоумения?
Дальше фигуры "линия" я не смотрел, но могу предположить, что такая же проблема с координатой развёрнутой фигуры присутсвует и для других вариантов
0
13.10.2016, 12:26
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2016, 12:26
Помогаю со студенческими работами здесь

Понять алгоритм
Мне необходимо по числу N равному стороне ромба составлять табличку значений как на рисунке. ...

Понять алгоритм
Помогите разобраться с этим алгоритмом...

Понять алгоритм?
Доброго дня:) помогите понять, что делает алгоритм. Возможно, сортирует, но я не уверена. Заранее...

Хочу начать делать приложения не в консоли, но никак не могу понять, где найти WinForms Application
Что то нужно установить может?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru