Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/27: Рейтинг темы: голосов - 27, средняя оценка - 4.96
1 / 1 / 2
Регистрация: 02.03.2014
Сообщений: 34
1

Игра "Пушечная дуэль"; Записать уравнение движение тела, брошенного под углом к горизонту

27.06.2014, 22:27. Показов 5442. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не получается записать уравнение движение тела, брошенного под углом к горизонту, чтобы рассчитать траекторию полета ядра.Пока возникли трудности только здесь. Можно пожалуйста хотя бы пример какой нибудь формулы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2014, 22:27
Ответы с готовыми решениями:

Полет тела, брошенного под углом к горизонту
Реализация модели «Полет тела, брошенного под углом к горизонту» Помогите,пожалуйста, переделать...

Полёт тела, брошенного под углом к горизонту с земли
Написать программу, реализующую полёт тела брошенного под углом к горизонту с земли. Начальная...

Моделирование полёта тела, брошенного под углом к горизонту
Здравствуйте, мне нужно сделать программу моделирования тела, брошенного под углом к горизонту, с...

Составить таблицу положений тела, брошенного под углом к горизонту
Тело брошено под углом a к горизонту с начальной скоростью V. Составьте таблицу положений тела...

Изучение движения тела, брошенного под углом к горизонту с некоторой начальной скоростью
Составить программу, помогающую в изучении движения тела, брошенного под углом к горизонту с...

9
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
27.06.2014, 23:12 2
Лучший ответ Сообщение было отмечено ildwine как решение

Решение

Движение тела брошенного под углом к горизонту:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y = xtg(\alpha )-\frac{g}{2{{v}_{0}}^{2}{cos}^{2}(\alpha )}{x}^{2}
1
1 / 1 / 2
Регистрация: 02.03.2014
Сообщений: 34
28.06.2014, 00:12  [ТС] 3
Спасибо, формула впринципе то знакомая, осталось только бинды задать, а возможно сделать чтобы траектория выводилась не одним отрезком, а множеством маленьких коротких, чтобы прям дуга была?
0
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
28.06.2014, 01:17 4
Лучший ответ Сообщение было отмечено leWire как решение

Решение

Может, это вам поможет:
Pascal
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
uses
  graphABC;
 
function F(alfa, v0, x: real): real;
begin
  f := x*sin(alfa)/cos(alfa)-9.81*x*x/(2*sqr(v0*cos(alfa)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y: integer;
 
begin
  alfa := 80; v0 := 40; //начальные данные
  alfa := pi * alfa / 180;
  SetWindowSize(600, 600);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //масштаб по Х
  my := (windowheight - 100) / (fmax - fmin); //масштаб по Y
  x0 := 50; //начало координат
  y0 := trunc(abs(fmax) * my) + 50; //начало координат
  Line(10, y0, WindowWidth - 10, y0);  //OX
  Line(x0, 10, x0, WindowHeight - 10); //OY
  SetFontColor(clRed);
  TextOut(WindowWidth - 20, y0 + 10, 'X');
  TextOut(x0 + 5, 10, 'Y');
  SetFontColor(clBlue);
  { Засечки на оси OX: }
  for i := 1 to round((b - a) / dx) + 1 do 
  begin
    x1 := 50 + trunc((i - 1) * Mx * dx);
    Line(x1, y0 - 3, x1, y0 + 3); //рисуем засечки на оси OX
    n := a + (i - 1) * dx;
    if N <> 0 then TextOut(x1 - 5, y0 + 10, FloatToStr(n));
  end;
  { Засечки на оси OY: }
  for i := 1 to round((fmax - fmin) / dy) + 1 do 
  begin
    y := windowheight - 50 - trunc((i - 1) * My * dy);
    Line(x0 - 3, y, x0 + 3, y); //рисуем засечки на оси Oy
    n := fmin + (i - 1) * dy;
    if N <> 0  then TextOut(x0 + 7, y - 8, FloatToStr(n));
  end;
  SetPenColor(clGreen);
  SetPenWidth(3);
  i := 0;
  while y <= y0 do begin
    x := a + (b - a) * i / Q;
    y := y0 - trunc(my * f(alfa, v0, x));
    if x = a then MoveTo(x0 + trunc(mx * x), y)
    else LineTo(x0 + trunc(mx * x), y);
    sleep(20); //скорость падения
    inc(i)
  end
end.
1
1 / 1 / 2
Регистрация: 02.03.2014
Сообщений: 34
29.06.2014, 02:53  [ТС] 5
Да, помогло, благодарю.

Добавлено через 13 часов 16 минут
Блин, не втыкаю вообще почему кнопки не работают, укажите на ошибки пожалуйста, знаю что координаты не совпадают с дулом, хотел сначала сделать кнопки рабочими, и еще интересует, как можно сделать вывод на экран, чтобы было видно как значения меняются?
Pascal
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
Program canonduel;
uses crt,graphABC;
 
function F(alfa, v0, x: real): real;
begin
  f := x*sin(alfa)/cos(alfa)-9.81*x*x/(2*sqr(v0*cos(alfa)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y: integer;
  ch:char;
 
Procedure Graphics;
begin
Setpencolor(clBlack);
Setbrushcolor(clBlue);
Rectangle(0,0,640,640);
Setpencolor(clBlack);
Setbrushcolor(clBrown);
Rectangle(0,400,640,640);
Setpencolor(clYellow);
Setbrushcolor(clGray);
Rectangle(20,380,40,400);
line(40,380,60,360);
Setpencolor(clYellow);
Setbrushcolor(clGray);
Rectangle(600,380,620,400);
line(600,380,580,360);
end;
 
Begin
Graphics;
    ch:=readkey;
   case ch of
    #27:begin halt (1) end;
    #39:begin
        alfa:=alfa+2;
        if alfa>90 then x:=90;
        end;
    #37:begin
        alfa:=alfa-2;
        if alfa<=0 then alfa:=0;
        end;
    #38:begin
        v0:=v0+2;
        if v0>70 then v0:=70;
        end;
    #40:begin
      v0:=v0-2;
      if v0<=0 then v0:=0;
        end;
    end; 
  alfa := pi * alfa / 180;
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //масштаб по Х
  my := (windowheight - 100) / (fmax - fmin); //масштаб по Y
  x0 := 60; //начало координат
  y0 := 360; //начало координат
  SetPenColor(clGreen);
  SetPenWidth(3);
  i := 0;
  if keypressed then
    begin
     ch:=readkey;
      if ch=#13 then begin
      while y <= y0 do begin
      x := a + (b - a) * i / Q;
      y := y0 - trunc(my * f(alfa, v0, x));
      if x = a then MoveTo(x0 + trunc(mx * x), y)
      else LineTo(x0 + trunc(mx * x), y);
      sleep(20); //скорость падения
      inc(i)
        end;
    end;
   end
 
 
end.
0
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
29.06.2014, 05:43 6
Вам не нужно модуль Crt, вместо него я поставил Events. При изменении параметров стрелками значения видно в названии окна; для того, чтобы стереть окно пользуемся клавишой С. А вообще для таких заданий подходит работа с формами, там есть компонент PaintBox, в котором происходит прорисовка.

Pascal
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
program canonduel;
 
uses
  graphABC, Events;
 
function F(alfa, v0, x: real): real;
var
  alfa1: real;
begin
  alfa1 := pi * alfa / 180;
  f := x * sin(alfa1) / cos(alfa1) - 9.81 * x * x / (2 * sqr(v0 * cos(alfa1)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y: integer;
 
procedure Graphics;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
 
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 60;
  y0 := 360;
  SetPenColor(clGreen);
  SetPenWidth(3)
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    27: begin halt(1) end;
    39:
      begin
        alfa := alfa + 2;
        if alfa > 90 then alfa := 90;
      end;
    37:
      begin
        alfa := alfa - 2;
        if alfa <= 0 then alfa := 0
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        i := 0; 
        y := y0;
        while y <= y0 + 40 do
        begin
          x := a + (b - a) * i / Q;
          y := y0 - trunc(my * f(alfa, v0, x));
          if x = a then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          sleep(5); //Скорость полета
          inc(i)
        end
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics;
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
end;
 
begin
  Graphics;
  alfa := 30; //Начальный угол
  v0 := 20; //Начальная скорость
  SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
  OnKeyDown := KeyDown //Событие нажатия клавиши
end.
2
1 / 1 / 2
Регистрация: 02.03.2014
Сообщений: 34
29.06.2014, 15:29  [ТС] 7
Лучший ответ Сообщение было отмечено кот Бегемот как решение

Решение

Аа, понял, спасибо, теперь могу продолжить.

Добавлено через 9 часов 26 минут
Вообщем хотел реализовать пошаговую игру, то есть ход игрока 1, и ход игрока 2. С условием если есть попадание, скажем, от первого игрока. Попадание хотел проверить через массив значений, но думаю что это не лучшая идея наверно.
canonduel.pas(197) : Ошибка времени выполнения: Индекс находился вне границ массива.

Pascal
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
program canonduel;
 
uses
  graphABC, Events;
 
function F(alfa, v0, x: real): real;
var
  alfa1: real;
begin
  alfa1 := pi * alfa / 180;
  f := x * sin(alfa1) / cos(alfa1) - 9.81 * x * x / (2 * sqr(v0 * cos(alfa1)));
end;
 
var
   x2:array [20..40] of real;
   y2:array [380..400] of real;
   x3:array [600..620] of real;
   y3:array [380..400] of real;
   alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
   Q, x0, y0, i, x1, y, z: integer;
   label 1; 
 
procedure Graphics;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
 
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 60;
  y0 := 360;
  SetPenColor(clGreen);
  SetPenWidth(3)
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    27: begin halt(1) end;
    37:
      begin
        alfa := alfa + 2;
        if alfa > 90 then alfa := 90;
      end;
    39:
      begin
        alfa := alfa - 2;
        if alfa <= 0 then alfa := 0
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        i := 0; 
        y := y0;
        while y <= y0 + 40 do
        begin
          x := a + (b - a) * i / Q;
          y := y0 - trunc(my * f(alfa, v0, x));
          if x = a then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          sleep(1); //Скорость полета
          inc(i)
        end
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics;
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
end;
 
 procedure text;
begin
  SetFontName('Arial');
  SetFontStyle(fsBoldItalic);
  SetFontSize(16);
  TextOut(240,140,'Player 1 = WIN!');
end;
 
 procedure Graphics2;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
 
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 580;
  y0 := 360;
  SetPenColor(clRed);
  SetPenWidth(3)
end;
 
procedure KeyDown2(key2: integer);
begin
  case key2 of
    27: begin halt(1) end;
    37:
      begin
        alfa := alfa + 2;
        if alfa > 90 then alfa := 90;
      end;
    39:
      begin
        alfa := alfa - 2;
        if alfa <= 0 then alfa := 0
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        i := 0; 
        y := y0;
        while y <= y0 + 40 do
        begin
          x := a + (b - a) * i / Q;
          y := y0 - trunc(my * f(alfa, v0, x));
          if x = a then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          sleep(3); //Скорость полета
          inc(i)
        end
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics2;
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
end;
 
 procedure text1;
begin
  SetFontName('Arial');
  SetFontStyle(fsBoldItalic);
  SetFontSize(16);
  TextOut(240,140,'Player 2 = WIN!');
end;
begin
  Repeat
1:Graphics;
  alfa := 30; //Начальный угол
  v0 := 20; //Начальная скорость
  SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
  OnKeyDown := KeyDown; //Событие нажатия клавиши
  if ((x=x3[i]) and (y=y3[i])) then  
   begin
    text;
    z:=1;
   end
  else
   begin
     Graphics2;
     alfa := 30; 
     v0 := 20; 
     SetWindowCaption('    alfa = '+FloatToStr(alfa)+',   V0 = '+FloatToStr(V0));
     OnKeyDown := KeyDown; 
     if ((x=x2[i]) and (y=y2[i])) then
      begin
       text1;
       z:=1;
      end
     else
     goto 1;
     end;
  until z=1;
end.
0
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
29.06.2014, 18:53 8
Цитата Сообщение от leWire Посмотреть сообщение
Попадание хотел проверить через массив значений
Попадание надо проверять в некоторый заданный интервал. И не нужно писать по нескольку раз одни и те же процедуры. Если бросает первый игрок, то z = 1, если второй, то z = 2. Нужно еще смотреть, чтобы угол alfa не был равен 90 или -90, так как будет деление на 0, но это ты уже сам поставь условия. Можно ещё много чего доработать или изменить:
Pascal
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
program canonduel;
 
uses
  graphABC, Events;
 
function F(X0: integer; alfa, v0, x: real): real;
var
  alfa1: real;
begin
  alfa1 := pi * alfa / 180;
  f := (x - x0) * sin(alfa1) / cos(alfa1) - 9.81 * sqr(x - x0) / (2 * sqr(v0 * cos(alfa1)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y, z, X01: integer;
 
procedure Graphics;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
  
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 60;
  y0 := 360;
  //SetPenColor(clGreen);
  SetPenWidth(3)
end;
 
procedure text1;
begin
  SetFontName('Arial');
  SetFontStyle(fsBoldItalic);
  SetFontSize(16);
  if z = 1 then TextOut(240, 140, 'Player 1 = WIN!')
  else TextOut(240, 140, 'Player 2 = WIN!');
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    27: begin halt(1) end;
    37:
      begin
        alfa := alfa + 2;
      end;
    39:
      begin
        alfa := alfa - 2
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        i := 0; 
        y := y0;
        if z = 1 then SetPenColor(clGreen)
        else SetPenColor(clRed);
        while y <= y0 + 40 do
        begin
          x := x01 + a + (b - a) * i / Q;
          y := y0 - trunc(my * f(x01, alfa, v0, x));
          if x = x01 then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          sleep(1);
          if z = 1 then inc(i) else dec(i)
        end;
        //Кидает первый игрок:
        if (z = 1) and (abs(x - x01 - 80) < 5) then //точность попадания = 5 единиц (влево или вправо, можно уменьшить)
        begin
          z := 2; //если попал 1-й, то меняем игрока на второго
          x01 := 80; //меняем начальную координату бросания
          alfa := -random(80) //случайный угол (отрицательный для второго игрока)
        end
        else //Кидает второй игрок:
        if (z = 2) and (abs(x - x01 + 80) < 5) then //точность попадания = 5, её можно уменьшить
        begin
          z := 1; //если попал 2-й, то меняем игрока на 1-го
          x01 := 0; //меняем координту бросания
          alfa := random(80) //случайный положительный угол
        end
        
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics;
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  Text1
end;
 
begin
  Graphics;
  x01 := 0; 
  z := 1;
  Text1;
  randomize;
  alfa := 5 + random(80); //Начальный угол
  v0 := 2 + random(30); //Начальная скорость
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  OnKeyDown := KeyDown; //Событие нажатия клавиши
end.
1
1 / 1 / 2
Регистрация: 02.03.2014
Сообщений: 34
29.06.2014, 23:14  [ТС] 9
Ну да, так легче.
Согласен насчет доработки, действительно можно до самых мелочей все продумать

Добавлено через 2 часа 4 минуты
Доброго времени суток erl27, вообщем я ввел условия для углов, только не понимаю одного, для чего Вы сделали это условие if z = 1 then inc(i) else dec(i), я пытался сделать так, чтобы даже после промаха, ход переходил к игроку другому, но у меня не переходит, и пишет только как и должно "Miss!", ну или если без перехода после промаха делать, это тогда нужно "Жизни" вводить, а это лишняя морока, т.к. просто не меняя координаты можно выносить противника, и чтобы был баланс, вводить урон, чем ближе к точке посередине, тем больше жизней(квадратиков каких-нибудь) забирает выстрел. Но это все мелочи, мне важно сделать сейчас именно поочередную стрельбу, показать основу, альфа-версию так сказать, преподавателю, и потом уже подштриховать где надо.
P.S.
Да, я тупо закрашиваю надпись потому-что не знаю как стереть =(.
Pascal
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
program canonduel;
 
uses
  graphABC, Events;
 
function F(X0: integer; alfa, v0, x: real): real;
var
  alfa1: real;
begin
  alfa1 := pi * alfa / 180;
  f := (x - x0) * sin(alfa1) / cos(alfa1) - 9.81 * sqr(x - x0) / (2 * sqr(v0 * cos(alfa1)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y, z, l, X01: integer;
 
procedure Graphics;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
  
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 60;
  y0 := 360;
  //SetPenColor(clGreen);
  SetPenWidth(3)
end;
 
procedure text1;
begin
  SetFontName('Arial');
  SetFontStyle(fsBoldItalic);
  SetFontSize(16);
  if l = 1 then 
   Begin    
    TextOut(240, 140, 'Player 1 = WIN!');
    Sleep(2000);
    Setpencolor(clBlue);
    Setbrushcolor(clBlue);
    Rectangle(220, 120, 400, 180);
   end; 
  if l = 2 then 
   Begin  
    TextOut(240, 140, 'Player 2 = WIN!');
    Sleep(2000); 
    Setpencolor(clBlue);
    Setbrushcolor(clBlue);
    Rectangle(220, 120, 400, 180);
   end;
  if l = 3 then
   Begin  
    TextOut(240, 140, 'Miss!');
    Sleep(1000); 
    Setpencolor(clBlue);
    Setbrushcolor(clBlue);
    Rectangle(220, 120, 400, 180);
   end;
  if l = 4 then
   Begin  
    TextOut(240, 140, 'Miss!');
    Sleep(1000); 
    Setpencolor(clBlue);
    Setbrushcolor(clBlue);
    Rectangle(220, 120, 400, 180);
   end;
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    27: begin halt(1) end;
    37:
      begin
       alfa := alfa + 2;
       if alfa>=90 then alfa:=89;
      end;
    39:
      begin
       alfa := alfa - 2;
       if alfa<=-90 then alfa:=-89;
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        l := 0;
        i := 0; 
        y := y0;
        if z = 1 then SetPenColor(clGreen)
        else SetPenColor(clRed);
        while y <= y0 + 40 do
        begin
          x := x01 + a + (b - a) * i / Q;
          y := y0 - trunc(my * f(x01, alfa, v0, x));
          if x = x01 then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          sleep(2);
          if z = 1 then inc(i) else dec(i)
        end;
        //Кидает первый игрок:
        if (z = 1) and (abs(x - x01 - 80) < 2) then //точность попадания = 5 единиц (влево или вправо, можно уменьшить)
        begin
          l := 1;
          z := 2; //если попал 1-й, то меняем игрока на второго
          x01 := 77; //меняем начальную координату бросания
          alfa := -random(80) //случайный угол (отрицательный для второго игрока)
        end
        else //если 1-й не попал, все равно ход переходит к игроку 2
        if (z = 1) and (abs(x - x01 - 80) >2) then 
        begin
          l := 3;
          z := 2;
          x01 := 77;
          alfa := -random(80)
        end;
        //Кидает второй игрок:
        if (z = 2) and (abs(x - x01 + 80) < 2) then //точность попадания = 5, её можно уменьшить
        begin
          l := 2;
          z := 1; //если попал 2-й, то меняем игрока на 1-го
          x01 := 0; //меняем координту бросания
          alfa := random(80) //случайный положительный угол
        end
        else //если 2-й не попал, ход переходит к игроку 1
        if (z = 2) and (abs(x - x01 + 80) > 2) then 
        begin
          l := 4;
          z := 1;
          x01 := 0; 
          alfa := random(80) 
        end;
        
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics;
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  
end;
 
begin
  Graphics;
  x01 := 0; 
  z := 1;
  Text1;
  randomize;
  alfa := 5 + random(80); //Начальный угол
  v0 := 2 + random(30); //Начальная скорость
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  OnKeyDown := KeyDown; //Событие нажатия клавиши
end.
0
908 / 756 / 833
Регистрация: 06.09.2013
Сообщений: 1,561
30.06.2014, 13:36 10
Цитата Сообщение от leWire Посмотреть сообщение
if z = 1 then inc(i) else dec(i)
Это условие направление движения: 1-й бросает вправо, 2-й - влево. Условие при попадании напишешь сам, какое тебе нужно. Опять в процедуре ты записал несколько раз одно и тоже (Text1)
Pascal
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
program canonduel;
 
uses
  graphABC, Events;
 
function F(X0: integer; alfa, v0, x: real): real;
var
  alfa1: real;
begin
  alfa1 := pi * alfa / 180;
  f := (x - x0) * sin(alfa1) / cos(alfa1) - 9.81 * sqr(x - x0) / (2 * sqr(v0 * cos(alfa1)));
end;
 
var
  alfa, V0, a, b, x, mx, my, dx, n, dy, fmin, fmax: real;
  Q, x0, y0, i, x1, y, z, l, X01: integer;
 
procedure Graphics;
begin
  Setpencolor(clBlack);
  Setbrushcolor(clBlue);
  Rectangle(0, 0, 640, 640);
  Setpencolor(clBlack);
  Setbrushcolor(clBrown);
  Rectangle(0, 400, 640, 640);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(20, 380, 40, 400);
  line(40, 380, 60, 360);
  Setpencolor(clYellow);
  Setbrushcolor(clGray);
  Rectangle(600, 380, 620, 400);
  line(600, 380, 580, 360);
  
  SetWindowSize(640, 480);
  Q := WindowWidth - 100;
  a := 0; b := 80; dx := 10;
  fmin := 0; fmax := 80; dy := 10;
  mx := (windowwidth - 100) / (b - a); //Масштаб по ОХ
  my := (windowheight - 100) / (fmax - fmin); //Масштаб по OY
  x0 := 60;
  y0 := 360;
  //SetPenColor(clGreen);
  SetPenWidth(3)
end;
 
procedure text1;
begin
  SetFontName('Arial');
  SetFontStyle(fsBoldItalic);
  SetFontSize(16);
  Setpencolor(clBlue);
  Setbrushcolor(clYellow);
  Rectangle(220, 120, 460, 180);
  if l = 1 then 
   Begin   
    TextOut(240, 140, 'Player 1 = WIN!');
    //Sleep(2000);   
   end else 
  if l = 2 then 
   Begin   
    //Sleep(2000);
    TextOut(240, 140, 'Player 2 = WIN!');
   end else 
    TextOut(240, 140, '       Miss!          ')
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    27: begin halt(1) end;
    37:
      begin
       alfa := alfa + 2;
       if alfa>=90 then alfa:=89;
      end;
    39:
      begin
       alfa := alfa - 2;
       if alfa<=-90 then alfa:=-89;
      end;
    38:
      begin
        v0 := v0 + 2;
        if v0 > 70 then v0 := 70
      end;
    40:
      begin
        v0 := v0 - 2;
        if v0 <= 0 then v0 := 0
      end;
    13:
      begin
        i := 0; 
        y := y0;
        if z = 1 then SetPenColor(clGreen)
        else SetPenColor(clRed);
        while y <= y0 + 40 do
        begin
          x := x01 + a + (b - a) * i / Q;
          y := y0 - trunc(my * f(x01, alfa, v0, x));
          if x = x01 then MoveTo(x0 + trunc(mx * x), y)
          else LineTo(x0 + trunc(mx * x), y);
          //sleep(2);
          if z = 1 then inc(i) else dec(i)
        end;
        
        { 1-й и 2-й игроки меняются местами: }
        if z = 1 then 
        begin
          if abs(x - x01 - 80) > 2 then l := 3 //Не попадает
          else //Попадает
           begin
            { Здесь пишем условие при попадании }
           end;
          Text1;
          l := 2;
          sleep(1000);
          Text1;
          z := 2;
          x01 := 77;
          alfa := -random(80);
          v0 := 2 + random(30);
        end
        else begin
          if abs(x - x01 + 80) > 2 then l := 3 //Не попадает
          else //Попадает
           begin
             { Здесь пишем условие при попадании }
           end;
          Text1;
          sleep(1000);
          l := 1;
          Text1;
          z := 1;
          x01 := 0; 
          alfa := random(80);
          v0 := 2 + random(30);
        end
        
      end;
    67: //Нажимаем клавишу "С" для очистки экрана
      begin
        ClearWindow;
        Graphics;
        Text1
      end
  end; //Выводим в заголовоке значения угла alfa и скорости V0:
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  
end;
 
begin
  Graphics;
  x01 := 0; 
  z := 1;
  l := 1;
  Text1;
  randomize;
  alfa := 5 + random(80); //Начальный угол
  v0 := 2 + random(30); //Начальная скорость
  SetWindowCaption('    alfa = ' + FloatToStr(alfa) + ',   V0 = ' + FloatToStr(V0));
  OnKeyDown := KeyDown; //Событие нажатия клавиши
end.
Добавлено через 58 секунд
Мне кажется, у тебя PascalABC.Net стоит?
0
30.06.2014, 13:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2014, 13:36
Помогаю со студенческими работами здесь

Составить уравнение движение тела, брошенного под углом к горизонту с некоторой высоты
как составить уравнение движение тела брошенного под углом к горизонту с некоторой высоты с учетом...

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

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

Движение тела, брошенного под углом к горизонту
Здравствуйте было задание: построить траекторию полета тела массой 1 кг, брошенного по углом 45...

Движение тела , брошенного под углом к горизонту
Здравствуйте , нужно помощь в редактирование кода. Анимация движения шара, тело не летит по...

Движение тела, брошенного под углом к горизонту
нужно выполнить задание на платформе Wolfram: движение тела, брошенного под углом к горизонту....


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

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