Движение окружностей по экрану - C (СИ)
Формулировка задачи:
Условие задачи:
Три концентрические окружности, хаотически движутся по экрану, изменяя свои параметры при изменении направления движения.Требования к задаче:
1.Хотя бы одна фигура должна иметь заливку, которая согласно условию меняет свои параметры.
2.По нажатию клавиши С должен изменяться цвет фона.
Возникли трудности при реализации требований. Помогите чем можете(примеры, ссылки...т.д.). Заранее благодарен.Вот мой код:
#include <stdio.h> #include <graphics.h> #include <conio.h> #include <locale.h> int main() { setlocale(LC_ALL, "Russian"); int MAXW=800, MAXH=600; initwindow(MAXW,MAXH); int R=50; char key; int SpeedX, SpeedY; int Kx=4,Ky=3, Kx0=2, Ky0=2; int top,left; char ESC=27; char action; do { printf("\n1.Выполнение программы \n"); printf("0.Выход\n\nВаш выбор = "); scanf("%c",&action); switch(action) { case '1': left=MAXW/2; top=MAXH/2; SpeedX=rand()%Kx+Kx0; SpeedY=rand()%Ky+Ky0; while(1) { setcolor(RED); outtextxy(0,0,"Нажмите ESC чтобы выйти из программы…"); if (kbhit()) { key=getch(); if (key==ESC) break; } setcolor(WHITE); circle(left,top,R); setcolor(WHITE); circle(left,top,R+15); setcolor(WHITE); circle(left,top,R+30); delay(25); setcolor(0); circle(left,top,R); setcolor(0); circle(left,top,R+15); setcolor(0); circle(left,top,R+30); if (left-R<=0) SpeedX=-SpeedX; if (left+R>=MAXW) SpeedX=-SpeedX; if (top-R<=0) SpeedY=-SpeedY; if (top+R>=MAXH) SpeedY=-SpeedY; left+=SpeedX; top+=SpeedY; } break; case '0': break; } }while(action!='0'); getchar(); closegraph(); }
Решение задачи: «Движение окружностей по экрану»
textual
Листинг программы
#include <graphics.h> #include <stdlib.h> #include <time.h> typedef struct { int x, y; int speedX, speedY; int radius; int color; } TCircle; //----------------------------------------------------------------------------- void Draw(TCircle* figures) { setcolor(figures->color); setfillstyle(1, figures->color); fillellipse(figures->x, figures->y, figures->radius, figures->radius); } //----------------------------------------------------------------------------- int Move(TCircle* figure) { figure->x += figure->speedX; figure->y += figure->speedY; int isChange = 0; if ((figure->x - figure->radius < 0) || (figure->x + figure->radius > getmaxx())) { isChange++; figure->speedX *= -1; } if ((figure->y - figure->radius < 0) || (figure->y + figure->radius > getmaxy())) { isChange++; figure->speedY *= -1; } return isChange; } //----------------------------------------------------------------------------- void Redraw(TCircle figures[], unsigned count) { clearviewport(); for (; count--; ++figures) { if (Move(figures)) { figures->color = (rand() % 15) + 1; } Draw(figures); } } //----------------------------------------------------------------------------- int main() { srand(time(NULL)); initwindow(600, 400); TCircle figures[] = {{100, 100, -2, 1, 20, 11}, {200, 100, 0, 4, 30, 12}, {300, 100, 1, -3, 40, 13}}; int key = 0; while (key != 27) { Redraw(figures, 3); if (kbhit()) { key = getch(); switch (key) { case 32: setbkcolor(rand() % 15); break; } } delay(100); } closegraph(); return 0; }
Объяснение кода листинга программы
В этом коде создаются и движутся окружности на экране.
- Создаются три структуры TCircle, каждая из которых представляет собой окружность со следующими полями: x, y (координаты), speedX, speedY (скорость движения по оси X и Y), radius (радиус окружности), color (цвет окружности).
- Определены три функции: Draw, Move, Redraw.
- Функция Draw рисует окружность на экране.
- Функция Move обновляет координаты окружности, меняя направление движения, если окружность достигла границы экрана.
- Функция Redraw перерисовывает все окружности на экране после их движения.
- В функции main создается окно, инициализируются переменные, определяется ключ управления.
- В цикле while, пока не будет нажата клавиша Esc, вызывается функция Redraw, которая перерисовывает окружности на экране.
- Если нажата клавиша пробел, то меняется цвет фона.
- В конце программы графический контекст закрывается, и возвращается 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д