Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22
1

Sfml. Не могу найти ошибку в программе

16.04.2017, 09:30. Показов 2344. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я написала программу, вот ее условие:Вдоль нижнего края графического окна строится от 5 до 15 (количество определяется пользователем) прямоугольников одинаковой ширины и случайной высоты, не превышающей половины высоты графического окна. У верхнего края окна в случайном месте появляется окружность заданного пользователем радиуса и движется с некоторой постоянной скоростью вниз стирая все на своем пути. Как только она достигает нижнего края окна, окружность уничтожается, и у верхнего края появляется новая (вновь в случайном месте). Так продолжается заданное пользователем число раз."

Но при вводе размера круга от 1-20, программа лагает, я уже весь мозг сломала(((
Вот код:
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
#include <SFML/Graphics.hpp> 
#include <stdio.h> 
#include <math.h> 
#include<locale.h> 
 
#define Box_X 400 
#define Box_Y 400 
#define Max_B 200 
#define Min_B 30 
#define Max_V 3 
#define Min_V 1 
 
#define MaxFrameRate 60//скорость обновления окна 
 
int main() 
{ 
 setlocale(LC_ALL, "Russian"); 
 int col1, col2, col3, R; 
 int col11, col22, col33; 
 
 int kolvo = 0, k, j = 0, i = 0; //Kolvo - количество появлении круга, k - количество прямоугольников 
 float height = 0.0, vx = 0, vy = 1.5, x = 0, y = 0, x1 = 0, y1 = 0, d = 0;//высота прямоугольника 
 
                    //Ввод пользователя для круга 
 printf("Введите количество появлении круга уничтожителя: "); 
 scanf("%d", &kolvo); 
 
 printf("\nВведите радиус круга-уничтожителя: \n "); 
 while ((scanf("%d", &R) != 1) || R < 0) 
 { 
  printf("Неверные данные, попробуйте снова\n"); 
  continue; 
 } 
 
 //Ввод пользователя для прямоугольников 
 printf("Введите количество прямоугольников от 5 до 15: "); 
 while (scanf("%d", &k) != 1 || ((k < 5) || (k > 15))) 
 { 
  printf("Неверные данные, попробуйте снова\n"); 
  continue; 
 } 
 
 //Создание окна 
 sf::RenderWindow window(sf::VideoMode(Box_X, Box_Y), "Anime"); 
 
 //Устанока скорости обновления окна 
 window.setFramerateLimit(MaxFrameRate); 
 srand(time(0)); 
  
 //Создание окружности 
 sf::CircleShape shape; 
 
 shape.setRadius(R); 
 // Случайный цвет для круга 
 col1 = 0 + rand() % (255); 
 col2 = 0 + rand() % (255); 
 col3 = 0 + rand() % (255); 
 
 shape.setPosition(rand() % Box_X, 0); 
 shape.setFillColor(sf::Color::Color(255, col2, col3)); 
 i = 0; 
 
 //Создание прямоугольника 
 sf::RectangleShape rectangle[15]; 
 for (j = 0; j<k; j++) 
 { 
  //случайная высота не превышающий половину высоты окна 
  height = rand() % 250; 
  d = 64; 
  rectangle[j].setSize(sf::Vector2f(64, height)); 
 
  //Случайный цвет для прямоугольников 
  col11 = 0 + rand() % (255); 
  col22 = 0 + rand() % (255); 
  col33 = 0 + rand() % (255); 
  rectangle[j].setFillColor(sf::Color::Color(col11, col22, col33)); 
  y = Box_Y - height - 2; 
  x = x + 64; 
  //позиция прямоугольника 
  rectangle[j].setOutlineThickness(0); 
  rectangle[j].setPosition(x, y); 
 
 } 
 
 //Очистка окна 
 window.clear(); 
 //Вывод окна на экран 
 window.display(); 
 
// цикл выполняется пока окно открыто 
 while (window.isOpen()) 
 { 
  //Обработка события "закрытия окна" 
  sf::Event event; 
  while (window.pollEvent(event)) 
  { 
   if (event.type == sf::Event::Closed) 
    window.close(); 
  } 
 
  window.clear(); 
 for (j = 0; j<k; j++) 
  { 
   window.draw(rectangle[j]); 
 
   if (((rectangle[j].getPosition().y - shape.getPosition().y) < R * 2) && ((abs(shape.getPosition().x - rectangle[j].getPosition().x)) < R * 2)) 
   { 
    rectangle[j].setSize(sf::Vector2f(0, 0)); 
 
    if ((shape.getPosition().y + vy>Box_Y) || (shape.getPosition().y + vy<0)) 
    { 
     shape.setPosition(rand() % Box_X, 0); 
    } 
   } 
 
  }shape.move(vx, vy); 
  window.draw(shape); 
  window.display(); 
 }window.close(); 
 
 return 0; 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2017, 09:30
Ответы с готовыми решениями:

Не могу найти ошибку в программе(для просмотра картинок):кнопка НАЗАД не работает(не становится активной) Найдите ошибку.

Не могу найти ошибку в программе
Разложение числа на сумму двух квадратов &quot;for(a=o;a&lt;=floor(sqrt(W));x++); ...

Не могу найти ошибку в программе
var S,x,xk:real; k:integer; begin writeln('Введите х'); readln(x); S:=0; xk:=x; for k:=0 to...

не могу ошибку найти в программе
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; ...

8
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
16.04.2017, 09:50 2
Цитата Сообщение от KiraBush Посмотреть сообщение
C++
1
2
3
4
5
while ((scanf("%d", &R) != 1) || R < 0) 
{ 
printf("Неверные данные, попробуйте снова\n"); 
continue; 
}
- сомнительная конструкция.
1) Если мы введем одно число, независимо от того меньше оно или больше нуля мы все равно полйчим сообщение "Неверные данные, попробуйте снова";
2) В строке while() - непонятно, когда сравнивается 1-е условие и когда мы получаем R и сравниваем 2-е условие.
И таких циклов у Вас оооооооочень много.
Этот ввод делается по другому. Введите отдельно R. Потом смотрите что получили и проверяйте границы. И так в цикле пока не введется нормальное R.

Добавлено через 1 минуту
continue тут кстати не имеет смысла, т.к. цикл уже сам собой переидет в начало.

Добавлено через 40 секунд
2 по программированию.
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22
16.04.2017, 09:54  [ТС] 3
DemolitionMan, блиииин, ты не можешь исправить код пожалуйста?��
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
16.04.2017, 09:55 4
Цитата Сообщение от KiraBush Посмотреть сообщение
DemolitionMan, блиииин, ты не можешь исправить код пожалуйста?��
а ты не можешь добавить код в [ CPP][ /CPP]
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
16.04.2017, 09:57 5
Шутка, а если серьезно, то делается примерно так:
C++
1
2
3
4
5
6
7
int InputDigits = 0;
 
do{
printf("Введите радиус окружности R:");
InputDigits = scanf("%d", &R);
}
while((R <= 0)||(InputDigits != 1));
0
Неэпический
17871 / 10636 / 2054
Регистрация: 27.09.2012
Сообщений: 26,738
Записей в блоге: 1
16.04.2017, 10:07 6
Цитата Сообщение от KiraBush Посмотреть сообщение
Но при вводе размера круга от 1-20, программа лагает
Что значит "лагает"? Подробнее.
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22
16.04.2017, 10:07  [ТС] 7
Croessmah, круг не уничтожает прямоугольники и повторно не появляется
0
Неэпический
17871 / 10636 / 2054
Регистрация: 27.09.2012
Сообщений: 26,738
Записей в блоге: 1
16.04.2017, 10:24 8
Лучший ответ Сообщение было отмечено KiraBush как решение

Решение

KiraBush, так у Вас формула определения пересечения неверная.
Переделал под пересечение ограничивающих прямоугольников.
Точнее лень писать. Так что понавтыкал костылей:
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
  window.clear();
 for (j = 0; j<k; j++)
  {
   window.draw(rectangle[j]);
   if (kolvo == 0) {
      continue;
   }
   if (shape.getGlobalBounds().intersects(rectangle[j].getGlobalBounds()))
   {
    rectangle[j].setSize(sf::Vector2f(0, 0));
   }
   if ((shape.getPosition().y + vy>Box_Y) || (shape.getPosition().y + vy<0))
   {
    shape.setPosition(rand() % Box_X, 0);
    --kolvo;
   }
 
  }
  if (kolvo > 0) {
      shape.move(vx, vy);
      window.draw(shape);
  }
 
  window.display();
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 22
16.04.2017, 10:35  [ТС] 9
Croessmah, спасибо огромное
0
16.04.2017, 10:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2017, 10:35
Помогаю со студенческими работами здесь

Не могу найти ошибку в программе
Здравствуйте! Не могу понять, как полностью отладить программу. Определенное понимание о характере...

не могу найти ошибку в программе
задача Дана символьная строка. Подсчитать количество букв k в последнем ее слове считает только...

Не могу найти ошибку в программе
Прога рабочая, но если вводишь х = 0 и у= 0 то она зацикливается на &quot;Ошибка! Начните заново.&quot; и не...

Не могу найти ошибку в программе
Не могу найти ошибку program TAB1; var i:integer; A:array of real; B:array of real; begin...


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

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