Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2010, 08:51   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Слепая функция

В текстовом квесте игрок должен иметь возможность передвигаться по игровому миру, как я уже говорил в более ранних темах.
Для начала введение.

1) Есть класс игрока

Код:
class player{
public:
  int crd; //Координата игрока, всего одна (вертикальная), для упрощения
    player(int p_crd){crd=p_crd;}//Конструктор
};
Есть класс локации, из которых состоит игровой мир. Он наследует от класса word параметры name и description.

Код:
class location: public word{//Локации в игре
public:
  int crd; //Координата локации
  location(int l_crd, const wchar_t l_name[16], const wchar_t l_description[100]){wcscpy(name, l_name); wcscpy(description, l_description); crd=l_crd;} //Конструктор
};
Далее конструируются объекты локации, распологающиеся по оси y так: docks(1,L"Причал",L"Описание"), house(0,L"Хижина",L"Описание"), beach(-1,L"Пляж",L"Описание")

2) Есть функции, тесно связанные с классами.

Во-первых, это анализ введённых команд:
Команда состоит из двух частей - part1(действие), part2(объект)

Код:
void Analysis(int* y, player smone, wchar_t part1[10],wchar_t part2[10]){
/*Посмотреть*/if(wcsncmp(part1,look.name,4)==0) LookAt(part2);
/*Взять*/     if(wcsncmp(part1,take.name,4)==0) Take(part2);
/*Идти*/      if(wcsncmp(part1,go.name,3)==0)   GoTo(y, smone, part2);
/*Плыть*/     if(wcsncmp(part1,swim.name,3)==0)
                {if(smone.crd=house.crd)wprintf(L"Здесь негде плавать.\n");
                 else wprintf(L"В этом море опасно плавать.\n");}
/*Help*/      if(wcsncmp(part1,help.name,3)==0) Briefing();
if((wcsncmp(part1,look.name,4)!=0)&&(wcsncmp(part1,take.name,4)!=0)&&(wcsncmp(part1,go.name,4)!=0)&&(wcsncmp(part1,swim.name,4)!=0))
                 wprintf(L"Ваша команда введена с ошибкой.\n");
}
действия и объекты, как видите, тоже заранее сконструированы при помощи соответствующих классов, но, поскольку в данной области моя программа работает корректно, я не буду о них распинаться.
int* y в параметре функции - это указатель на переменную crd в классе player.

Далее есть функция для изменения координат игрока:

Код:
void GoTo(int* y, player smone, wchar_t part2[10]){
/*Север*/    if(wcsncmp(part2,north.name,4)==0){if(smone.crd<docks.crd) *y++; else wprintf(L"Дальше некуда идти. Кругом море.\n");}
/*Юг*/       if(wcsncmp(part2,north.name,4)==0){if(smone.crd>beach.crd) *y--; else wprintf(L"Дальше некуда идти. Кругом море.\n");}
/*Восток и*/ if((wcsncmp(part2,east.name,4)==0)||(wcsncmp(part2,west.name,4)==0)){if(smone.crd==house.crd) printf("Здесь стена.\n");
/*запад*/									  else wprintf(L"Дальше никуда идти. Здесь стена.\n");}
/*Ошибка*/if((wcsncmp(part2,north.name,4)!=0)&&(wcsncmp(part2,south.name,4)!=0)&&(wcsncmp(part2,east.name,4)!=0)&&(wcsncmp(part2,west.name,4)!=0))
    wprintf(L"Куда идти?\n");
}
Объекты north, south, west, east - объекты класса object, но и с ними программа работает корректно. Как видите, функция GoTo проверяет сначала, в каком направлении менять координаты, проверяте, можно ли их изменить, а затем через указатель уменьшает или увеличивает их.

И последний - это функция GameLopp, как бы тело игры:

Код:
void GameLoop(){
  player hero(1);
  int* y=&hero.crd;
  for(;;){
    wchar_t part1[10],part2[10];
   wprintf(L"Ваши координаты %d\n",hero.crd);
   wprintf(L"Введите команду ---> "); wscanf(L"%S%S",part1,part2); printf("\n");
    if(wcsncmp(part1,BbIXOD.name,3)==0)break;
    else Analysis(y, hero, part1,part2);}
}
Здесь уже создаётся игрок при помощи класса, создаётся указатель на координату игрока, а затем запускается бесконечный цикл. Если в качестве команды введено "выход", то цикл обрывается.
Теперь у Analysis и GoTo есть и объект класса player, и указатель на его переменную crd.
Программа грамотно реагирует на команды, но почему-то GoTo не изменяет координаты, хотя сравнивает их и всё понимает. Но координаты остаются неизменными, таков факт. Что же это за напасть? Я же использую указатель, в чём беда?

