Проблема с передвижением в консольной, типо игре.
| |
Gavolot | Дата: Пятница, 09 Марта 2012, 18:41 | Сообщение # 1 |
Последователь Тени
Сейчас нет на сайте
| Так вот, проблема в том, что он двигается более-менее корректно, без ошибок выхода из массива, даже сохраняет следующую позицию на которую должен переместиться. Но вот тут то и загвоздка, он вроде бы и хочет сохранить, но не получается сохранять нормально, то есть, он это делает через строчку. Спускаюсь вниз, он сохраняет 0 элемент, еще спускаюсь, уже не помнит, что там была точка и решетка при следующем спуске оставляет после себя пустое место, зато букву "T" благополучно сохраняет и оставляет и так далее. НО(!) тут еще не все, когда идешь вправо или влево он вообще уничтожает подчастую следующую строчку точек и превращает в пустые поля, но дело то в том, что перемещается то все корректно. Для меня очень важно понять где я прокололся, посмотрите пожалуйста у себя, скорее всего вам мастерам будет это очень легко понять, я сейчас тренируюсь с указателями и массивами... Code #include <cstdlib> #include <iostream> #include <stdio.h> #include <conio.h> #include <time.h> #include <cstring>
using namespace std; const int size = 10; char Alphabet; char lvl[size][size]; char floor;
unsigned char Cursor = 176; void redraw(); void control();
int depth, key_code, temp;
char *p, *p2;
int main() { temp = 0; floor = '.'; p2 = &floor; p = &lvl[0][0]; int i; //Изначальное построение уровня for (depth=0;depth<size;depth++) { for(i=0;i<size;i++) { if (i==0 && depth == 0){ lvl[i][depth] = '#';} else lvl[i][depth] = '.'; //Тут я добавил уровню деревьев, первое он после себя оставляет пустым полем //Второе запоминает lvl[0][2] = 'T'; lvl[0][1] = 'T'; cout<<lvl[i][depth]; } cout<<'\n'; } depth = 0;//Обнуляю глубину i = 0;//Зачем обнуляю это даже для меня загадка control();//Здесь мы запускаем функцию контроля игроком
system("PAUSE"); return EXIT_SUCCESS; } //Функция перерисовки экрана, полностью выводит заново весь массив void redraw() { system("cls"); int i; for (depth=0;depth<size;depth++) { for(i=0;i<size;i++) { cout<<lvl[i][depth]; } cout<<'\n'; } cout<<floor<<":"<<p; depth = temp; } //Функция контроля игроком void control() { static int i = 0; do{ if(kbhit()){key_code = getche();} //Идем вниз if (key_code == 115 || key_code == 235) { if (depth<9) { p = &lvl[i][depth]; //Тут и должно происходить сохранение, т.е. я //Сохраняю символ перед становлением игрока вниз в символьную //Переменную floor, далее во всех других проверках вверх, влево идет тоже самое. //Только лишь меняется depth-1 или i+1 strcpy(p,p2); p = &lvl[i][depth+1]; floor = *p; depth++; temp = depth;
lvl[i][depth] = '#'; redraw(); } redraw(); //Еще одна перерисовка, чтобы не писались буквы в тупике } //Идем вверх if (key_code == 119 || key_code == 230) { if (depth>0) { p = &lvl[i][depth]; strcpy(p,p2); p = &lvl[i][depth-1]; floor = *p; depth--; temp = depth; lvl[i][depth] = '#';
redraw(); } redraw();//Еще одна перерисовка, чтобы не писались буквы в тупике }
if (key_code == 100 || key_code == 162) { if (i<9) { p = &lvl[i][depth]; strcpy(p,p2); p = &lvl[i+1][depth]; floor = *p; i++; temp = depth; lvl[i][depth] = '#';
redraw(); } redraw();//Еще одна перерисовка, чтобы не писались буквы в тупике }
if (key_code == 97 || key_code == 228) { if (i>0) { p = &lvl[i][depth]; strcpy(p,p2); p = &lvl[i-1][depth]; floor = *p; i--; temp = depth; lvl[i][depth] = '#';
redraw(); } redraw();//Еще одна перерисовка, чтобы не писались буквы в тупике }
}while(!key_code); key_code = 0;//Обнуляем код клавишы control();//Перезапускаем контроль }
Добавлено (09.03.2012, 18:38) --------------------------------------------- Коментарии почему-то при копировании всего кода программы превратились в абро-кадабру пришлось убрать совсем.
Добавлено (09.03.2012, 18:39) --------------------------------------------- А да переменная Alphabet, пока не где не используется, она лежит для будущего морского боя.
Добавлено (09.03.2012, 18:41) --------------------------------------------- Разобраться пытался весь день, никакие бубны не вышли)
В общем что-то делаю, но пока не пойму ни как :) Тень - выражение основной сущности человека.
Сообщение отредактировал Gavolot - Пятница, 09 Марта 2012, 23:06 |
|
| |
Нохчи | Дата: Пятница, 09 Марта 2012, 21:14 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Gavolot, код очень плох. Я ничего не понял.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
horax | Дата: Пятница, 09 Марта 2012, 22:18 | Сообщение # 3 |
TheLord
Сейчас нет на сайте
| Ну, по крайней мере, - код компилируется без ошибок. Gavolot, вот твоя программа: Я прочитал код. Программа делает то, что там написано.
Dlaczego kiedy Polak pisze: "Oh baby!", Amerykanin czyta coś całkiem inne?!! ©Horax *** HVC IAM SVM
|
|
| |
Нохчи | Дата: Пятница, 09 Марта 2012, 22:21 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Quote (horax) Программа делает то, что там написано. Это такая редкость
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
horax | Дата: Пятница, 09 Марта 2012, 22:32 | Сообщение # 5 |
TheLord
Сейчас нет на сайте
| Quote (Нохчи) Это такая редкость Нохчи, объективно говоря - нет, не редкость. То есть: именно так обычно и бывает. Только ведь автор темы хочет получить нечто другое.
Dlaczego kiedy Polak pisze: "Oh baby!", Amerykanin czyta coś całkiem inne?!! ©Horax *** HVC IAM SVM
|
|
| |
Gavolot | Дата: Пятница, 09 Марта 2012, 23:08 | Сообщение # 6 |
Последователь Тени
Сейчас нет на сайте
| Я просто не как не могу понять, почему он прыгает через строчку вниз, вроде бы и сохраняет то что там было до появления игрока, но вот почему-то через раз. Но то, что он идет влево и стирает под частую нижнюю строчку для меня вообще загадка, хотя в тоже время не выходит за пределы массива, да еще и работает до конца без фатальных ошибок))) Quote Gavolot, код очень плох. Я ничего не понял. Я понимаю, я попробую прокоментировать как-то.
Добавлено (09.03.2012, 23:08) --------------------------------------------- Я код прокоментировал, может сейчас будет понятнее. Просто мой стиль программирования, если так можно сказать, пока-что воспитан с конструкторов и основ ActionScript 3.0. Поэтому проблемы пытаюсь решать примерно в том же стиле)) Но не получилось на этот раз и ни как не выходит.
В общем что-то делаю, но пока не пойму ни как :) Тень - выражение основной сущности человека.
Сообщение отредактировал Gavolot - Пятница, 09 Марта 2012, 23:16 |
|
| |
Нохчи | Дата: Суббота, 10 Марта 2012, 10:27 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| Gavolot,посмотрел твой код. Проблема в этой и подобных строках strcpy копирует строку, а строки завершаются нулевым байтом, то есть в твоем случае этим нулевым байтом затирается один символ. Исправь на p[0] = *p во всех четырех местах.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
|