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

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

Восстановить пароль Регистрация
 
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
27.07.2013, 19:56     Подтормаживающий рандом #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
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();
}
Во время игры изредка случается ощутимое (четверть секунды примерно) подтормаживание при генерации нового яблока. Я что-то не так сделал с рандомом или так и должно быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 19:56     Подтормаживающий рандом
Посмотрите здесь:

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

Рандом C++
C++ Рандом
C++ Рандом

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

Или воспользуйтесь поиском по форуму:
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
28.07.2013, 17:48  [ТС]     Подтормаживающий рандом #16
Bend3r, да даже по окантовке видно, что по вертикали размер больше.
А вот квадратные символы - это действительно интересно.
Yandex
Объявления
28.07.2013, 17:48     Подтормаживающий рандом
Ответ Создать тему
Опции темы

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