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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
#1

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

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

Сделал простую змейку.
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++
подскажите что не так #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; int main() ...

Рандом в табилце - C++
Народ я только только начал учить C++ работаю в qt cretor вопрос такой: Есть таблица 10 на 10 как сделать так что бы в ней рандомно...

Рандом растет - C++
srand(time(0)); int j=rand()%1000; char s=&quot;afasfa&quot;; switch (message) /* handle the messages */ ...

Структура и рандом. - C++
у меня в структуре есть пять типов данных struct Dzho { int pid; double burst; int priority; int working; int waiting; ...

Другой рандом - C++
Есть некоторое беззнаковое целое N, нужна рандомная последовательность не повторяющихся беззнаковых целых меньше N. Длина...

Про рандом - C++
Как с++ одномерный массив из 10 элементов прорандомить так ,чтобы все элементы массива в сумме давали 1000 и были положительными (ноль...

Неправильный рандом - C++
Здравствуйте. Программа должна заполнять массив случайными, не повторяющимися элементами. Однако не смотря на то что максимальное значение...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:03     Подтормаживающий рандом #9
В твоей змейке уже есть 1 недоработка. Попробуй двигаться по вертикале, и зажать клавишу W. Змейка начнет быстрей передвигаться.
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
28.07.2013, 17:23  [ТС]     Подтормаживающий рандом #10
Bend3r, недоработок там, ясное дело, полно, но никакого ускорения я не наблюдаю. Может, тебе просто кажется? Скорость движения зависит не от нажатия кнопки, а от заданного времени простоя программы.
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
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
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:37     Подтормаживающий рандом #13
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Bend3r, а поподробней? Какая связь между размерностью массива и скоростью?
Елементарно, по вашим данным по вертикале нужно пройти 30 шагов, по горизонтали 25. Ну так вот змейка быстрей будет двигаться, т.к ей нужно будет пройти меньшее кол-во шагов. Получается и скорость у нее будет быстрей.
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
28.07.2013, 17:42  [ТС]     Подтормаживающий рандом #14
Bend3r, я не так понял, значит.
А ещё по вертикали символы шире, поэтому скорость перемещения кажется больше. Я-то думал, разговор о програмном ускорении по вертикали. Но на то она и консоль.
Если можно сделать символы квадратными, то как?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2013, 17:44     Подтормаживающий рандом
Еще ссылки по теме:

Рандом rand - C++
Решаю задачу из одной книги, так там нужно чтоб пользователю выбивало число (номер счета), не обязательно рандомное, но я решил что лучше...

Рандом с шагом - C++
Всем доброго времени суток. Пытаюсь сделать программу, которая выдаёт рандомные числа, с помощью rand(), c определенным шагом. Изучаю язык...

Не повторяющий рандом - C++
Переменная rnd генерирует числа от 1 до 5 Как сделать, чтобы при выводе в консоли цифры не повторялись?

Рандом в границах - C++
нужен рандом, выдающий числа от 58 до 64. Именно через стандартрую рандом или рандомайз..

Массив и рандом - C++
2. Дан одномерный массив, состоящий из N целочисленных элементов. 2.1. Заполнить массив случайными числами. 2.2. Найти минимальный...


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

Или воспользуйтесь поиском по форуму:
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
28.07.2013, 17:44     Подтормаживающий рандом #15
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Bend3r, я не так понял, значит.
А ещё по вертикали символы шире, поэтому скорость перемещения кажется больше. Я-то думал, разговор о програмном ускорении по вертикали. Но на то она и консоль.
Если можно сделать символы квадратными, то как?
Символы одинаковые, но когда двигаешься по вертикале, между символами есть пробел вроде как.
Yandex
Объявления
28.07.2013, 17:44     Подтормаживающий рандом
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru