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

Подскажите) - C++

Восстановить пароль Регистрация
 
GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
08.09.2010, 11:15     Подскажите) #1
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "main.h"
 
int Cycle;
 
#define MakeEven( _num ) ( _num & 0xFE )
#define Rand( _num ) (_num ? rand( ) % _num : 0)
#define EvenRand( _num ) ( Rand( _num ) & 0xFE )
#define EvenMax( _num ) ( _num & 0xFE ) 
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE )  
#define OddRand( _num ) ( Rand( _num ) | 0x01 )
#define Randomize( ) ( srand( ( unsigned ) time( NULL ) ) )
 
inline int OddBetween( int N1, int N2 )
    {  int T;  return ( T = OddRand( N2 ) ) > N1 ? T : OddBetween( N1, N2 );  }
inline int EvenBetween(int N1, int N2)
    {  int T;  return ( T = EvenRand( N2 ) ) > N1 ? T : EvenBetween( N1, N2);  }
inline int GetDirection( int width )
    {  
    int Z = Rand( 4 );
    return ( Z == 0 ? -1 : Z == 1 ? 1 : Z == 2 ? width : -width );  }
int GetRandom( int width, int height, int *x )
    {
        int Row, Col;
        Row = EvenBetween( 0, height );
        Col = EvenBetween( 0, width );
        *x = width * Row + Col;
        if( ( *x % width ) % 2 != 0 )
            GetRandom( width, height, x );
        return Cycle--;
    }
 
 
void Labirint::GenLabirint( )
    {
        std::string StrBuffer;
        std::stringstream sstrBuff;
        
        system( "cls" );
        std::cout << "\nЗАДАНИЕ РАЗМЕРА ЛАБИРИНТА\n[цифра или 'Q' для перехода в меню]\n\n";
        
        bool IsInput = true;
        while( IsInput )
            {
                StrBuffer = "";
                std::cout << "   ВЫСОТА:\t\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> Height;  Height = MakeEven( Height );  }
                    }
                else continue;
                
                StrBuffer = "";
                std::cout << "   ШИРИНА:\t\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> Width;  Width = MakeEven( Width );  }
                    }
                else continue;
                    
                StrBuffer = "";
                std::cout << "   КОЛИЧЕСТВО СТЕН:\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> WallNum;    }
                    }
                else continue;
                
                if( Height == 0 || Width == 0 )
                    { std::cout << "ОШИБКА:  Неверно заданы размеры лабиринта, повторите ввод\n\n"; continue; }
                WallNum = WallNum == 0 ? 70 : WallNum;
                
                Height++;  Width++;
                ArrSize = Height * Width;
                ARRAY = new unsigned char [ ArrSize ] ( );
                
                CreateBorder( );
                CreateDoors( );
                Randomize( );       // Инициализация рандома
                
                int X = 0, Z = 0;
                Cycle += ArrSize + ArrSize / 2;
                while( GetRandom( Width, Height, &X ) > 0 )
                    {
                        if( ARRAY[ X ] == 1 ) continue;
                        Z = GetDirection( Width );
                        do  // Здесь мы строим стену
                            {               
                                if( ARRAY[ X ] == 0 ) ARRAY[ X ] = 1; 
                                X += Z; 
                                if( Rand( 100 ) > WallNum ) break;   
                            }
                        while( ARRAY[ X ] == 0 );
                    }               
                IsInput = false;
                IsGenerated = true;
            }
 
        Display( );
        std::cout << "\n";
        system( "pause" );
    }
 
 
void Labirint::CreateBorder( )
    {
        unsigned char *TempArr = ARRAY;
        for( TempArr; TempArr - ARRAY < ArrSize; TempArr++ )
            {
                if( ( TempArr - ARRAY ) < Width ||                      // Определение первой строки
                     ( TempArr - ARRAY ) % Width == 0 ||                    // Определение левой стороны
                     ( TempArr - ARRAY ) % Width == Width - 1 ||        // Определение правой стороны
                     ( TempArr - ARRAY ) > Width * ( Height - 1 ) ) // Определение нижней границы
                      *TempArr = 1;
            }
    }
 
void Labirint::CreateDoors( )
    {
        int T;
      do { T = OddBetween( 0, Width ); }  while( T == 0 || T == Width );
      ARRAY[ T ] = 0xAA;    // вход
      do { T = OddBetween( ArrSize - Width, ArrSize ); }  while( T == ArrSize || ARRAY[ T ] == 0 );
      ARRAY[ T ] = 0xFF;    // выход
    }
обьясните турику что тут сначало деляется для чего define что такое int Cycle и так далее))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2010, 11:15     Подскажите)
Посмотрите здесь:

Подскажите C++
Подскажите C++
C++ подскажите
Подскажите C++
C++ Подскажите
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
08.09.2010, 11:37     Подскажите) #2
Цитата Сообщение от GLEB011 Посмотреть сообщение
для чего define
Прочитайте эту ссылку.

Цитата Сообщение от GLEB011 Посмотреть сообщение
int Cycle
Глобайльная переменаая.


Цитата Сообщение от GLEB011 Посмотреть сообщение
и так далее
Прочитайте что нибудь по C++, чтобы всё стало понятно.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.09.2010, 12:02     Подскажите) #3
Да, в двух словах тут не объяснишь)
GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
08.09.2010, 12:09  [ТС]     Подскажите) #4
ясненько спасибо)
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
08.09.2010, 12:19     Подскажите) #5
Первые 12 строчек опишу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Подключает файл "main.h"
#include "main.h"  
 
// Глобальная переменная т.е. эта переменная видна везде где есть её объявления(Cycle с английского переводится как цикл)
int Cycle;  
 
// ???
#define MakeEven( _num ) ( _num & 0xFE ) 
// Генерирует "случайное" число в диапозоне от 0 до _num
#define Rand( _num ) (_num ? rand( ) % _num : 0)  
// ???
#define EvenRand( _num ) ( Rand( _num ) & 0xFE ) 
// ???
#define EvenMax( _num ) ( _num & 0xFE ) 
 // ???
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE ) 
// Как мне кажется этот макрос генерирует не чётное "случайное" число от 1 до _num  
#define OddRand( _num ) ( Rand( _num ) | 0x01 ) 
// Инициализация датчика случайных чисел
#define Randomize( ) ( srand( ( unsigned ) time( NULL ) ) )
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8501 / 2168 / 61
Регистрация: 07.03.2007
Сообщений: 10,836
Завершенные тесты: 1
08.09.2010, 12:20     Подскажите) #6
GLEB011,

Не по теме:

это я вашу тему перенес, все вам правильно говорил Johny_D

GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
08.09.2010, 17:07  [ТС]     Подскажите) #7
Mencey спасибо большое=)

Добавлено через 4 часа 31 минуту
люди ну помогите полностью по програме в каком коде используется в какой переходит типы данных функции помогите пожалуста
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2010, 17:40     Подскажите)
Еще ссылки по теме:

Подскажите литературу C++
Подскажите со строками C++
C++ Подскажите с Массивом!

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

Или воспользуйтесь поиском по форуму:
rrrFer
Заблокирован
08.09.2010, 17:40     Подскажите) #8
Mencey,
дополнил ваши комментарии
C++
1
2
3
4
5
6
7
8
9
10
11
// макрос записывает в младший двоичный разряд числа ноль(число полюбому становится четным) :
#define MakeEven( _num ) ( _num & 0xFE ) 
// генерирует четное "случайное" число, при этом использует описанный [I]Mencey[/I] макрос(число в диапазоне от нуля до num) :
#define EvenRand( _num ) ( Rand( _num ) & 0xFE ) 
// абсолютно такой же как MakeEven, понятия не имею зачем автор этого творения дублирует код:
#define EvenMax( _num ) ( _num & 0xFE ) 
 // у числа последний разряд становится равным нулю(число стало четным), затем оно делится на 2, затем из результата отнимают единицу, если он нечетный. Поидее EvenMax можно было и не вызывать, т.к. при делении по умолчанию число округляется вниз и единица в младшем разряде не влияет на результат деления на 2. 
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE ) 
// Как мне кажется этот макрос генерирует не чётное "случайное" число от 1 до _num  
//верно, макрос записывает 1 в младший разряд числа, полученного от Rand, поэтому результат полюбому становится нечетным
#define OddRand( _num ) ( Rand( _num ) | 0x01 )
Добавлено через 12 минут
C++
1
2
3
inline int OddBetween( int N1, int N2 )
        {  int T;  return ( T = OddRand( N2 ) ) > N1 ? T : OddBetween( N1, N2 );  }
//inline это рекомендация компилятору подставить код функции в каждую точку ее вызова, но т.к. она рекурсивная то я сомневаюсь что компилятор таки сделает ее встроеной. Функция генерирует нечетное случайное число в диапазоне от N1 до N2 и работает через задний проход, ИМХо автор сего творенья специально писал быдлокод, т.к. случайно так небывает. Вобщем Функция требует генерировать число в диапазоне от 0 до N2 до тех пор пока оно не окажется больше N1(надо заметить что это не всегда возможно) прощегенерировать число в диапазоне от нуля до N2-N1 и прибавить его к N1 - Результат тотже, но потребляет меньше памяти, работает быстрее и снижает вероятность ошибки
Yandex
Объявления
08.09.2010, 17:40     Подскажите)
Ответ Создать тему
Опции темы

Текущее время: 23:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru