Среда, 27 Ноября 2024, 01:48

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Результаты поиска
TikaraДата: Четверг, 20 Июня 2013, 13:50 | Сообщение # 1 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (pelmenka)
mega-ice-boy, рандомизатор вообще переменные не ест. Только константы или числа, написаные руками.

Не вводите людей в заблуждение пожалуйста. Оператор % работает с любыми целыми числами и вовсе не обязательно им быть константными.

Как следствие, следующий пример работает без проблем:

Код
int random(int min, int max){
  return min+rand()%(max-min);
}


Цитата (mega-ice-boy)
Ну давай покажите этот пример. КТО СМОЖЕТ?

Никто не сможет..
TikaraДата: Вторник, 18 Июня 2013, 18:30 | Сообщение # 2 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Izaron)
а с каких пор int *mas и int mas[] не эквивалентны?)

С тех пор как int *mas - это указатель, а int mas[] - это последовательность 4ёх байтовых чисел.

Код
int *mas = new int[3];


Мы выделили в памяти 4 байта под указатель и 12 байт под массив и того 16 байт.

Код
int mas[3] = {1,2,3};


Выделено ровно 12 байт.

PS Раз начали, тогда доводим до конца) Вы должны знать правду)
TikaraДата: Вторник, 18 Июня 2013, 18:15 | Сообщение # 3 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Izaron, так и думал, что ты это напишешь). Мы говорим о массивах в c++ в общем, а не об указателях на массив.

Тогда рассуждаем так, если

Код
int mas[3];


- это не есть указатель, тогда утверждение "На самом деле массивы в С++ - это указатели" не верно.

Я же на c++ это написал - верно? Это массив, так?


Сообщение отредактировал Tikara - Вторник, 18 Июня 2013, 18:15
TikaraДата: Вторник, 18 Июня 2013, 17:54 | Сообщение # 4 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (mega-ice-boy)
А что будет если использовать оператор \n вместо еndl ?

endl добавляет в буфер символ конца строки ( привет '\n' ) и вызывает метод flush для "сброса" буфера.

Цитата (Izaron)
На самом деле массивы в С++ - это указатели

int mas[3];

mas[2] - указатель? куда я указываю? Может поговорим об этом? ^^


Сообщение отредактировал Tikara - Вторник, 18 Июня 2013, 18:01
TikaraДата: Понедельник, 04 Февраля 2013, 15:20 | Сообщение # 5 | Тема: С чего начать?
частый гость
Сейчас нет на сайте
уроки по opengl

Я начинал с этих уроков. Удобно и всё по полочкам.

компилятор от интел

Если хотите просто написать именно игру, а не движок, то я бы посоветовал haaf's game engine - ооочень удобный двиг для создания 2D игр на c++. Все доки на сайте.

Для 3D могу посоветовать Unity. Конечно, это не просто движок, а ещё и целый инструмент для разработки игр, 3д сцен и прочего. Языки программирования, собственно, JavaScript и C#. Если испугались C# - ничего страшного :). У меня после плюсов изучение заняло примерно пару часов. Документация по классам и методам на офф сайте.


Сообщение отредактировал Tikara - Понедельник, 04 Февраля 2013, 15:22
TikaraДата: Понедельник, 04 Февраля 2013, 14:56 | Сообщение # 6 | Тема: Строки C++
частый гость
Сейчас нет на сайте
Код
#define COUNT_FILES 10

char *names[COUNT_FILES];

for(int i=0;i<COUNT_FILES;i++)  
     sprintf(names[i], "%d.txt", i);
TikaraДата: Суббота, 05 Января 2013, 14:42 | Сообщение # 7 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Edison6)
а более простых совсем нету?


Может и есть, но boost настолько хорош, что искать что-то отдельное просто нет необходимости.

Цитата (Edison6)
Насколько я понимаю то нужно скомпилировать эту программу в Linux чтобы она работала там и в Windows чтобы она работала под виндой.Если так то это получается необходимо ставить вторую ОС или виртуальную машину на которой компилить?


Да, всё верно. Компилите в винде и в линухе. Для линуха можно вполне виртуалку ставить - ничего плохого не произойдёт ^^
TikaraДата: Пятница, 04 Января 2013, 04:52 | Сообщение # 8 | Тема: [C++] Считывание матрицы из файла
частый гость
Сейчас нет на сайте
Цитата (netcha)
P.S. Да, кстати, в файле 25 колонок и 15 строк, как и в массиве


А обманывать нехорошо biggrin

Код

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  
1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1  
1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1  
1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1  
1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  


Остальное всё верно.
TikaraДата: Среда, 02 Января 2013, 16:04 | Сообщение # 9 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Saitei)
time = clock(); - это мы "заводим" таймер?
time = clock() - time; - а это мы его останавливаем? Я правильно понимаю?


С практической точки зрения, можно и так сказать

time = clock(); // получаем время прошедшее с момента старта программы (то есть теперь мы знаем, когда начал выполняться наш блок кода)
time = clock() - time; // теперь определяем разницу между временем в данный момент и временем, с которого начал выполняться блок кода
TikaraДата: Среда, 02 Января 2013, 14:25 | Сообщение # 10 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
goldsphere,

Ну во-первых

Код
template <int sizeX, int sizeY> class Map {   
    int a[sizeX][sizeY];   

public:   
    Map()   
    {   
     register int i, j;   
     for(i=0;i<sizeX;i++)   
      for(j=0;j<sizeY;j++)   
       a[i][j]=0;   
    }   
    int *operator[](int i) // возвращаем указатель, т.к. ссылка и указатель это разные вещи (указатель нам позволит обращаться к массиву, на который указывает массив "i")
    {   
     if(i<0 || i>size-1){   
      exit(1); // если выходим за пределы массива вываливаемся из программы? А отлаживать-то потом как? =)
     }   
     return a[i];   
    }   
};


Во-вторых, вы неправильно обьявляете ваш "массив". Очевидно, нужно так:

Код
Map< 5 , 8 > map;

map[2][5] = 7;


Сообщение отредактировал Tikara - Среда, 02 Января 2013, 14:26
TikaraДата: Среда, 02 Января 2013, 05:58 | Сообщение # 11 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Saitei)
Здавствуйте! Скажите пожалуйста, а как можно засечь время в C++? Сделать что-то вроде таймера. Хочу посмотреть за сколько секунд (или миллисекунд) функция выполняется


Можно так чисто Сишными средствами:

Код
#include <time.h>
int main(){
clock_t time;
   
time = clock();
/* вызов функции */
time = clock() - time;
return 0;
}


А можно использовать WINAPI:

Код
#include <mmsystem.h>

#pragma comment (lib, "winmm.lib")

int main(){
DWORD time = timeGetTime();
/* вызов функции */
time =  timeGetTime() - time;
return 0;
}
TikaraДата: Понедельник, 31 Декабря 2012, 20:25 | Сообщение # 12 | Тема: Классы. Как с ними работать?
частый гость
Сейчас нет на сайте
Цитата (Saitei)
line_ur* a = new line_ur();
a.ent();


Доступ к данным/методам обьекта через указатель:

Код
a->ent();


Остальное норм вроде..
TikaraДата: Суббота, 29 Декабря 2012, 18:32 | Сообщение # 13 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Animan2010)
С детства меня готовили к тому, что имя массива также является адресом первого элемента. Но если массив двумерный, то нельзя прописать char* ptr = mas, но можно char* ptr = &mas[0][0]. Почему так?


Здесь важно понять, что двумерный массив – это одномерный массив из одномерных массивов. Из этого следует, что указатель mas[i] указывает на i-тый массив.
Поэтому запись "char* ptr = mas" невозможна, так компилятор не знает какой адрес собственно нужен. В записе "char* ptr = &mas[0][0]" мы получаем указатель на первый элемент первого массива. Значит мы можем обращаться к ptr как к одномерному массиву ptr[0], ptr[1].. ptr[i], что будет эквивалетно(с точки зрения результата) mas[0][0], mas[0][1].. mas[0][i].

Такая запись верна:

char *ptr = mas[0];

ptr[3]; // = mas[0][3]

Что собственно подтверждает выше сказанное.

Надеюсь, обьяснил понятно. cool
TikaraДата: Пятница, 28 Декабря 2012, 12:13 | Сообщение # 14 | Тема: Работа с файлами
частый гость
Сейчас нет на сайте
Stealth, я бы Вам посоветовал читать/записывать файл побайтно, что в свою очередь ускорит чтение/запись файла. Но конечно же просто открыть файл блокнотом и посмотреть содержимое не получится.

Предложу такой вариант:

Код
#define BYTE unsigned char

#define NUMBER_OF_OPTIONS 5 // кол-во настроек
#define MAX_LENGTH_NICKNAME 16 // максимальная длина строки

/* Определение индефикаторов настроек для хранения */

#define GSResolution 0
     #define GSR_1024_768 0
     #define GSR_640_480 1

#define GSGraphicsMode 1
     #define GSGM_3D 0
     #define GSGM_2D 1

#define GSGraphicsQuality 2
     #define GSGQ_HIGH 0
     #define GSGQ_MEDIUM 1
     #define GSGQ_LOW 2

#define GSSoundMode 3
     #define GSSM_5_1 0
     #define GSSM_4_1 1
     #define GSSM_2_1 2
     #define GSSM_2_0 3

#define GSSoundVolume 4

void LoadSettings(char * const nickname,BYTE * const gameSettings){
  FILE *file = fopen("settings.set","rb"); // бинарное чтение

  if(!file)
   return;

  fread(nickname,sizeof(char),MAX_LENGTH_NICKNAME, file); // строка находится в начале файла - начнём чтение с неё
  fread(gameSettings,sizeof(BYTE),NUMBER_OF_OPTIONS,file);

  fclose(file);
}

void SaveSettings(const char * const nickname,const BYTE * const gameSettings){
  FILE *file = fopen("settings.set","wb"); // бинарная запись

  fwrite(nickname,sizeof(char),MAX_LENGTH_NICKNAME, file);
  fwrite(gameSettings,sizeof(BYTE),NUMBER_OF_OPTIONS,file);

  fclose(file);
}

int main(){
  char nickname[MAX_LENGTH_NICKNAME] /*= "Name"*/;
  BYTE gameSettings[NUMBER_OF_OPTIONS] /*= {GSR_1024_768,GSGM_3D,GSGQ_MEDIUM,GSSM_2_1,100}*/;

  LoadSettings(nickname,gameSettings);
  //SaveSettings(nickname,gameSettings);
   
  // Воспользуемся настройками

  printf("[ Game Settings ]\nNickname: %s\n", nickname);

  printf("Resolution: ");

  switch(gameSettings[GSResolution]){
  case GSR_1024_768:
   printf("1024x768\n");
   break;
  case GSR_640_480:
   printf("640x480\n");
   break;
  }

  printf("Graphics Mode: ");

  switch(gameSettings[GSGraphicsMode]){
  case GSGM_3D:
   printf("3D\n");
   break;
  case GSGM_2D:
   printf("2D\n");
   break;
  }

  printf("Graphics Quality: ");

  switch(gameSettings[GSGraphicsQuality]){
  case GSGQ_HIGH:
   printf("High\n");
   break;
  case GSGQ_MEDIUM:
   printf("Medium\n");
   break;
  case GSGQ_LOW:
   printf("Low\n");
   break;
  }

  printf("Sound Mode: ");

  switch(gameSettings[GSSoundMode]){
  case GSSM_5_1:
   printf("5.1\n");
   break;
  case GSSM_4_1:
   printf("4.1\n");
   break;
  case GSSM_2_1:
   printf("2.1\n");
   break;
  case GSSM_2_0:
   printf("2.0\n");
   break;
  }

  printf("Sound Volume: %d%%\n", gameSettings[GSSoundVolume]);

  // А можно изменить

  gameSettings[GSGraphicsQuality] = GSGQ_HIGH;
  gameSettings[GSSoundMode] = GSSM_5_1;

  fgetchar();

     return 0;  
}


Но если всё-таки Вам нужно будет записать файл в текстовом виде, то вот как это можно сделать:

Код
void SaveFile( const char * const settings, const char * const keys, int size ){
FILE* file = fopen("settings.txt", "wt");

fprintf(file,"[game]\n");
for(int i=0;i<size;i++)
     fprintf(file,"%s=%s", settings[i], keys[i]); // синтаксис аналогичен printf

fclose(file);
}


Конечно данная реализация будет работать не очень эффективно, но, думаю, суть ясна.
TikaraДата: Пятница, 28 Декабря 2012, 01:39 | Сообщение # 15 | Тема: Дискриминант. Работает программа некорректно...
частый гость
Сейчас нет на сайте
Код
#include <iostream>   
#include <math.h>   
using namespace std;   

int A,C;   
double B;   

int main()   
{   
setlocale(0,"Russian");   
while(true)   
{    
cout<<"Введите значения переменных A, B, C (можно через пробел)"<<'\n';   
cout<<"(A>0)"<<'\n';   
cin>>A>>B>>C;   
       if(A<=0)   
       {   
       cout<<"Сожалею, но число A("<<A<<") меньше нуля или равно нулю"<<'\n';
       continue;
       }
     
       double D = B*B - 4*A*C; // насколько я помню в формуле -4ac

       if(!D)   
       {   
       cout<<"Один корень. x = "<<-(B/(2.0*A))<<'\n';
       continue;
       }
         
       if(D<0)   
       {   
       cout<<"Решений нет"<<'\n';   
       } else {
       D = sqrt(D);   
       cout<<"Два корня. x1 = "<<(-B-D)/(2.0*A)<<"; x2 = "<<(-B+D)/(2.0*A)<<'\n';   
       }   
}   
return 0;   
}


Работает?


Сообщение отредактировал Tikara - Пятница, 28 Декабря 2012, 01:42
TikaraДата: Четверг, 27 Декабря 2012, 19:07 | Сообщение # 16 | Тема: Работа с файлами
частый гость
Сейчас нет на сайте
Цитата (Stealth)
Можете объяснить по подробнее или хотя бы где про это можно подробнее прочитать.


Тут всё зависит от задачи. Структура файла заранее известна? Если да, то можно заранее обьявить переменные и инициализировать каждую во время одной разборки файла. Если секции и ключи расположены по разному и могут иметь различные значения, то можно реализовать связный список секций и ключей, а далее выполнять поиск. Только я не знаю для чего это пригодится, только если вы не пишете свою библиотеку конечно.

Про хэшироавние можно в гугле спокойно найти всю информацию.

Цитата (Stealth)
Теперь похожая задача: нужно записать в файл значение. Как это можно сделать?


Вам нужно использовать тот же файл и вы хотите переписать значение какого-то ключа? То тогда всё просто: игра во время запуска инициализирует все переменные настроек из файла. Далее когда пользователь меняет какие-то настройки, соответствующие переменные меняют свои значения. Пользователь "жмякает" на кнопку "сохранить" и в итоге создаётся новый файл, заменяя старый, который сохраняет структуру файла настроек с новыми значениями.


Сообщение отредактировал Tikara - Четверг, 27 Декабря 2012, 19:08
TikaraДата: Четверг, 27 Декабря 2012, 16:09 | Сообщение # 17 | Тема: Работа с файлами
частый гость
Сейчас нет на сайте
Stealth, на ваш код смотреть очень больно, скажу я вам.

Код
#include <iostream>       
#include <string.h>
using namespace std;       

//-----DEBUG---------------------       

char* Read(char* file,char* section,char* key)       
{      
            FILE* f = fopen(file,"rt");       
            if(!f)       
            {       
             cout << "Can't Open file: " << file;       
             return "";       
            }       
                  
         char* tmp = new char[100];       

         while(fgets(tmp,100,f))       
         {       
          //Проверка секции       
          if(tmp[0]=='[' && strstr(tmp,section))  // из-за strstr секции, например, Sound и SoundSettings будут считаться одинаковыми, как их различить, думаю, сами допишите     
          {       
           //Поиск нужной строки (до конца файла или до новой секции)       
           while((fgets(tmp,100,f)) && (tmp[0] != '['))       
           {
            int size = strlen(tmp);
            for(int i = 0;i<size;i++)       
            {
             if(!strcmp(strtok(tmp,"="),key))       
             {       
             return strtok(NULL,"");
             }       
            }       
           }       
           cout << "Can't find key in file: " << file << '\n';       
           fclose(f);
           return "";       
          }       
         }       
         cout << "Can't find section in file: " << file << '\n';       
         fclose(f);       
         return "";       
}

//-------------------------------       

void main()       
{       
            cout << Read("Some.txt","game","d") << '\n';       
         cin.get();
}


Вот вам мой вариант. Согласитесь можно же лучше, если захотеть?

И кстати да, как выразился Уважаемый AlexeyBond, чтобы достать каждое новое значение требуется заного производить поиск в файле.

Я бы вам посоветовал прочитать весь файл и записать в память. А дальше выполнять поиск в памяти. А если секций/ключей слишком много, то можно и хеширование для поиска использовать. И тогда дело пойдёт на лад biggrin

Удачи!


Сообщение отредактировал Tikara - Четверг, 27 Декабря 2012, 16:52
TikaraДата: Четверг, 27 Декабря 2012, 12:34 | Сообщение # 18 | Тема: Помогите решить задачу по C++
частый гость
Сейчас нет на сайте
«Элементарно, Ватсон»

Код
#include <math.h>
#include <iostream>

void inc( int *m, int size, int value ){ // *m - указатель на массив, size - размер, value - значение степени   
        for(int i=0;i<size;i++) // Проходим каждый элемент массива
             m[i] = pow(m[i], value); // возводим в степень с помощью ф-ции pow( значение которое требуется возвести , степень)
}

int main(){
      int m[30]; // обьявляем массив

      // ... инициализируем массив

     int value; // обьявляем степень
     std::cin >> value; // вводим значение степени с клавиатуры в консоль

     inc(m,30,value); // "запускаем" нашу функцию

     return 0;
}


Так?


Сообщение отредактировал Tikara - Пятница, 28 Декабря 2012, 03:24
TikaraДата: Среда, 26 Декабря 2012, 12:05 | Сообщение # 19 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Y.h
Код

void funcY();
...


Z.h
Код

void funcZ();
...


X.cpp
Код

#include "Z.h"
#include "Y.h"

int main{
       funcZ();
       funcY();
       return 0;
}


Y.cpp
Код

#include "Y.h"
#include "Z.h"

void main2(){
      funcZ();
}


Z.cpp
Код

#include "Y.h"
#include "Z.h"

void main3(){
      funcY();
}


Написал ради спортивного интереса, так сказать.

Цитата (Animan2010)
Разве что объединить весь исходный код в один огромный файл остается х)


А так да. Можно вынести часть header'ов в отдельный h. Но на практике к самим хедерам нужно подключать какие-то реализации (обьектов/методов пр.), что может вылиться в бесконечный цикл включений.

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

Добавлено (26.12.2012, 12:05)
---------------------------------------------
Цитата (Animan2010)
Кстати, а может возможно дать среде разработки команду во время компиляции объединить все файлы исходного кода в один?


Точно не знаю, но думаю, что такого нет. Как раз-таки #include этим и занимается.

Можно всё спокойно вынести в один хедер, если обьявления к методам или обьектам независимы друг от друга. Вобщем, хитрости есть, но они упираются в реализацию. Универсального чего-то я предложить не могу.


Сообщение отредактировал Tikara - Среда, 26 Декабря 2012, 12:11
TikaraДата: Среда, 26 Декабря 2012, 10:58 | Сообщение # 20 | Тема: Вопрос-Ответ (C++)
частый гость
Сейчас нет на сайте
Цитата (Animan2010)
В C++, как я понимаю, include подключает конкретный файл кода Y к файлу кода X.
Можно ли сделать так, чтобы подключить файлы кода Y и Z к файлу X, но чтобы не только файл X, но и Y мог видеть содержимое файла Z? Такое возможно в движке BlitzMax, когда подключаешь целую тучу файлов к одному, то все эти файлы могут видеть содержимое друг друга, а не только тот файл, к которому они подключены.


Очевидно, что здесь можно сделать так:

Z->Y

Z && Y->X

Проблем не будет.

Но конечно же всё зависит от реализации - тут ничего не поделаешь.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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