Форум программистов, компьютерный форум CyberForum.ru

По графике (нарисовать игровое поле из массива) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Алгоритм поиска 2-х ближайших точек из массива элементов Point [] points к заданной точке Point p. http://www.cyberforum.ru/cpp-beginners/thread913108.html
Помогите хоть один написать. Алгоритм поиска 2-х ближайших точек из массива элементов Point points к заданной точке Point p.
C++ Алгоритм решения задачи “Ханойские Башни”. Помогите хоть один написать. Алгоритм решения задачи “Ханойские Башни”. http://www.cyberforum.ru/cpp-beginners/thread913106.html
Алгоритм сглаживания – “Скользящее среднее”. Обработка краевых точек. C++
Помогите хоть один написать. Алгоритм сглаживания – “Скользящее среднее”. Обработка краевых точек.
Алгоритм вычисления числа pi методом математического моделирования. C++
Помогите хоть один написать. Алгоритм вычисления числа pi методом математического моделирования.
C++ Алгоритм линейной интерполяции по таблице функции с неравным шагом. http://www.cyberforum.ru/cpp-beginners/thread913102.html
Помогите хоть один написать. Алгоритм линейной интерполяции по таблице функции с неравным шагом.
C++ Алгоритм вычитания n-й строки матрицы из всех ее строк, начиная с n+1. Помогите хоть один написать. Алгоритм вычитания n-й строки матрицы из всех ее строк, начиная с n+1. подробнее

Показать сообщение отдельно
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
27.06.2013, 12:24     По графике (нарисовать игровое поле из массива)
Ага! Что-то мне припоминается. Все таки решили сделать как положено. Похвально.

Тогда начнем:
Для начала все используемые так сказать магические числа надо переписать в виде переменных. Поясню: к примеру размеры поля 15х15. И все циклы обхода этого поля будут соответственно до 15. А вдруг вы захотите изменить его размер? Что тогда? Просматривать весь код на наличие цифры 15 и при встрече заменять ее на новую? Это минимум долго. А так же есть большой риск заменить какую-то не ту цифру 15, не относящуюся к размеру поля, что приведет к трудноуловимым сбоям в работе программы. Лучше в начале программы объявить переменные, отвечающие за размер поля и везде в коде подставлять имена этих переменных. Таким образом, при изменении размеров поля, вам придется изменить 15 только в одном месте.
То есть:
C++
1
int a[15][15]={...
Заменится на
C++
1
2
int Height = 15, Width = 15;
int a[Height][Width]={...
Дальше, в том же ключе, можно заменить ваши спецсимволы, отображающие в массиве пол (0), стены (9), какие-либо переходы (8) и прочее (5), так же на имена переменных. И, если вы вдруг, по каким-то причинам захотите поменять местами стены и пол, то вам достаточно будет поменять всего две переменные, а не перерисовывать целый массив.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int w/*стена*/=9;
int f/*пол*/=0;
int e/*переход*/=8;
int o/*предмет*/=5;
int a[Height][Width]=
   {
     {w,w,w,w,w,w,w,w,w,w,w,w,w,w,w},
     {w,f,f,f,f,f,w,s,w,f,f,f,f,f,w},
     {w,f,w,f,w,f,f,f,f,f,w,f,w,f,w},
     {w,f,w,f,w,w,w,w,w,w,w,f,w,f,w},
     {w,f,w,f,f,f,f,w,f,f,f,f,w,f,w},
     {w,f,w,w,w,w,f,f,f,w,w,w,w,f,w},
     {w,f,f,f,f,w,w,f,w,w,f,f,f,f,w},
     {w,f,w,w,f,f,f,f,f,f,f,w,f,w,w},
     {w,f,w,w,w,w,w,f,w,w,w,w,f,w,w},
     {w,f,w,o,f,f,w,f,f,f,f,f,f,f,w},
     {w,f,w,w,w,f,w,f,w,w,w,w,w,f,w},
     {w,f,f,f,f,f,w,f,w,f,f,f,f,f,w},
     {w,w,w,w,f,w,w,f,w,f,w,w,w,f,w},
     {o,f,f,f,f,w,f,f,f,f,f,f,w,f,w},
     {w,w,w,w,e,w,w,o,w,w,w,o,w,o,w},
    } ;
Может не очень наглядно и вообще сто лет не нужно, но зато с програмной точки зрения лучше. Хотя можно пойти от обратного и объявить клетки так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int a[Height][Width]=
   {
     {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
     {9,0,0,0,0,0,9,s,9,0,0,0,0,0,9},
     {9,0,9,0,9,0,0,0,0,0,9,0,9,0,9},
     {9,0,9,0,9,9,9,9,9,9,9,0,9,0,9},
     {9,0,9,0,0,0,0,9,0,0,0,0,9,0,9},
     {9,0,9,9,9,9,0,0,0,9,9,9,9,0,9},
     {9,0,0,0,0,9,9,0,9,9,0,0,0,0,9},
     {9,0,9,9,0,0,0,0,0,0,0,9,0,9,9},
     {9,0,9,9,9,9,9,0,9,9,9,9,0,9,9},
     {9,0,9,5,0,0,9,0,0,0,0,0,0,0,9},
     {9,0,9,9,9,0,9,0,9,9,9,9,9,0,9},
     {9,0,0,0,0,0,9,0,9,0,0,0,0,0,9},
     {9,9,9,9,0,9,9,0,9,0,9,9,9,0,9},
     {5,0,0,0,0,9,0,0,0,0,0,0,9,0,9},
     {9,9,9,9,8,9,9,5,9,9,9,5,9,5,9},
    } ;
 
int w/*стена*/=9;
int f/*пол*/=0;
int e/*переход*/=8;
int o/*предмет*/=5;



Следующее важное замечание - обзывайте переменные как-нибудь осмысленно. Кто такие
C++
1
2
3
4
5
6
7
8
 char ch2 = 15;
 int s=4;
 int x=7;
 int y=1;
 int g=8;
 char ch1 = 35;
 int z, b;
int a[15][15]
? Да черт его знает! И если вдруг вы в коде встретите запись вида
C++
1
2
3
...
if(x/2>y) g=y-s*2;
...
у вас лопнет мозг.
Таким образом условие выхода
C++
1
while ( s != a[14][4] );
преобразуется во что-то наподобие
C++
1
2
3
int exitCell = e; // Где е==8
...
while ( s != exitCell );
Таким образом вы можете запихать сколько угодно выходов в ваш массив и все это будет обрабатывать одна компактная строчка. А не громозяка вида
C++
1
while ( s != a[14][4] || s != a[4][1] || s != a[2][7] || s != a[9][8] || s != a[1][4] || s != a[1][5] || s != a[5][42]);
Да и имя массива клеток поля a[Height][Width] хорошо бы было заменить на какой-нибудь field или labyrinth.



P.S. Надеюсь не нужно потом будет прикручивать к вашей программе алгоритм поиска пути?
P.P.S. Надеюсь вы действительно хотите написать эту программу, а не болтаете ерундой.
 
Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru