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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
#1

Функция, в функции main() или общие переменные для нескольких функций - C++

30.10.2012, 20:33. Просмотров 1468. Ответов 27
Метки нет (Все метки)

Делаю мелкую игрушку, в консоли, ради забавы и столкнулся с 1 проблемой:
Невозможно, создавать функцию в функции, вынеся эту функцию за пределы main()
И скомпилировав, написало, что эта функция ссылается на переменные, которые ВНЕ зоны ЕЁ видимости.
Попытавшись, вытащить за пределы main() все переменные, мне написало, что эти переменные, ВООБЩЕ НИКОМУ не принадлдежат!

Так вот в чем вопрос:
Можно ли создать функцию в функции? Если да, то как.
Если нет, то как тогда сделать ОБЩИЕ переменные, для двух( и более) функций, включая main()?

Если есть вопросы, и неясности спросите, уточню.
P.S. Пишу в Dev-C++ (хотя от VS 2008, особо не отличаются...) (доп инфа =))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2012, 20:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция, в функции main() или общие переменные для нескольких функций (C++):

Написать прогамму в которой в функцию передаються 2 переменные сравниваються и выстраиваються в порядке убывания функция main выводиться на экран - C++
Написать прогамму в которой в функцию передаються 2 переменные сравниваються и выстраиваються в порядке убывания функция main выводиться на...

Алгоритм работы функции, когда функция вызывается в main - C++
кто может кратко объяснить?

Вызвать на выполнение созданные в функции main проекта, подключив header файл с описанием созданных функций - C++
Помогите решить вот такую задачку, особые проблемы у меня возникают в работе с heder файлом. Создать библиотечный файл в котором...

Написать программу, в которой задана произвольная функция вызывается из функции main () - C++
5. Написать программу, в которой задана произвольная функция вызывается из функции main ().

Хочется чтоб функция main узнала число набитое счётчиком в функции god - C++
просмотрев кучу примеров с функциями в сети, написав различные значения функции god у меня всё никак не получается её вызвать в функции...

Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять. - C++
Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13235 / 7507 / 846
Регистрация: 27.09.2012
Сообщений: 18,444
Записей в блоге: 3
Завершенные тесты: 1
30.10.2012, 20:39 #2
Цитата Сообщение от Xipxop Посмотреть сообщение
Если нет, то как тогда сделать ОБЩИЕ переменные, для двух( и более) функций, включая main()?
Глобальные переменные (зло) или передавать как аргументы в функцию.
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.10.2012, 20:43 #3
C++ умеет замыкания (функции в функциях). Но со специфичным синтаксисом и только с С++11. Гуглите в сторону слов "лямбда" и "С++11".

Вам же, думаю, лучше подойдут объекты. У них есть поля, которые являются общими переменными для кучки функций — методов объекта.
0
Байт
Эксперт C
16063 / 10332 / 1540
Регистрация: 24.12.2010
Сообщений: 19,472
30.10.2012, 20:43 #4
Вы не в ПЛ/1 случайно раньше работали? В Сях каждая функция есть отдельная лексическая единица и вложенными они быть никак быть не могут.
Почитайте еще про область видимости.
Впрочем, я думаю что проблема не велика. Лучше на примере. Выложите ваш код (если он больше 50 строк, лучше приложить архивом)
0
Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
30.10.2012, 20:49  [ТС] #5
У меня есть функция, которая изменяет и берет сразу много переменных. (насчет их сбора непроблема int pli(int i))

Как же передать все значения, тем переменным, которые должны были изменится, и незначит, что предется создать вместо 1 функции функций 6, тк каждая будет возвращать 1 параметр, который будет присваиваться, переменной, внутри main()...
Что возможно, будет давать больше лагов чем глобалки...

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h> //очистка экрана  system("cls");
#include <conio.h>  //_getch
//#include "maps.h"   //где хранятся карты
 
using namespace std;
 
 
int main(){
 
char but;                //Сама кнопка
int ch=0;                //Номер кнопки.
int x=0,y=0; //Координаты x и y.
int xMax=15;             //Мах размер карты по X
int yMax=20;             //Мах размер карты по Y
char map[15][20];        //двумерный массив карты
char hero='O';           //Персонаж
char kyda='>';           //Куда смотрит персонаж. ^-вверх, _-вниз, >-вправо, <-Влево
char voda='~';           //вода
bool mona=true;          //Можно стрелять?
const char pyla='.';           //Пуля
int xPyla[50],yPyla[50];     //Координаты Пули
bool Rpyla[50];              //Пуля Жива?
char Kpyla[50];              //Куда летит пуля?  ^-вверх, _-вниз, >-вправо, <-Влево
char map2[15][20];       //Теневая карта
int free=0;         //свободный слот, для массивов
 
//Иницилизация массивов
for (int i=0; i<=50; i++)
{
    xPyla[i]=0;
    yPyla[i]=0;
    Rpyla[i]=false;
}
 
//Иницилизация матрицы карты
for (int i = 0; i< xMax; i++)      //Строки
{
    for (int j = 0; j< yMax; j++)  //столбцы
    {
        map[i][j] = ' ';         //То, чем карта заполняется
        map2[i][j] =' ';
    }
}
 
map[1][5]=voda;    map2[1][5]=voda;
map[1][6]=voda;    map2[1][6]=voda;
map[1][7]=voda;    map2[1][7]=voda;
map[1][8]=voda;    map2[1][8]=voda;
 
map[0][0]=hero;  //Установка на карте нашего персонажа
 
LetitPyla(){
    
    for (int i=0; i<=50; i++)
            {
              if (Rpyla[i])
              {
                if (xPyla[i]==xMax-1 || xPyla[i]==0 || yPyla[i]==yMax-1 || yPyla[i]==0)
                  {
                    map[xPyla[i]][yPyla[i]]=' ';
                    xPyla[i]=0;
                    yPyla[i]=0;
                    Rpyla[i]=false;
                  }
                if (Rpyla[i])
                {
                  if (Kpyla[i]=='_')
                  {
                    map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                    xPyla[i]++;
                    map[xPyla[i]][yPyla[i]] = pyla;
                  }
                  else if (Kpyla[i]=='^')
                      {
                        map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                        xPyla[i]--;
                        map[xPyla[i]][yPyla[i]] = pyla;
                      }
                      else if (Kpyla[i]=='>')
                          {
                            map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]++;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                          else
                          {
                            map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]--;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                }
              }
           }
}
 
while (1)
{
    system("cls"); // вызов функции очистки экрана
 
    for (int i = 0; i < xMax; i++)
    {
        for (int j = 0; j < yMax; j++)
        {
            cout << map[i][j]; // в циклах поэлементно выводится массив
        }
        cout << "\n"; // переход на новую строку после каждого "ряда"
    }
    cout << x << " " << y << "\n";
    cout << "Kod knopki: " << ch << "\n";
    cout << "Kyda smotrit pers: " << kyda << "\n";
    
    but=_getch();
    ch = static_cast<int>(but);     //узнаем какая кнопка нажата
 
    switch (ch)
    {
        case -32:
        break;
        case 27:      //Esc
            exit(0);
        break;
        case 75:     //Кнопка Влево
            if (y!=0)
            {
              if (map[x][y-1]!=voda)  //проверяем туда можно пройти
              {
                map[x][y] = map2[x][y];   // "Убираем" объект со старой координаты
                y--;               // изменяем координаты
                map[x][y] = hero;  // "рисуем" объект на новом месте
              }
            }
            kyda='<';            //Куда смотрит персонаж
            if (y==0) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 77:    //Кнопка Вправо
            if (y<19)
            {
              if (map[x][y+1]!=voda)
              {
                map[x][y] = map2[x][y];
                y++;
                map[x][y] = hero;
              }
            }
            kyda='>';
            if (y==19) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 80:    //Кнопка Вниз
            if (x<14)
            {
              if (map[x+1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x++;
                map[x][y] = hero;
              }
            }
            kyda='_';
            if (x==14) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 72:    //Кнопка Вверх
            if (x>0)
            {
              if (map[x-1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x--;
                map[x][y] = hero;
              }
            }
            kyda='^';
            if (x==0) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 32:   //ПРОбел
            if (mona)
             {
               Rpyla[free]=true;
               if (kyda=='_')
               {
                 map[x+1][y]=pyla;
                 xPyla[free]=x+1;
                 yPyla[free]=y;
                 Kpyla[free]='_';
                 free++;
                 if (free>190) {free=0;}
               }
               else if (kyda=='^')
                   {
                     map[x-1][y]=pyla;
                     xPyla[free]=x-1;
                     yPyla[free]=y;
                     Kpyla[free]='^';
                     free++;
                     if (free>190) {free=0;}
                   }
                   else if (kyda=='>')
                       {
                         map[x][y+1]=pyla;
                         yPyla[free]=y+1;
                         xPyla[free]=x;
                         Kpyla[free]='>';
                         free++;
                         if (free>190) {free=0;}
                       }
                       else 
                       {
                         map[x][y-1]=pyla;
                         yPyla[free]=y-1;
                         xPyla[free]=x;
                         Kpyla[free]='<';
                         free++;
                         if (free>190) {free=0;}
                       }
             }
             LetitPyla();
        break;
    }
}
_getch();
return 0;
}


сама функция LetitPyla()
которую я хочу "выделить" из main()
Какже я буду возвращать каждую переменную, темболее разных типо, при том, что там полно условий...?

Добавлено через 2 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
C++ умеет замыкания (функции в функциях). Но со специфичным синтаксисом и только с С++11. Гуглите в сторону слов "лямбда" и "С++11".

Вам же, думаю, лучше подойдут объекты. У них есть поля, которые являются общими переменными для кучки функций — методов объекта.
А вот, тут можно по подробнее, про Объекты?
0
Jupiter
30.10.2012, 20:49
  #6

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Вы не в ПЛ/1 случайно раньше работали?
скроее уж в JS

0
Байт
Эксперт C
16063 / 10332 / 1540
Регистрация: 24.12.2010
Сообщений: 19,472
30.10.2012, 20:53 #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
C++ умеет замыкания (функции в функциях). Но со специфичным синтаксисом и только с С++11.
Вы меня чрезвычайно расстроили Цивилизация движется, оказывается, вовсе не туда, где мне хотелось бы заниматься программизмом...
0
Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
30.10.2012, 20:53  [ТС] #8
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:


скроее уж в JS

С JS (если правильно понимаю JavaScript) я не работал, и мне он не понравился..
ПЛ/1, я не знаю что такое, (разве, что в паскале писал...)

("бред" про функцию в функции, я сам придумал =))
0
Croessmah
Эксперт CЭксперт С++
13235 / 7507 / 846
Регистрация: 27.09.2012
Сообщений: 18,444
Записей в блоге: 3
Завершенные тесты: 1
30.10.2012, 21:00 #9
А не пробовали создать класс с объектом "пуля"?
И уже его использовать? Например ту же функцию "летит пуля" сделать методом класса?
или хотя бы передавать этой функии объект со всеми параметрами
0
Байт
Эксперт C
16063 / 10332 / 1540
Регистрация: 24.12.2010
Сообщений: 19,472
30.10.2012, 21:02 #10

Не по теме:

Был у меня такой приятель - Окама. У него была бритва. Ох бы он как побрил этот С-11 ! Да и плюсам бы не поздоровилось



Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Глобальные переменные (зло)
согласен. Но выбираю меньшее
1
Croessmah
Эксперт CЭксперт С++
13235 / 7507 / 846
Регистрация: 27.09.2012
Сообщений: 18,444
Записей в блоге: 3
Завершенные тесты: 1
30.10.2012, 21:02 #11
Цитата Сообщение от Байт Посмотреть сообщение
согласен. Но выбираю меньшее
Смотря что называть меньшим =)
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.10.2012, 21:07 #12
Цитата Сообщение от Xipxop Посмотреть сообщение
А вот, тут можно по подробнее, про Объекты?
Ну вот у вас есть какая-то пила. У неё есть какое-то положение и скорость. Вы делаете класс объектов "Пила":
C++
1
2
3
4
class Saw {
    double x, y;
    double v_x, v_y;
};
Теперь каждый объект типа Saw будет таскать с собой эти четыре переменные. Можете добавить ему метод, допустим, move():
C++
1
2
3
4
5
void Saw::move(double dt)
{
    x += v_x * dt;
    y += v_y * dt;
}
А потом вызвать этот метод специально для какого-то объекта:
C++
1
2
3
Saw theSaw(1.0, 4.0, 0.1, 0.4); // создаём пилу по имени theSaw
 
theSaw.move(1.0); // для пилы theSaw прошла очередная секунда
Если этой пиле надо какая-то внешняя переменная, то создаёте в объекте поле, которое будет хранить или копию этой переменной, или ссылку на неё (смотря, чего ожидается).

Цитата Сообщение от Xipxop Посмотреть сообщение
("бред" про функцию в функции, я сам придумал =))
Это далеко не бред. Эта идея хорошо проработана и реализована далеко не в одном языке программирования лет 50 уже как.

Цитата Сообщение от Байт Посмотреть сообщение
Вы меня чрезвычайно расстроили Цивилизация движется, оказывается, вовсе не туда, где мне хотелось бы заниматься программизмом...
К чему это?..
0
Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 151
30.10.2012, 23:08  [ТС] #13
Я видно не совсем понял тебя, да и я видно не правильно понимаю реализацию Объектов, в массиве, и работа с этими объектами, и занесение их в переменные, дальнейшая работа с ними, и удаление, с заполнением удалившихся, новыми, причем, надо будет знать какая переменная где...

Короче, вот сама игра, в целости. (ну тупом, варианте немного глюченом)(нужно откомпилировать, и посмотреть, суть игры...)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h> //очистка экрана  system("cls");
#include <conio.h>  //_getch
//#include "maps.h"   //где хранятся карты
 
using namespace std;
 
int main(){
 
char but;                //Сама кнопка
int ch=0;                //Номер кнопки.
int x=0,y=0; //Координаты x и y.
int xMax=15;             //Мах размер карты по X
int yMax=20;             //Мах размер карты по Y
char map[15][20];        //двумерный массив карты
char hero='O';           //Персонаж
char kyda='>';           //Куда смотрит персонаж. ^-вверх, _-вниз, >-вправо, <-Влево
char voda='~';           //вода
bool mona=true;          //Можно стрелять?
char pyla='.';           //Пуля
int xPyla[200],yPyla[200];     //Координаты Пули
bool Rpyla[200];              //Пуля Жива?
char Kpyla[200];              //Куда летит пуля?  ^-вверх, _-вниз, >-вправо, <-Влево
char map2[15][20];       //Теневая карта
int free=0;         //свободный слот, для массивов
 
//Иницилизация массивов
for (int i=0; i<=200; i++)
{
    xPyla[i]=0;
    yPyla[i]=0;
    Rpyla[i]=false;
}
 
//Иницилизация матрицы карты
for (int i = 0; i< xMax; i++)      //Строки
{
    for (int j = 0; j< yMax; j++)  //столбцы
    {
        map[i][j] = ' ';         //То, чем карта заполняется
        map2[i][j] =' ';
    }
}
 
map[1][5]=voda;    map2[1][5]=voda;
map[1][6]=voda;    map2[1][6]=voda;
map[1][7]=voda;    map2[1][7]=voda;
map[1][8]=voda;    map2[1][8]=voda;
 
map[0][0]=hero;  //Установка на карте нашего персонажа
 
while (1)
{
    system("cls"); // вызов функции очистки экрана
 
    for (int i = 0; i < xMax; i++)
    {
        for (int j = 0; j < yMax; j++)
        {
            cout << map[i][j]; // в циклах поэлементно выводится массив
        }
        cout << "\n"; // переход на новую строку после каждого "ряда"
    }
    cout << x << " " << y << "\n";
    cout << "Kod knopki: " << ch << "\n";
    cout << "Kyda smotrit pers: " << kyda << "\n";
    
    but=_getch();
    ch = static_cast<int>(but);     //узнаем какая кнопка нажата
 
    switch (ch)
    {
        case -32:
            for (int i=0; i<=200; i++)
            {
              if (Rpyla[i])
              {
                if (xPyla[i]==xMax-1 || xPyla[i]==0 || yPyla[i]==yMax-1 || yPyla[i]==0)
                  {
                    map[xPyla[i]][yPyla[i]]=' ';
                    xPyla[i]=0;
                    yPyla[i]=0;
                    Rpyla[i]=false;
                  }
                if (Rpyla[i])
                {
                  if (Kpyla[i]=='_')
                  {
                    map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                    xPyla[i]++;
                    map[xPyla[i]][yPyla[i]] = pyla;
                  }
                  else if (Kpyla[i]=='^')
                      {
                        map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                        xPyla[i]--;
                        map[xPyla[i]][yPyla[i]] = pyla;
                      }
                      else if (Kpyla[i]=='>')
                          {
                            map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]++;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                          else
                          {
                            map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]--;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                }
              }
              else
              {
                        
              }
           }
        break;
        case 27:      //Esc
            exit(0);
        break;
        case 75:     //Кнопка Влево
            if (y!=0)
            {
              if (map[x][y-1]!=voda)  //проверяем туда можно пройти
              {
                map[x][y] = map2[x][y];   // "Убираем" объект со старой координаты
                y--;               // изменяем координаты
                map[x][y] = hero;  // "рисуем" объект на новом месте
              }
            }
            kyda='<';            //Куда смотрит персонаж
            if (y==0) {mona=false;} else {mona=true;}
        break;
        case 77:    //Кнопка Вправо
            if (y<19)
            {
              if (map[x][y+1]!=voda)
              {
                map[x][y] = map2[x][y];
                y++;
                map[x][y] = hero;
              }
            }
            kyda='>';
            if (y==19) {mona=false;} else {mona=true;}
        break;
        case 80:    //Кнопка Вниз
            if (x<14)
            {
              if (map[x+1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x++;
                map[x][y] = hero;
              }
            }
            kyda='_';
            if (x==14) {mona=false;} else {mona=true;}
        break;
        case 72:    //Кнопка Вверх
            if (x>0)
            {
              if (map[x-1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x--;
                map[x][y] = hero;
              }
            }
            kyda='^';
            if (x==0) {mona=false;} else {mona=true;}
        break;
        case 32:   //ПРОбел
            if (mona)
             {
               Rpyla[free]=true;
               if (kyda=='_')
               {
                 map[x+1][y]=pyla;
                 xPyla[free]=x+1;
                 yPyla[free]=y;
                 Kpyla[free]='_';
                 free++;
                 if (free>190) {free=0;}
               }
               else if (kyda=='^')
                   {
                     map[x-1][y]=pyla;
                     xPyla[free]=x-1;
                     yPyla[free]=y;
                     Kpyla[free]='^';
                     free++;
                     if (free>190) {free=0;}
                   }
                   else if (kyda=='>')
                       {
                         map[x][y+1]=pyla;
                         yPyla[free]=y+1;
                         xPyla[free]=x;
                         Kpyla[free]='>';
                         free++;
                         if (free>190) {free=0;}
                       }
                       else 
                       {
                         map[x][y-1]=pyla;
                         yPyla[free]=y-1;
                         xPyla[free]=x;
                         Kpyla[free]='<';
                         free++;
                         if (free>190) {free=0;}
                       }
             }
        break;
    }
}
_getch();
return 0;
}


Как же мне спокойно оттуда отсоеденить: case -32....breake; (Тоесть её внутрености)(просто этот -32, выполняется очень часто, что приводит к лагам и вылетам...)
Вот, кстати как я пытался делать, ужасно конечно... =)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h> //очистка экрана  system("cls");
#include <conio.h>  //_getch
//#include "maps.h"   //где хранятся карты
 
using namespace std;
 
class Pyla {
    int xPyla[50],yPyla[50];     //Координаты Пули
    const char pyla='.';         //Пуля
    bool Rpyla[50];              //Пуля Жива?
    char Kpyla[50];             //Куда летит пуля?  ^-вверх, _-вниз, >-вправо, <-Влево
    
    //Иницилизация массивов
    for (int i=0; i<=50; i++)
    {
      xPyla[i]=0;
      yPyla[i]=0;
      Rpyla[i]=false;
    }
};
 
void Pyla::move(char map[15][20], map2[15][20], pyla)
{
    for (int i=0; i<=50; i++)
            {
              if (Rpyla[i])
              {
                if (xPyla[i]==xMax-1 || xPyla[i]==0 || yPyla[i]==yMax-1 || yPyla[i]==0)
                  {
                    map[xPyla[i]][yPyla[i]]=' ';
                    xPyla[i]=0;
                    yPyla[i]=0;
                    Rpyla[i]=false;
                  }
                if (Rpyla[i])
                {
                  if (Kpyla[i]=='_')
                  {
                    return map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                    xPyla[i]++;
                    map[xPyla[i]][yPyla[i]] = pyla;
                  }
                  else if (Kpyla[i]=='^')
                      {
                        return map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                        xPyla[i]--;
                        map[xPyla[i]][yPyla[i]] = pyla;
                      }
                      else if (Kpyla[i]=='>')
                          {
                            return map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]++;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                          else
                          {
                            return map[xPyla[i]][yPyla[i]] = map2[xPyla[i]][yPyla[i]];
                            yPyla[i]--;
                            map[xPyla[i]][yPyla[i]] = pyla;
                          }
                }
              }
           }
}
 
int main(){
 
char but;                //Сама кнопка
int ch=0;                //Номер кнопки.
int x=0,y=0; //Координаты x и y.
int xMax=15;             //Мах размер карты по X
int yMax=20;             //Мах размер карты по Y
char map[15][20];        //двумерный массив карты
char hero='O';           //Персонаж
char kyda='>';           //Куда смотрит персонаж. ^-вверх, _-вниз, >-вправо, <-Влево
char voda='~';           //вода
bool mona=true;          //Можно стрелять?
char map2[15][20];       //Теневая карта
int free=0;         //свободный слот, для массивов
 
//Иницилизация матрицы карты
for (int i = 0; i< xMax; i++)      //Строки
{
    for (int j = 0; j< yMax; j++)  //столбцы
    {
        map[i][j] = ' ';         //То, чем карта заполняется
        map2[i][j] =' ';
    }
}
 
map[1][5]=voda;    map2[1][5]=voda;
map[1][6]=voda;    map2[1][6]=voda;
map[1][7]=voda;    map2[1][7]=voda;
map[1][8]=voda;    map2[1][8]=voda;
 
map[0][0]=hero;  //Установка на карте нашего персонажа
 
while (1)
{
    system("cls"); // вызов функции очистки экрана
 
    for (int i = 0; i < xMax; i++)
    {
        for (int j = 0; j < yMax; j++)
        {
            cout << map[i][j]; // в циклах поэлементно выводится массив
        }
        cout << "\n"; // переход на новую строку после каждого "ряда"
    }
    cout << x << " " << y << "\n";
    cout << "Kod knopki: " << ch << "\n";
    cout << "Kyda smotrit pers: " << kyda << "\n";
    
    but=_getch();
    ch = static_cast<int>(but);     //узнаем какая кнопка нажата
 
    switch (ch)
    {
        case -32:
        break;
        case 27:      //Esc
            exit(0);
        break;
        case 75:     //Кнопка Влево
            if (y!=0)
            {
              if (map[x][y-1]!=voda)  //проверяем туда можно пройти
              {
                map[x][y] = map2[x][y];   // "Убираем" объект со старой координаты
                y--;               // изменяем координаты
                map[x][y] = hero;  // "рисуем" объект на новом месте
              }
            }
            kyda='<';            //Куда смотрит персонаж
            if (y==0) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 77:    //Кнопка Вправо
            if (y<19)
            {
              if (map[x][y+1]!=voda)
              {
                map[x][y] = map2[x][y];
                y++;
                map[x][y] = hero;
              }
            }
            kyda='>';
            if (y==19) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 80:    //Кнопка Вниз
            if (x<14)
            {
              if (map[x+1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x++;
                map[x][y] = hero;
              }
            }
            kyda='_';
            if (x==14) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 72:    //Кнопка Вверх
            if (x>0)
            {
              if (map[x-1][y]!=voda)
              {
                map[x][y] = map2[x][y];
                x--;
                map[x][y] = hero;
              }
            }
            kyda='^';
            if (x==0) {mona=false;} else {mona=true;}
            LetitPyla();
        break;
        case 32:   //ПРОбел
            if (mona)
             {
               Rpyla[free]=true;
               if (kyda=='_')
               {
                 map[x+1][y]=pyla;
                 xPyla[free]=x+1;
                 yPyla[free]=y;
                 Kpyla[free]='_';
                 free++;
                 if (free>190) {free=0;}
               }
               else if (kyda=='^')
                   {
                     map[x-1][y]=pyla;
                     xPyla[free]=x-1;
                     yPyla[free]=y;
                     Kpyla[free]='^';
                     free++;
                     if (free>190) {free=0;}
                   }
                   else if (kyda=='>')
                       {
                         map[x][y+1]=pyla;
                         yPyla[free]=y+1;
                         xPyla[free]=x;
                         Kpyla[free]='>';
                         free++;
                         if (free>190) {free=0;}
                       }
                       else 
                       {
                         map[x][y-1]=pyla;
                         yPyla[free]=y-1;
                         xPyla[free]=x;
                         Kpyla[free]='<';
                         free++;
                         if (free>190) {free=0;}
                       }
             }
             LetitPyla();
        break;
    }
}
_getch();
return 0;
}



Я одного непойму, что вы все так придираетесь, к Глобалкам???
Есть одна замечательная игра: Warcraft 3, и там есть редактор карт, и там встроеный свой язык "Jass", и в нем спокойно "обитают" Глобальные переменные, и локальные переменные,(которые надо: local integer i=2 .... i=null) Почему, данная "примитивная игра", спокойно их использует, (да и думаю, многие игры, включая MMORPG, НЕ могут обойтись без Глобалок!)
0
Вложения
Тип файла: rar Tanciki.rar (285.4 Кб, 3 просмотров)
Croessmah
Эксперт CЭксперт С++
13235 / 7507 / 846
Регистрация: 27.09.2012
Сообщений: 18,444
Записей в блоге: 3
Завершенные тесты: 1
31.10.2012, 00:21 #14
Цитата Сообщение от Xipxop Посмотреть сообщение
Я одного непойму, что вы все так придираетесь, к Глобалкам???
Когда у Вас будет несколько десятков файлов в проекте, узнаете =)
0
Байт
Эксперт C
16063 / 10332 / 1540
Регистрация: 24.12.2010
Сообщений: 19,472
31.10.2012, 11:13 #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Когда у Вас будет несколько десятков файлов в проекте, узнаете =)
У меня в проекте 120 файлов (специально для вас подсчитал), использую около сотни глобальных переменных (так получилось), плюс есть еще десяток проектов, связанных с этим по общим модулям, веду этот проект 15 лет, и никаких особых неприятностей это пока не приносит.
Чтоб вас еще больше удивить, добавлю что среди глобальных есть и структурные...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2012, 11:13
Привет! Вот еще темы с ответами:

Нужна логика программы,общие понятия ,переменные - C++
Нужна программа учет оценок студентов на с++ Должно быть Окно в нем поля допустим: Реферат 90 баллов Контрольная 50 баллов Модуль...

Аргументы для функции main() - C++
Я совершенно не понял, каким образом работает, допустим вот такой фрагмент программы: int main(int argc, char **argv) { if (argc&gt;1) ...

Передать в функцию целое число. Функция заменяет его на ближайшее простое число, которое больше или меньше исходного. Вернуться в main( ) и распечатат - C++
Передать в функцию целое число. Функция заменяет его на ближайшее простое число, которое больше или меньше исходного. Вернуться в main( ) и...

Непонимание работы с аргументами для функции main - C++
Здравствуйте. В книге Лафоре в теме потоков и фалов есть пример с работой командной строки. // comline.cpp // Демонстрация работы с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.10.2012, 11:13
Ответ Создать тему
Опции темы

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