Последний раз редактировалось MaTBeu; 07.02.2010 в 15:16.
Кипящий чайник вне форума Ответить с цитированием
Старый 07.02.2010, 11:37   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Постфиксный инкремент имеет более высокий приоритет, чем оператор разыменовывания. Вместо
Код:
*y++;
нужно писать
Код:
(*y)++;
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.02.2010, 12:17   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Странно, но твоё исправление внесло какую-то путаницу в программу. Если координата равняется нулю, она и вовсе не меняется, а если -1 или 1, то на команду идти на юг (тое есть уменьшить координату) не откликается, как и раньше, а на север (увеличение координаты) реагирует неординарным образом, превращая 1 в 0 и переставая далее откликаться на команды "иди туда-то".
Кипящий чайник вне форума Ответить с цитированием
Старый 07.02.2010, 12:29   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Надо полагать, идти на юг оно не хочет, потому что
Код:
*y--;
так и осталось без скобок:
Код:
(*y)--;
Почему из нуля не хочет идти - так и не понял. Да и вообще, разобраться в написанном здесь трудно. Используйте тег CODE и, желательно, отступы. Да и несколько инструкций в одной строке - вещь малочитабельная...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.02.2010, 13:48   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

При всём моём уважении, что вы со мной, как с дауном? Конечно же, я обе операции исправил. А почему с нуля никуда не ходит - ну я сам не понимаю. Потому и спрашиваю. Попробую, конечно, код в божеский вид привести, не знаю только, чем это поможет.
Итак, вопрос остаётся нерешённым.

Последний раз редактировалось Кипящий чайник; 08.02.2010 в 09:31.
Кипящий чайник вне форума Ответить с цитированием
Старый 07.02.2010, 15:16   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Зачем вообще нужен y, если он является тем же самым, что и smone.crd? Почему нельзя менять напрямую этот самый smone.crd и не заморачиваться с указателями?
pu4koff вне форума Ответить с цитированием
Старый 07.02.2010, 15:21   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
При всём моём уважении, что вы со мной, как с дауном?
С вами общаются нормально. Если у вас комплекс неполноценности или неадекватное восприятие мира - вам не сюда, а к психологу. Скажите спасибо за то, что человек уделил время вашей проблеме, вместо того, чтобы обвинять его в плохом обращении.
MaTBeu вне форума Ответить с цитированием
Старый 08.02.2010, 09:24   #8
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

MaTBeu То, что я сказал - это упомянуто вскользь, я никого ни в чём не обвиняю, и внимания на этом я не акцентирую. Да и вы бы не подливали масла в огонь своими выпадами - эта тема о не о манерах общения и советах психически нездоровому человеку. И если вы думаете, что я не благодарен вам, вашему форуму и, в частности, товарищу Грому, за многочисленные и полезные советы, то вы глубоко заблуждаетесь.

pu4koff Я раньше пробовал напрямую, но опять-таки ничего не менялось. Теперь попробовал передать функции указатель, вспомнил учебник. Но, как видите, снова мистика.
Я думаю, может, стоит винить компилятор g++? Конечно, это ошибочно со стороны хелловордщика рассуждать о том, что беспорядок не в голове, а в компьютере, но фишка в том, что этот компилятор уже откалывал со мной злые шутки, багуя самые простые вещи.

Последний раз редактировалось Кипящий чайник; 08.02.2010 в 09:26.
Кипящий чайник вне форума Ответить с цитированием
Старый 09.02.2010, 18:39   #9
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Я сверялся с учебником, и, казалось, нашёл суть проблемы - неправильно передавал указатель функции. Вот пример:

Код:
void f(int* i);
int i;
f(&i);
Я исправил, как бы следовало, но пользы ноль.

Последний раз редактировалось Кипящий чайник; 09.02.2010 в 18:42.
Кипящий чайник вне форума Ответить с цитированием
Старый 09.02.2010, 21:08   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Сразу вывалили кучу кода и текста. Зачем оно нам ?
2. Опишите кусок кода (не большой, отсейте не нужное) где у вас проблемы (возможные)
3. По посту #9 - вот такие вот мелочи, опять таки, мы не видим и не известно где вызываются f(&i) и где расположена int i;
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция в VB asd48 Помощь студентам 1 25.12.2008 23:29
Функция asd48 Помощь студентам 2 21.12.2008 17:17
функция sergei64_89 Общие вопросы C/C++ 2 25.05.2008 16:48
Функция в c++ JOFRIF Помощь студентам 1 08.05.2008 18:30
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50