Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
1

Подтормаживающий рандом

27.07.2013, 19:56. Показов 829. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сделал простую змейку.
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <ctime>
#include <conio.h>
enum napr {up = 2, left, right, down};
napr headN = right;
napr hvostN = right;
COORD c, apple, head, hvost;
HANDLE h = GetStdHandle(-11);
int delay = 200;
int hod = 1;
int s4yot = 0;
char pole[30][25] = {0};
inline void gotoxy(int x, int y){
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(h, c);
}
inline void gotoxy(COORD x){
    gotoxy(x.X, x.Y);
}
void ris(){
    system("cls");
    for(int i=0; i<25; i++){
        for(int j=0; j<30; j++){
            if(i==0 || i==24 || j==0 || j==29){
                std::cout<<(char)219;
                pole[j][i] = 1;
            }
            else std::cout<<' ';
        }
        if(i<24)std::cout<<std::endl;
    }
    gotoxy(35, 3);
    std::cout<<"$ "<<s4yot;
    head.X = 14;
    head.Y = hvost.Y = 12;
    hvost.X = 13;
    pole[14][12] = pole[13][12] = right;
    gotoxy(head);
    std::cout<<'#';
    gotoxy(hvost);
    std::cout<<8;
}
void new_apple(){
    while(1){
        srand((int)time(0));
        apple.X = rand()%28 + 1;
        apple.Y = rand()%23 + 1;
        if(pole[apple.X][apple.Y] == 0){
            pole[apple.X][apple.Y] = 6;
            gotoxy(apple);
            std::cout<<'@';
            break;
        }
    }
}
int main(){
    setlocale(0, "ASCII");
    ris();
    char kn;
    new_apple();
    while(1){
        gotoxy(head);
        std::cout<<'8';
        if(kbhit()){
            kn = getch();
            switch(kn){
            case 'w':
            case (char)230:
                if(headN == down) break;
                headN = up;
                pole[head.X][head.Y] = up;
                break;
            case 'd':
            case (char)162:
                if(headN == left) break;
                headN = right;
                pole[head.X][head.Y] = right;
                break;
            case 's':
            case (char)235:
                if(headN == up) break;
                headN = down;
                pole[head.X][head.Y] = down;
                break;
            case 'a':
            case (char)228:
                if(headN == right) break;
                headN = left;
                pole[head.X][head.Y] = left;
            }
        }
        switch(headN){
        case up:
            head.Y--;
            break;
        case right:
            head.X++;
            break;
        case down:
            head.Y++;
            break;
        case left:
            head.X--;
        }
        if(pole[head.X][head.Y] > 0 && pole[head.X][head.Y] < 6)
            break;
        gotoxy(head);
        std::cout<<'#';
        pole[head.X][head.Y] = headN;
        if(apple.X == head.X && apple.Y == head.Y){
            new_apple();
            s4yot += (1013 - hod * 13);
            if(s4yot > 15000 && s4yot < 30000) delay = 150;
            if(s4yot >= 30000 && s4yot < 50000) delay = 100;
            if(s4yot >= 50000) delay = 50;
            gotoxy(37, 3);
            std::cout<<s4yot;
            hod = 1;
        }
        else{
            gotoxy(hvost);
            std::cout<<' ';
            pole[hvost.X][hvost.Y] = 0;
            switch(hvostN){
            case up:
                hvost.Y--;
                break;
            case right:
                hvost.X++;
                break;
            case down:
                hvost.Y++;
                break;
            case left:
                hvost.X--;
                break;
            }
            hvostN = (napr)pole[hvost.X][hvost.Y];
        }
        hod++;
        if(hod > 51) hod = 51;
        Sleep(delay);
    }
    gotoxy(35, 12);
    std::cout<<"GAME OVER";
    std::cin.get();
}
Во время игры изредка случается ощутимое (четверть секунды примерно) подтормаживание при генерации нового яблока. Я что-то не так сделал с рандомом или так и должно быть?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2013, 19:56
Ответы с готовыми решениями:

Рандом
Нужна помощь!!!! Вот исходный код: #include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;iostream&gt;...

Рандом
возникла проблема - я создал массив, состоящий из десяти рандомных чисел. Только вот рандомными они...

рандом
Нижно массив заполнить рандомом #include &quot;stdafx.h&quot; #include &lt;iostream&gt; int _tmain(int...

рандом
подскажите что не так #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using...

15
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
27.07.2013, 21:09 2
У меня ни чего не тормозит 20000+ набрал
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
27.07.2013, 21:16 3
Бендерродригез, ещё бы! Вы поставили бесконечный цикл с выходом только в том случае, когда случайным образом программа сможет поставить яблоко в место, где нет змеи. Теоретически, программа может навечно зависнуть при первом же ходе, ведь пусть даже поле и 23 на 28, а значит кол-во вариантов 23*28, все равно может выпасть подряд over9000 числа 1х1, где расположена змейка (на то он и рандом). Что уж говорить о том, если змея будет занимать, допустим, 95% поля (не так уж и сложно это сделать) - вот уж где точно может намертво зависнуть.
Как вариант, сделайте массив свободных клеток и уже затем rand() % massiveOfFreeCells.size()
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
27.07.2013, 21:41  [ТС] 4
Цитата Сообщение от nexen Посмотреть сообщение
Как вариант, сделайте массив свободных клеток и уже затем rand() % massiveOfFreeCells.size()
Я так понимаю, вектор надо к этому делу приспособить, а то с простым массивом поменяю шило на мыло? Просто недавно только с этой темой начал ознакомляться.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
27.07.2013, 22:12 5
Бендерродригез, ну да, можно вектор. Хотя за эффективность подобного способа не ручаюсь, возможно, что можно ещё лучше сделать, но проблем с неопределенной скоростью рандомизации яблока больше не будет
1
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
27.07.2013, 22:22 6
Цитата Сообщение от VLK Посмотреть сообщение
ни чего не тормозит
Бендерродригез, У меня кстати тоже, всё окай, не тормозит
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
27.07.2013, 22:32  [ТС] 7
Даниил1991, дебаг или релиз версия?
Сейчас проверил релиз - да, тормоза отсутсвуют, но ситуация, указанная nexen, таки вполне реальна.
0
68 / 41 / 1
Регистрация: 14.05.2013
Сообщений: 383
27.07.2013, 22:45 8
Да я и не оспариваю, возможно всё
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:03 9
В твоей змейке уже есть 1 недоработка. Попробуй двигаться по вертикале, и зажать клавишу W. Змейка начнет быстрей передвигаться.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
28.07.2013, 17:23  [ТС] 10
Bend3r, недоработок там, ясное дело, полно, но никакого ускорения я не наблюдаю. Может, тебе просто кажется? Скорость движения зависит не от нажатия кнопки, а от заданного времени простоя программы.
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:25 11
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Bend3r, недоработок там, ясное дело, полно, но никакого ускорения я не наблюдаю. Может, тебе просто кажется? Скорость движения зависит не от нажатия кнопки, а от заданного времени простоя программы.
char pole[30][25] = {0};
У тебя массивы не равны. Движение в любом случае будет не равное.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
28.07.2013, 17:30  [ТС] 12
Bend3r, а поподробней? Какая связь между размерностью массива и скоростью?
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:37 13
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Bend3r, а поподробней? Какая связь между размерностью массива и скоростью?
Елементарно, по вашим данным по вертикале нужно пройти 30 шагов, по горизонтали 25. Ну так вот змейка быстрей будет двигаться, т.к ей нужно будет пройти меньшее кол-во шагов. Получается и скорость у нее будет быстрей.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
28.07.2013, 17:42  [ТС] 14
Bend3r, я не так понял, значит.
А ещё по вертикали символы шире, поэтому скорость перемещения кажется больше. Я-то думал, разговор о програмном ускорении по вертикали. Но на то она и консоль.
Если можно сделать символы квадратными, то как?
0
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:44 15
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Bend3r, я не так понял, значит.
А ещё по вертикали символы шире, поэтому скорость перемещения кажется больше. Я-то думал, разговор о програмном ускорении по вертикали. Но на то она и консоль.
Если можно сделать символы квадратными, то как?
Символы одинаковые, но когда двигаешься по вертикале, между символами есть пробел вроде как.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
28.07.2013, 17:48  [ТС] 16
Bend3r, да даже по окантовке видно, что по вертикали размер больше.
А вот квадратные символы - это действительно интересно.
0
28.07.2013, 17:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2013, 17:48
Помогаю со студенческими работами здесь

Рандом в С++
Привет! Может ли кто-нибудь объяснить как сделать рандом в С++, нужно сделать просто генератор...

Рандом
Как проще всего рандомно разыграть для переменной значение 1 или 0....?

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

Использование рандом
Доброго времени суток. Нужно включить использование рандома #include &lt;cmath&gt; //......


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru