Advertisement
DarkDevourer

Курсовая КПО

Dec 15th, 2020 (edited)
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.11 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. using System.Windows.Media.Animation;
  16. using System.Windows.Threading; // Для таймера
  17.  
  18. namespace Стрельба_по_мишени
  19. {
  20. /// <summary>
  21. /// Логика взаимодействия для MainWindow.xaml
  22. /// </summary>
  23. ///
  24. public partial class MainWindow : Window
  25. {
  26. int rifleSpeed = 5; // объявление скорости винтовки, равна x
  27. bool rifleGoRight;
  28. bool rifleGoLeft;
  29. double previousAngle = 0;
  30. double movingAngle = 0;
  31. int targetSpeed = 10; // объявление скорости мишени, равна x
  32. bool targetGoLeft;
  33. bool targetRightUp;
  34. double targetAngle = 0;
  35. bool bulletExist = false;
  36. Image Bullet;
  37. int bulletSpeed = 5; // объявление скорости пули, равна x
  38. double fireAngle = 0;
  39. bool hit = false;
  40. Image hitPlace;
  41.  
  42. public MainWindow()
  43. {
  44. InitializeComponent();
  45.  
  46. DispatcherTimer dispatcherTimer = new DispatcherTimer(); // Добавление таймера
  47. dispatcherTimer.Tick += Timer_Tick; // Привязка события таймера
  48. dispatcherTimer.Interval = TimeSpan.FromMilliseconds(15); // Срабатывание таймера каждые x миллисекунд
  49. dispatcherTimer.Start(); // Начало таймера
  50. }
  51.  
  52. private void Canvas_KeyDown(object sender, KeyEventArgs e)
  53. {
  54. if ((e.Key == Key.Left) || (e.Key == Key.A))
  55. {
  56. rifleGoLeft = true; // Нажата стрелка "влево" или клавиша "A"
  57. }
  58. else if ((e.Key == Key.Right) || (e.Key == Key.D))
  59. {
  60. rifleGoRight = true; // Нажата стрелка "вправо" или клавиша "D"
  61. }
  62. }
  63.  
  64. private void Canvas_KeyUp(object sender, KeyEventArgs e)
  65. {
  66. if ((e.Key == Key.Left) || (e.Key == Key.A))
  67. {
  68. rifleGoLeft = false; // Отпущена стрелка "влево" или клавиша "A"
  69. }
  70. else if ((e.Key == Key.Right) || (e.Key == Key.D))
  71. {
  72. rifleGoRight = false; // Отпущена стрелка "вправо" или клавиша "D"
  73. }
  74. }
  75.  
  76. private void FireButton(object sender, MouseButtonEventArgs e)
  77. {
  78. if (bulletExist == false)
  79. {
  80. Bullet = new Image
  81. {
  82. Height = 10,
  83. Width = 10,
  84. Source = new BitmapImage(new Uri("pack://application:,,,/bullet.png"))
  85.  
  86. };
  87. Canvas.SetLeft(Bullet, Canvas.GetLeft(Rifle) + Rifle.Width / 2 - 5 + (Rifle.Height / 2) *Math.Sin(movingAngle* Math.PI/180));
  88. Canvas.SetTop(Bullet, Canvas.GetTop(Rifle)+Rifle.Height/2 - (Rifle.Height / 2)*Math.Cos(movingAngle * Math.PI / 180));
  89. MyCanvas.Children.Add(Bullet);
  90. fireAngle = movingAngle * Math.PI / 180;
  91. bulletExist = true;
  92. }
  93.  
  94. }
  95.  
  96. private void Timer_Tick(object sender, EventArgs e)
  97. {
  98. Point pm = Mouse.GetPosition(this);
  99. Point pr = new Point(Canvas.GetLeft(Rifle) + Rifle.Width/2, Canvas.GetTop(Rifle)+Rifle.Height/2);
  100. Point tr = new Point(pr.X, pm.Y);
  101. double Catet = Math.Sqrt(Math.Pow(tr.X - pr.X, 2) + Math.Pow(tr.Y - pr.Y, 2));
  102. double Hyp = Math.Sqrt(Math.Pow(pm.X - pr.X, 2) + Math.Pow(pm.Y - pr.Y, 2));
  103. movingAngle = (Math.Acos(Catet / Hyp)) * 180 / (Math.PI);
  104. if (pm.X < pr.X)
  105. movingAngle = -movingAngle;
  106.  
  107. DoubleAnimation RR = new DoubleAnimation();
  108. RR.From = previousAngle;
  109. RR.To = movingAngle;
  110. Rifle.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, RR);
  111. previousAngle = movingAngle;
  112.  
  113. if (rifleGoLeft && Canvas.GetLeft(Rifle) > 0)
  114. {
  115. Canvas.SetLeft(Rifle, Canvas.GetLeft(Rifle) - rifleSpeed);
  116. // if go left is true and player is inside the boundary from the left
  117. // then we can set left of the player to move towards left of the screen
  118. }
  119. if (rifleGoRight && Canvas.GetLeft(Rifle) + (Rifle.Width * 2) < Application.Current.MainWindow.Width)
  120. {
  121. Canvas.SetLeft(Rifle, Canvas.GetLeft(Rifle) + rifleSpeed);
  122. // if go right is true and player is inside the boundary from the right
  123. // then we can set left of the player to move towards right of the screen
  124. }
  125.  
  126. if ((Canvas.GetLeft(Target) <= 0) || ((Canvas.GetTop(Target) >= 675) && (targetRightUp == true)) || ((Canvas.GetTop(Target) <= 100) && (targetRightUp == false)))
  127. targetGoLeft = false;
  128. else if ((Canvas.GetLeft(Target) + Target.Width>= Application.Current.MainWindow.Width) || ((Canvas.GetTop(Target) >= 675) && (targetRightUp == false)) || ((Canvas.GetTop(Target) <= 100) && (targetRightUp == true)))
  129. targetGoLeft = true;
  130.  
  131.  
  132. if (targetGoLeft == true)
  133. {
  134. Canvas.SetLeft(Target, Canvas.GetLeft(Target) - targetSpeed * Math.Cos(targetAngle * Math.PI / 180));
  135. Canvas.SetTop(Target, Canvas.GetTop(Target) + targetSpeed * Math.Sin(targetAngle * Math.PI / 180));
  136. if (hit == true)
  137. {
  138. Canvas.SetLeft(hitPlace, Canvas.GetLeft(hitPlace) - targetSpeed * Math.Cos(targetAngle * Math.PI / 180));
  139. Canvas.SetTop(hitPlace, Canvas.GetTop(hitPlace) + targetSpeed * Math.Sin(targetAngle * Math.PI / 180));
  140. }
  141. }
  142. else
  143. {
  144. Canvas.SetLeft(Target, Canvas.GetLeft(Target) + targetSpeed * Math.Cos(targetAngle * Math.PI / 180));
  145. Canvas.SetTop(Target, Canvas.GetTop(Target) - targetSpeed * Math.Sin(targetAngle * Math.PI / 180));
  146. if (hit == true)
  147. {
  148. Canvas.SetLeft(hitPlace, Canvas.GetLeft(hitPlace) + targetSpeed * Math.Cos(targetAngle * Math.PI / 180));
  149. Canvas.SetTop(hitPlace, Canvas.GetTop(hitPlace) - targetSpeed * Math.Sin(targetAngle * Math.PI / 180));
  150. }
  151. }
  152.  
  153. if (bulletExist == true)
  154. {
  155. double targetRadius = Target.Width / 2;
  156. double targetCenterX = Canvas.GetLeft(Target) + Target.Width / 2;
  157. double targetCenterY = Canvas.GetTop(Target) + Target.Width / 2;
  158. double bulletRadius = Bullet.Width / 2;
  159. double bulletCenterX = Canvas.GetLeft(Bullet) + Bullet.Width / 2;
  160. double bulletCenterY = Canvas.GetTop(Bullet) + Bullet.Width / 2;
  161. double distance = Math.Sqrt(Math.Pow(bulletCenterX - targetCenterX, 2) + Math.Pow(bulletCenterY - targetCenterY, 2));
  162. Canvas.SetTop(Bullet,Canvas.GetTop(Bullet) - Math.Abs(bulletSpeed*Math.Cos(fireAngle)));
  163. Canvas.SetLeft(Bullet, Canvas.GetLeft(Bullet) + bulletSpeed * Math.Sin(fireAngle));
  164. if (distance<=targetRadius+bulletRadius)
  165. {
  166. if (hit == true)
  167. {
  168. MyCanvas.Children.Remove(hitPlace);
  169. }
  170. hitPlace = new Image
  171. {
  172. Height = 10,
  173. Width = 10,
  174. Source = new BitmapImage(new Uri("pack://application:,,,/hole.png"))
  175.  
  176. };
  177. Canvas.SetLeft(hitPlace, Canvas.GetLeft(Bullet));
  178. Canvas.SetTop(hitPlace, Canvas.GetTop(Bullet));
  179. MyCanvas.Children.Add(hitPlace);
  180. hit = true;
  181. MyCanvas.Children.Remove(Bullet);
  182. bulletExist = false;
  183. }
  184. else if ((Canvas.GetTop(Bullet) < 100) || (Canvas.GetLeft(Bullet) < 0) || (Canvas.GetLeft(Bullet) > Application.Current.MainWindow.Width))
  185. {
  186. MyCanvas.Children.Remove(Bullet);
  187. bulletExist = false;
  188. }
  189.  
  190. }
  191.  
  192. }
  193.  
  194. private void button_Click(object sender, RoutedEventArgs e)
  195. {
  196. try
  197. {
  198. double newTargetX = Convert.ToDouble(textBox.Text);
  199. if ((newTargetX > 1125) || (newTargetX < 0))
  200. {
  201. MessageBox.Show("Слишком большое или слишком маленькое значение. Мишень выйдет за поля экрана. Введите значение в диапазоне [0; 1125].");
  202. }
  203. else
  204. {
  205. Canvas.SetLeft(Target, newTargetX);
  206. if (hit == true)
  207. Canvas.SetLeft(hitPlace, newTargetX);
  208. }
  209. }
  210. catch (FormatException)
  211. {
  212. MessageBox.Show("Введено не действительное число. Перемещение мишени не будет осуществлено.");
  213. }
  214. catch (OverflowException)
  215. {
  216. MessageBox.Show("Было введено слишком большое или слишком маленькое число. Перемещение мишени не будет осуществлено.");
  217. }
  218.  
  219. try
  220. {
  221. double newTargetY = Convert.ToDouble(textBox1.Text);
  222. if ((newTargetY > 675) || (newTargetY < 100))
  223. {
  224. MessageBox.Show("Слишком большое или слишком маленькое значение. Мишень выйдет за поля экрана. Введите значение в диапазоне [100; 675].");
  225. }
  226. else
  227. {
  228. Canvas.SetTop(Target, newTargetY);
  229. if (hit == true)
  230. Canvas.SetTop(hitPlace, newTargetY);
  231. }
  232. }
  233. catch (FormatException)
  234. {
  235. MessageBox.Show("Введено не действительное число. Перемещение мишени не будет осуществлено.");
  236. }
  237. catch (OverflowException)
  238. {
  239. MessageBox.Show("Было введено слишком большое или слишком маленькое число. Перемещение мишени не будет осуществлено.");
  240. }
  241.  
  242. try
  243. {
  244. targetSpeed = Convert.ToInt32(textBox2.Text);
  245. }
  246. catch (FormatException)
  247. {
  248. MessageBox.Show("Введено не целое число. Изменение скорости мишени не будет осуществлено.");
  249. }
  250. catch (OverflowException)
  251. {
  252. MessageBox.Show("Было введено слишком большое или слишком маленькое число. Перемещение мишени не будет осуществлено.");
  253. }
  254.  
  255. try
  256. {
  257. bulletSpeed = Convert.ToInt32(textBox3.Text);
  258. }
  259. catch (FormatException)
  260. {
  261. MessageBox.Show("Введено не целое число. Изменение скорости пули не будет осуществлено.");
  262. }
  263. catch (OverflowException)
  264. {
  265. MessageBox.Show("Было введено слишком большое или слишком маленькое число. Перемещение мишени не будет осуществлено.");
  266. }
  267.  
  268. try
  269. {
  270. targetAngle = Convert.ToDouble(textBox4.Text);
  271.  
  272. do
  273. {
  274. if (targetAngle > 90) targetAngle -= 180;
  275. else if (targetAngle < -90) targetAngle += 180;
  276. else break;
  277. }
  278. while (true);
  279.  
  280. if (targetAngle >= 0) targetRightUp = true;
  281. else targetRightUp = false;
  282. }
  283. catch (FormatException)
  284. {
  285. MessageBox.Show("Введено не действительное число. Изменение угла наклона мишени не будет осуществлено.");
  286. }
  287. catch (OverflowException)
  288. {
  289. MessageBox.Show("Было введено слишком большое или слишком маленькое число. Перемещение мишени не будет осуществлено.");
  290. }
  291. }
  292.  
  293. private void textBox_TextChanged(object sender, TextChangedEventArgs e)
  294. {
  295.  
  296. }
  297.  
  298. private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
  299. {
  300.  
  301. }
  302.  
  303. private void textBox2_TextChanged(object sender, TextChangedEventArgs e)
  304. {
  305.  
  306. }
  307.  
  308. private void textBox3_TextChanged(object sender, TextChangedEventArgs e)
  309. {
  310.  
  311. }
  312.  
  313. private void textBox4_TextChanged(object sender, TextChangedEventArgs e)
  314. {
  315.  
  316. }
  317. }
  318. }
  319.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement