Пятница, 29 Ноября 2024, 04:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблема с передвижением в консольной, типо игре.
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)
Программа делает то, что там написано.

Это такая редкость biggrin


Многие вопросы по 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,посмотрел твой код. Проблема в этой и подобных строках
Code
  strcpy(p,p2);

strcpy копирует строку, а строки завершаются нулевым байтом, то есть в твоем случае этим нулевым байтом затирается один символ. Исправь на p[0] = *p во всех четырех местах.


Многие вопросы по Windows отпадут, если посмотреть тут
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг