Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

рандом - C++
Нижно массив заполнить рандомом #include &quot;stdafx.h&quot; #include &lt;iostream&gt; int _tmain(int argc, _TCHAR* argv) { double a...

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

рандом - C++
подскажите что не так #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; int main() ...

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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