Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef int bool;
  5. #define true 1
  6. #define false 0
  7.  
  8. struct Cel {
  9. int x;
  10. int y;
  11. int z;
  12. } cel, CelTemp;
  13.  
  14. typedef struct Wonsz {
  15. int PosX;
  16. int PosY;
  17. int PosZ;
  18.  
  19. struct Wonsz *nast;
  20. } Wonrz;
  21.  
  22. typedef struct Przeszkoda {
  23. int PosX;
  24. int PosY;
  25. int PosZ;
  26.  
  27. char Znak;
  28.  
  29. struct Przeszkoda *nast;
  30. } PrzeSzkoda;
  31.  
  32. typedef struct Zarcie {
  33. int PosX;
  34. int PosY;
  35. int PosZ;
  36.  
  37. int Punkty;
  38.  
  39. char Znak;
  40.  
  41. struct Zarcie *nast;
  42. } Jedzonko;
  43.  
  44. void DodajPrzeszkode(PrzeSzkoda * przeszk, int x, int y, int z, char znak) {
  45. PrzeSzkoda *Temp = przeszk;
  46. while (Temp->nast != NULL)
  47. Temp = Temp->nast;
  48.  
  49. Temp->nast = malloc(sizeof(PrzeSzkoda));
  50.  
  51. Temp->nast->PosX = x;
  52. Temp->nast->PosY = y;
  53. Temp->nast->PosZ = z;
  54.  
  55. Temp->nast->Znak = znak;
  56.  
  57. Temp->nast->nast = NULL;
  58. }
  59.  
  60. void DodajZarcie(Jedzonko ** zarlo, int x, int y, int z, char znak) {
  61. Jedzonko * Temp;
  62. Temp = malloc(sizeof(Jedzonko));
  63.  
  64. Temp->PosX = x;
  65. Temp->PosY = y;
  66. Temp->PosZ = z;
  67.  
  68. Temp->Znak = znak;
  69.  
  70. if (znak == '@')
  71. Temp->Punkty = 1;
  72. else if (znak == '%')
  73. Temp->Punkty = 2;
  74. else if (znak == '$')
  75. Temp->Punkty = 3;
  76. else if (znak == '*')
  77. Temp->Punkty = 4;
  78.  
  79. if(*zarlo != NULL)
  80. Temp->nast = *zarlo;
  81.  
  82. *zarlo = Temp;
  83. }
  84.  
  85. void DodajFragmentWeza(Wonrz ** wonsz, int x, int y, int z) {
  86. Wonrz *Temp;
  87. Temp = malloc(sizeof(Wonrz));
  88.  
  89. Temp->PosX = x;
  90. Temp->PosY = y;
  91. Temp->PosZ = z;
  92.  
  93. if (*wonsz != NULL)
  94. Temp->nast = *wonsz;
  95.  
  96. *wonsz = Temp;
  97. }
  98.  
  99. void WypiszZarcie(Jedzonko *zarcie) {
  100. Jedzonko *Temp = zarcie;
  101.  
  102. while (Temp) {
  103. printf("%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ);
  104. Temp = Temp->nast;
  105. }
  106. }
  107.  
  108. void WypiszPrzeszkody(PrzeSzkoda *przeszk) {
  109. PrzeSzkoda *Temp = przeszk;
  110.  
  111. while (Temp) {
  112. printf("%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ);
  113. Temp = Temp->nast;
  114. }
  115. }
  116.  
  117. void WypiszWonrza(Wonrz *wonsz) {
  118. Wonrz *Temp = wonsz;
  119.  
  120. if (Temp->nast) {
  121. WypiszWonrza(Temp->nast);
  122. }
  123.  
  124. printf(":%i;%i;%i|", Temp->PosX, Temp->PosY, Temp->PosZ);
  125. }
  126.  
  127. float OdlegloscEukidisowa(int x1, int y1, int z1, int x2, int y2, int z2) {
  128. float wynik = (x1-x2)*(x1-x2) + (y1 - y2)*(y1-y2) + (z1 - z2)*(z1-z2);
  129.  
  130. return wynik;
  131. }
  132.  
  133. void ZnajdzNajblizszeZarcie(Jedzonko *zarlo, Wonrz *wonsz) {
  134. Jedzonko *Temp = zarlo;
  135.  
  136. Wonrz *Temp1 = wonsz;
  137.  
  138. while (Temp1->nast)
  139. Temp1 = Temp1->nast;
  140.  
  141. float Curr = 0;
  142. float Min = 1000000;
  143.  
  144. while (Temp) {
  145. Curr = OdlegloscEukidisowa(Temp1->PosX, Temp1->PosY, Temp1->PosZ, Temp->PosX, Temp->PosY, Temp->PosZ);
  146.  
  147. if (Curr <= Min) {
  148. cel.x = Temp->PosX;
  149. cel.y = Temp->PosY;
  150. cel.z = Temp->PosZ;
  151. }
  152.  
  153. Temp = Temp->nast;
  154. }
  155. }
  156.  
  157. void PrzesunWonrzaOJeden(Wonrz *wonsz, int x, int y, int z) {
  158. Wonrz *Temp = wonsz;
  159.  
  160. if (Temp->nast){
  161. PrzesunWonrzaOJeden(Temp->nast, x, y, z);
  162. }
  163.  
  164. if (Temp->nast == NULL) {
  165. CelTemp.x = Temp->PosX;
  166. CelTemp.y = Temp->PosY;
  167. CelTemp.z = Temp->PosZ;
  168.  
  169. Temp->PosX = Temp->PosX + x;
  170. Temp->PosY = Temp->PosY + y;
  171. Temp->PosZ = Temp->PosZ + z;
  172. }
  173. else {
  174. Temp->PosX = CelTemp.x;
  175. Temp->PosY = CelTemp.y;
  176. Temp->PosZ = CelTemp.z;
  177. }
  178. }
  179.  
  180. bool CzyTrafiNaPrzeszkode(int x, int y, int z, PrzeSzkoda *przeszk, Wonrz *wonsz) {
  181. PrzeSzkoda *Temp = przeszk;
  182. Wonrz *Temp2 = wonsz;
  183.  
  184. while (Temp) {
  185.  
  186. Wonrz *Temp2 = wonsz;
  187.  
  188. if (Temp->PosX == x && Temp->PosY == y && Temp->PosZ == z)
  189. return true;
  190. while (Temp2) {
  191. if (Temp->PosX == Temp2->PosX && Temp->PosY == Temp2->PosY && Temp->PosZ == Temp2->PosZ)
  192. return true;
  193. Temp2 = Temp2->nast;
  194. }
  195. Temp = Temp->nast;
  196. }
  197.  
  198. return false;
  199. }
  200.  
  201. bool CzyWyjdziePozaPlansze(int x, int y,int z, int r, int h) {
  202. float wynik = (x - r)*(x - r) + (y - r)*(y - r);
  203.  
  204. if (wynik <= r || z > h || z < 0)
  205. return false;
  206. else
  207. return true;
  208. }
  209.  
  210. void PrzesunWonrza(Wonrz *wonsz, PrzeSzkoda *przeszk, int r, int h) {
  211. Wonrz *Temp = wonsz;
  212.  
  213. while (Temp->nast)
  214. Temp = Temp->nast;
  215.  
  216. if (Temp->PosY < cel.y && !CzyTrafiNaPrzeszkode(Temp->PosX, Temp->PosY + 1, Temp->PosZ, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX,Temp->PosY + 1, Temp->PosZ, r,h)) { //polnoc
  217. PrzesunWonrzaOJeden(wonsz, 0, 1, 0);
  218. }
  219. else if (Temp->PosX > cel.x && !CzyTrafiNaPrzeszkode(Temp->PosX - 1, Temp->PosY, Temp->PosZ, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX - 1, Temp->PosY, Temp->PosZ, r, h)) { //zachod
  220. PrzesunWonrzaOJeden(wonsz, -1, 0, 0);
  221. }
  222. else if (Temp->PosY > cel.y && !CzyTrafiNaPrzeszkode(Temp->PosX, Temp->PosY - 1, Temp->PosZ, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX, Temp->PosY - 1, Temp->PosZ, r, h)) { //polodnie
  223. PrzesunWonrzaOJeden(wonsz, 0, -1, 0);
  224. }
  225. else if (Temp->PosX < cel.x && !CzyTrafiNaPrzeszkode(Temp->PosX + 1, Temp->PosY, Temp->PosZ, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX + 1, Temp->PosY, Temp->PosZ, r, h)) { //wschod
  226. PrzesunWonrzaOJeden(wonsz, 1, 0, 0);
  227. }
  228. else if (Temp->PosZ > cel.z && !CzyTrafiNaPrzeszkode(Temp->PosX, Temp->PosY, Temp->PosZ - 1, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX, Temp->PosY, Temp->PosZ - 1, r, h)) { //gora
  229. PrzesunWonrzaOJeden(wonsz, 0, 0, -1);
  230. }
  231. else if (Temp->PosZ < cel.z && !CzyTrafiNaPrzeszkode(Temp->PosX, Temp->PosY, Temp->PosZ + 1, przeszk, wonsz) && !CzyWyjdziePozaPlansze(Temp->PosX, Temp->PosY, Temp->PosZ + 1, r, h)) { //dol
  232. PrzesunWonrzaOJeden(wonsz, 0, 0, 1);
  233. }
  234. }
  235.  
  236. int main() {
  237. char PrzeszkChar = ' ';
  238.  
  239. int IleRozgrywek = 0;
  240. int Wysokosc = 0;
  241. int Promien = 0;
  242. int IleElementow = 0;
  243. int x = 0;
  244. int y = 0;
  245. int z = 0;
  246.  
  247. Wonrz *Wenszyk = NULL;
  248. Wenszyk = malloc(sizeof(Wonrz));
  249. Wenszyk->nast = NULL;
  250.  
  251. PrzeSzkoda *Przeszkody = NULL;
  252.  
  253. Jedzonko *Zarelko = NULL;
  254.  
  255. printf("Wprowadz znak przeszkody: ");
  256. PrzeszkChar = getchar();
  257.  
  258. printf("\nWprowadz ilosc rozgrywek: ");
  259. scanf_s("%i", &IleRozgrywek);
  260.  
  261. printf("\nWprowadz promien walca: ");
  262. scanf_s("%i", &Promien);
  263.  
  264. printf("\nWprowadz wysokosc walca: ");
  265. scanf_s("%i", &Wysokosc);
  266.  
  267. printf("\nPosX: ");
  268. scanf_s("%i", &x);
  269.  
  270. printf("\nPosY: ");
  271. scanf_s("%i", &y);
  272.  
  273. printf("\nPosZ: ");
  274. scanf_s("%i", &z);
  275.  
  276. Wenszyk->PosX = x;
  277. Wenszyk->PosY = y;
  278. Wenszyk->PosZ = z;
  279.  
  280. printf("\nPosX: ");
  281. scanf_s("%i", &x);
  282.  
  283. printf("\nPosY: ");
  284. scanf_s("%i", &y);
  285.  
  286. printf("\nPosZ: ");
  287. scanf_s("%i", &z);
  288.  
  289. DodajFragmentWeza(&Wenszyk, x, y, z);
  290.  
  291. printf("\nIle Elementow specjalnych: ");
  292. scanf_s("%i", &IleElementow);
  293.  
  294. int IlePrzeszkod = 0;
  295. int IleZarcia = 0;
  296.  
  297. for (int i = 0; i < IleElementow; i++) {
  298. char t;
  299. char temp;
  300.  
  301. printf("\nZnak: ");
  302.  
  303. scanf_s(" %c", &t);
  304.  
  305. printf("\nPozycja X: ");
  306. scanf_s("%i", &x);
  307.  
  308. scanf_s(" %c", &temp);
  309.  
  310. printf("\nPozycja Y: ");
  311. scanf_s("%i", &y);
  312.  
  313. scanf_s(" %c", &temp);
  314.  
  315. printf("\nPozycja Z: ");
  316. scanf_s("%i", &z);
  317.  
  318. if (t == PrzeszkChar) {
  319. if (IlePrzeszkod == 0) {
  320. Przeszkody = malloc(sizeof(PrzeSzkoda));
  321. Przeszkody->nast = NULL;
  322.  
  323. Przeszkody->PosX = x;
  324. Przeszkody->PosY = y;
  325. Przeszkody->PosZ = z;
  326.  
  327. Przeszkody->Znak = PrzeszkChar;
  328.  
  329. Przeszkody->nast = NULL;
  330. }
  331. else
  332. DodajPrzeszkode(Przeszkody, x, y, z, PrzeszkChar);
  333.  
  334. IlePrzeszkod++;
  335. }
  336. if (t == '@' || t == '%' || t == '$' || t == '*') {
  337. if (IleZarcia == 0) {
  338. Zarelko = malloc(sizeof(Jedzonko));
  339. Zarelko->nast = NULL;
  340.  
  341. Zarelko->PosX = x;
  342. Zarelko->PosY = y;
  343. Zarelko->PosZ = z;
  344.  
  345. Zarelko->Znak = t;
  346.  
  347. if (t == '@')
  348. Zarelko->Punkty = 1;
  349. else if (t == '%')
  350. Zarelko->Punkty = 2;
  351. else if (t == '$')
  352. Zarelko->Punkty = 3;
  353. else if (t == '*')
  354. Zarelko->Punkty = 4;
  355. }
  356. else
  357. DodajZarcie(&Zarelko, x, y, z, t);
  358.  
  359. IleZarcia++;
  360. }
  361. }
  362. while (1) {
  363. printf("\n^");
  364. WypiszWonrza(Wenszyk);
  365. printf("\n");
  366. WypiszPrzeszkody(Przeszkody);
  367. printf("\n");
  368. WypiszZarcie(Zarelko);
  369. printf("\n\n");
  370.  
  371. ZnajdzNajblizszeZarcie(Zarelko, Wenszyk);
  372. PrzesunWonrza(Wenszyk,Przeszkody);
  373. }
  374. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement