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

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

Войти
Регистрация
Восстановить пароль
 
 
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
#1

Несколько вопросов - C++

25.04.2011, 11:58. Просмотров 920. Ответов 19
Метки нет (Все метки)

Делаю небольшую консольную игру для тренировки и есть несколько вопросов.
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
char *lev[50];
//char lev[50][320];   //как передать правильно этот массив в конструктор ниже?
 
class Level
{
    char** pl;
    COORD yx;
    int draw_x;
    int draw_y;
    int dx;
    int dy; 
    int x;
    int y;
public:
    Level(char *lev[50])   //Level(char lev[50][320]) так не работает
    {
        pl=lev;
        for(x=0;x<320;x++)
        {
            for(y=0;y<25;y++)
                pl[y][x]=' ';
        }
        for(y=5;y<15;y++) lev[y][10]=char(177);
        for(y=5;y<15;y++) lev[y][220]=char(177);
        for(x=11;x<220;x++) lev[14][x]=char(177);
 
        for(y=30;y<40;y++) lev[y][8]=char(177);
        for(y=30;y<40;y++) lev[y][210]=char(177);
        for(x=9;x<210;x++) lev[39][x]=char(177);
        draw_x=0, draw_y=0;
        dx=0,dy=0; 
        yx.X=0; yx.Y=0;
    }
    void Draw()  // вывод на экран
    {
        x=draw_x, y=draw_y;
/**/
        yx.X=10; yx.Y=0; x=draw_x, y=draw_y;
        SetConsoleCursorPosition(hConsole, yx);
        cout<<"draw_x="<<draw_x<<' '<<"draw_y="<<draw_y<< \
            ' '<<cout<<pl[my][mx];
        while(true) //vivod level
        {
            yx.X=dx; yx.Y=dy;
            if(dx==80) {dy++; dx=0; y++; x=draw_x;}
            if(dy==24 && dx==79) break;
            SetConsoleCursorPosition(hConsole, yx);
            cout<<pl[y][x]; x++; dx++;
        }
        dy=0; y=draw_y;
    }
};
просто редко сейчас пишу на С++, и некоторое подзабылось .
Поправьте пожалуйста, может какие-то строчки надо переделать?
Тоесть в том массиве будет уровень (лабиринт)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2011, 11:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Несколько вопросов (C++):

Несколько вопросов - C++
Добрый день. Начал писать одну программу в VS 2008 C++ (консоль) и столкнулся в несколькими проблемами. В общем желательно нужно, чтобы...

Несколько вопросов - C++
Здравствуйте. Возникло несколько вопросов: 1. Когда нажимаешь на определённую клавишу происходит определённое действие (типа меню)...Я на...

Несколько вопросов по извучению C++ - C++
Добрый день, товарищи!! Я немного новичек в вопросах программирования на C++, поэтому прошу строго не судить меня за мои, возможно,...

Несколько вопросов по указателям. - C++
Добрый день. Не получается до конца разобраться с указателями, потому есть несколько вопросов. Кому несложно, помогите, пожалуйста. 1....

Несколько вопросов по строкам в С - C++
Привет всем участникам форума. Изучаю С++, по пути прошел строки из С ( массивы символов ) И осталось несколько вопросов, ответов на...

Несколько вопросов к программистам. - C++
Доброго времени суток! я начинающий, последние пару месяцев делал упор на изучение Си, WinAPI и дискретной математики. Наверное, это было...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
25.04.2011, 12:09 #2
Выделяешь память, лучше динамически, под lev.
C++
1
char **lev;
C++
1
2
lev= new char*[50];
for(int i=0;i<50;i++) lev[i]=new char[320];
В новый класс передаешь lev и внутри класса обращаешься к нему lev[i][j]
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
25.04.2011, 12:21 #3
Цитата Сообщение от dimon1984 Посмотреть сообщение
Level(char *lev[50]) //Level(char lev[50][320]) так не работает
C++
1
Level(char (*lev)[320])
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
25.04.2011, 12:27  [ТС] #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char lv[50][320];   //как передать правильно этот массив в конструктор ниже?
 
class Level
{
        char** lev;
        COORD yx;
        int draw_x;
        int draw_y;
        int dx;
        int dy; 
        int x;
        int y;
public:
        Level(char (*lv)[320])
        {
                lev=lv; //как тут правильно назначить? выдаёт ошибку
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
25.04.2011, 12:39 #5
Описывай так не зависимо от того статически или динамически массив был выделен:
C++
1
Level(char **lv)
А передавай так:
C++
1
Level(lv);
или
C++
1
Level((char**)lv);
Сообщать компилятору размерность передаваемого массива не нужно, видимо именно поэтому он и не понимает что ты от него хочешь то.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
25.04.2011, 12:48  [ТС] #6
что-то не получается. Напишите плиз код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char lv[50][320];   //как передать правильно этот массив в конструктор ниже?
 
class Level
{
        char** lev;
        COORD yx;
        int draw_x;
        int draw_y;
        int dx;
        int dy; 
        int x;
        int y;
public:
        Level(char **lv)
        {
                lev=lv; //как тут правильно назначить? выдаёт ошибку
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
25.04.2011, 12:56 #7
Цитата Сообщение от dimon1984 Посмотреть сообщение
lev=lv; //как тут правильно назначить? выдаёт ошибку
C++
1
2
3
4
5
6
char (*lev)[320];
...
Level(char (*lv)[320])
{
    lev = lv; 
    ...
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
25.04.2011, 12:58 #8
dimon1984, Что конекретно не работает? Ошибку компилятор выдает или при выполнении выскакивает? На какой строке ошибка?
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
25.04.2011, 13:31  [ТС] #9
если написать, как в 6-м посте, то компилируется, но при запуске выдаёт ошибку.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
char (*lev)[320];
...
Level(char (*lv)[320])
{
    lev = lv; 
    ...
ошибка
error C2440: '=' : cannot convert from 'char (*)[320]' to 'char ** '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Добавлено через 2 минуты
или может не char lev[50][320]; использовать а что-то проще? динамически выделять?
просто хотелось разобраться, как всё-таки с char lev[50][320]; надо.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Level l(lv);
 
    while(true)
    {
        l.Draw();
    }
 
    system("pause");
    return 0;
}
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
25.04.2011, 13:37 #10
dimon1984, Вообще правильнее выделять динамически, а потом передавать в класс (как это делать я еще в первом посте написал).
Когда ты выделяешь статически, у тебя массив уничтожается после окончания процедуры, в которой был создан.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
25.04.2011, 20:32  [ТС] #11
есть класс Level и другой класс, допустим men, и из этого men надо менять переменную из класса Level. Как это организовать? чтобы не создавать в классе men обьект Level. Надо наверно static ?
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
class Level
{
protected:
    char **lev;
    COORD yx;
    static int draw_x;   //правильно? надо сделать static, чтобы менять из другого класса
    static int draw_y;
    int dx, dy; 
    int x, y;
public:
    Level()
    {
        lev= new char*[50];
        for(y=0;y<50;y++) lev[y]=new char[320];
        for(x=0;x<320;x++)
        {
            for(y=0;y<50;y++)
                lev[y][x]=' ';
        }
...
    static int Get_dx() {return draw_x;}
    static int Get_dy() {return draw_y;}
    static void add_dx() {draw_x++;}
    static void sub_dx() {draw_x--;}
    static void add_dy() {draw_y++;}
    static void sub_dy() {draw_y--;}
};
компилируется, но не линкуется:
error LNK2001: unresolved external symbol "protected: static int Level::draw_y" (?draw_y@Level@@1HA)
переменную draw_x из класса Level менял так: Level::add_dx(); из класса men

Добавлено через 33 минуты
не могу найти в книге про это, которую давненько читал, подзабыл

Добавлено через 25 минут
мне подскажут?
или может идею подкинете? Тоесть я пытаюсь из класса men при перемещении менять значение класса Level чтобы перемещался экран в соответствии движению.
Что посоветуете? Как всё-таки изменить переменную класса Level

Добавлено через 12 минут
принцип? неужели трудно подсказать?

Добавлено через 35 минут
так как там?

Добавлено через 3 часа 16 минут
поделитесь идеей пожалуйста. Допустим проверка на соприкосновение со стенками лучше в другом потоке делать?
есть управляемый символ по консоли. Что лучше запускать в отдельном потоке? Какую функцию?
Или можно не запускать отдельный поток CreateThread?
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
25.04.2011, 21:14 #12
static тебе тут нафиг не нужен....
Ты слишком много накручиваешь, все намного проще.
Из того что ты написал нифига не понятно, что такое level и какое отношение он имеет к экрану. Ты сначала составь структуру классов. определи какой класс за что будет отвечать, а потом уже кидайся программу писать.
Ты хочешь работать с массивом lev класса level из класса men?
Если обьекты классов level и men независимы, тогда создаешь эти два класса, lev заносишь в public, в men сохраняешь адрес вызываемого обьекта, и обращаешься так:
родитель->обьект level->lev

Добавлено через 1 минуту
Насчет потоков сам смотри что у тебя должно параллельно выполняться. а что можно и последовательно, нафига проверку соприкосновения со стенками выделять в поток я вообще не понимаю....может это конечно еще один метод мазохизма...
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
25.04.2011, 22:48  [ТС] #13
lev заносишь в public, в men сохраняешь адрес вызываемого обьекта, и обращаешься так:
родитель->обьект level->lev
а немного конкретней можно?
к примеру есть два обьекта
C++
1
2
Level l;
men M;
и кто здесь родитель?
Насчет потоков сам смотри
согласитесь, если бы у меня был опыт, зачем тогда я бы спрашивал у вас?
это одно из первых прог, которые я делаю. Опыта ещё маловато.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
26.04.2011, 05:13 #14
dimon1984, Я имею ввиду тот обьект, внутри которого созданы обьекты L и M. У тебя возможно это будет класс окна.
Ты толком общей структуры своей программы не понимаешь, а приводишь только куски своего кода и хочешь что бы тебе объяснили что то....

Даже если нет опыта, сам рассуди, зачем проверку выделять в поток, ты там цикл сделаешь, который будет периодически проверять значения? Не проще ли при движении обьекта проверять соприкосновение. Ты пока без потоков научись ООП применять.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
26.04.2011, 19:29  [ТС] #15
Ты пока без потоков научись ООП применять
согласен. Уже несколько раз переделывал организацию программы, т.е. классы, сначало вообще пытался без классов.
Есть метод класса проверки соприкосновения:
C++
1
2
3
4
5
6
7
    bool Get_simb(short _x, short _y, char s)
    {
        pos.Y = _y; pos.X = _x;
        ReadConsoleOutputCharacter(hConsole, &str, 1, pos, &len);
        if(str==s) return true;
        return false;
    }
и метод обработки клавиш:
C++
1
2
3
4
5
6
7
8
9
10
11
    void moves()
    {
        kl=getch();
        if(kl=='d')
        {
            if(xy.X<60 || xy.X>=60 && draw_x==240)
                {if(xy.X<79) xy.X++;}
            else if(draw_x<240)  draw_x++;
            if(mx<319) mx++;
        }
...
kl=getch(); я делаю правильно? используя kl=getch();
или что лучше использовать?
в main я пока делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
//  Level L;
    men Man(20,5,'X');
 
    while(!KEYDOWN(VK_ESCAPE))
    {
        Man.Draw();
 
//      Man.grav();
        Man.moves();
    }
тоесть пока не нажата Escape, выполняется игра.
так дело в том, я использую проверку на соприкосновение в методе void moves() обработки клавиш:
C++
1
2
3
if(!Get_simb(xy.X, xy.Y+1, char(177)) 
...
дальше обработка клавиш, как выше
при такой организации если подойти к стенке ,то человечек как бы зависает на месте, и мигает, как будто удерживается клавиша. Как надо лучше?

Добавлено через 11 часов 54 минуты
так что там на счёт kl=getch();
getch() можно использовать или что-то другое?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2011, 19:29
Привет! Вот еще темы с ответами:

Несколько простых вопросов от начинающего - C++
Здравствуйте! Мне интересны следующие вопросы: 1. Где лучше объявить переменные нужные на протяжении всей работы программы? Например...

Несколько вопросов про массив - C++
Добрый день, было задание написать программку, которая бы подсчитывала количество элементов в массиве, меньших значений C, которое вводится...

Графический редактор. Несколько вопросов - C++
Здравствуйте! Нам в вузе преподаватель дал мне курсовую графический редактор (GIF). На любом языке. Я пока думаю между C++ и Delphi. Но...

Несколько вопросов по основам программирования - C++
Вот дали вопросы по С++ ,но точного ответа так и не нашел!! Может вы чем то поможете или дадите сылочку на них!! Вот сами вопросы!! ...


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

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

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