Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef int bool;
- #define true 1
- #define false 0
- struct Cel {
- int x;
- int y;
- int z;
- } cel, CelTemp;
- typedef struct Wonsz {
- int PosX;
- int PosY;
- int PosZ;
- struct Wonsz *nast;
- } Wonrz;
- typedef struct Przeszkoda {
- int PosX;
- int PosY;
- int PosZ;
- char Znak;
- struct Przeszkoda *nast;
- } PrzeSzkoda;
- typedef struct Zarcie {
- int PosX;
- int PosY;
- int PosZ;
- int Punkty;
- char Znak;
- struct Zarcie *nast;
- } Jedzonko;
- void DodajPrzeszkode(PrzeSzkoda * przeszk, int x, int y, int z, char znak) {
- PrzeSzkoda *Temp = przeszk;
- while (Temp->nast != NULL)
- Temp = Temp->nast;
- Temp->nast = malloc(sizeof(PrzeSzkoda));
- Temp->nast->PosX = x;
- Temp->nast->PosY = y;
- Temp->nast->PosZ = z;
- Temp->nast->Znak = znak;
- Temp->nast->nast = NULL;
- }
- void DodajZarcie(Jedzonko ** zarlo, int x, int y, int z, char znak) {
- Jedzonko * Temp;
- Temp = malloc(sizeof(Jedzonko));
- Temp->PosX = x;
- Temp->PosY = y;
- Temp->PosZ = z;
- Temp->Znak = znak;
- if (znak == '@')
- Temp->Punkty = 1;
- else if (znak == '%')
- Temp->Punkty = 2;
- else if (znak == '$')
- Temp->Punkty = 3;
- else if (znak == '*')
- Temp->Punkty = 4;
- if(*zarlo != NULL)
- Temp->nast = *zarlo;
- *zarlo = Temp;
- }
- void DodajFragmentWeza(Wonrz ** wonsz, int x, int y, int z) {
- Wonrz *Temp;
- Temp = malloc(sizeof(Wonrz));
- Temp->PosX = x;
- Temp->PosY = y;
- Temp->PosZ = z;
- if (*wonsz != NULL)
- Temp->nast = *wonsz;
- *wonsz = Temp;
- }
- void WypiszZarcie(Jedzonko *zarcie) {
- Jedzonko *Temp = zarcie;
- while (Temp) {
- printf("%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ);
- Temp = Temp->nast;
- }
- }
- void WypiszPrzeszkody(PrzeSzkoda *przeszk) {
- PrzeSzkoda *Temp = przeszk;
- while (Temp) {
- printf("%c:%i;%i;%i", Temp->Znak, Temp->PosX, Temp->PosY, Temp->PosZ);
- Temp = Temp->nast;
- }
- }
- void WypiszWonrza(Wonrz *wonsz) {
- Wonrz *Temp = wonsz;
- if (Temp->nast) {
- WypiszWonrza(Temp->nast);
- }
- printf(":%i;%i;%i|", Temp->PosX, Temp->PosY, Temp->PosZ);
- }
- float OdlegloscEukidisowa(int x1, int y1, int z1, int x2, int y2, int z2) {
- float wynik = (x1-x2)*(x1-x2) + (y1 - y2)*(y1-y2) + (z1 - z2)*(z1-z2);
- return wynik;
- }
- void ZnajdzNajblizszeZarcie(Jedzonko *zarlo, Wonrz *wonsz) {
- Jedzonko *Temp = zarlo;
- Wonrz *Temp1 = wonsz;
- while (Temp1->nast)
- Temp1 = Temp1->nast;
- float Curr = 0;
- float Min = 1000000;
- while (Temp) {
- Curr = OdlegloscEukidisowa(Temp1->PosX, Temp1->PosY, Temp1->PosZ, Temp->PosX, Temp->PosY, Temp->PosZ);
- if (Curr <= Min) {
- cel.x = Temp->PosX;
- cel.y = Temp->PosY;
- cel.z = Temp->PosZ;
- }
- Temp = Temp->nast;
- }
- }
- void PrzesunWonrzaOJeden(Wonrz *wonsz, int x, int y, int z) {
- Wonrz *Temp = wonsz;
- if (Temp->nast){
- PrzesunWonrzaOJeden(Temp->nast, x, y, z);
- }
- if (Temp->nast == NULL) {
- CelTemp.x = Temp->PosX;
- CelTemp.y = Temp->PosY;
- CelTemp.z = Temp->PosZ;
- Temp->PosX = Temp->PosX + x;
- Temp->PosY = Temp->PosY + y;
- Temp->PosZ = Temp->PosZ + z;
- }
- else {
- Temp->PosX = CelTemp.x;
- Temp->PosY = CelTemp.y;
- Temp->PosZ = CelTemp.z;
- }
- }
- bool CzyTrafiNaPrzeszkode(int x, int y, int z, PrzeSzkoda *przeszk, Wonrz *wonsz) {
- PrzeSzkoda *Temp = przeszk;
- Wonrz *Temp2 = wonsz;
- while (Temp) {
- Wonrz *Temp2 = wonsz;
- if (Temp->PosX == x && Temp->PosY == y && Temp->PosZ == z)
- return true;
- while (Temp2) {
- if (Temp->PosX == Temp2->PosX && Temp->PosY == Temp2->PosY && Temp->PosZ == Temp2->PosZ)
- return true;
- Temp2 = Temp2->nast;
- }
- Temp = Temp->nast;
- }
- return false;
- }
- bool CzyWyjdziePozaPlansze(int x, int y,int z, int r, int h) {
- float wynik = (x - r)*(x - r) + (y - r)*(y - r);
- if (wynik <= r || z > h || z < 0)
- return false;
- else
- return true;
- }
- void PrzesunWonrza(Wonrz *wonsz, PrzeSzkoda *przeszk, int r, int h) {
- Wonrz *Temp = wonsz;
- while (Temp->nast)
- Temp = Temp->nast;
- 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
- PrzesunWonrzaOJeden(wonsz, 0, 1, 0);
- }
- 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
- PrzesunWonrzaOJeden(wonsz, -1, 0, 0);
- }
- 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
- PrzesunWonrzaOJeden(wonsz, 0, -1, 0);
- }
- 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
- PrzesunWonrzaOJeden(wonsz, 1, 0, 0);
- }
- 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
- PrzesunWonrzaOJeden(wonsz, 0, 0, -1);
- }
- 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
- PrzesunWonrzaOJeden(wonsz, 0, 0, 1);
- }
- }
- int main() {
- char PrzeszkChar = ' ';
- int IleRozgrywek = 0;
- int Wysokosc = 0;
- int Promien = 0;
- int IleElementow = 0;
- int x = 0;
- int y = 0;
- int z = 0;
- Wonrz *Wenszyk = NULL;
- Wenszyk = malloc(sizeof(Wonrz));
- Wenszyk->nast = NULL;
- PrzeSzkoda *Przeszkody = NULL;
- Jedzonko *Zarelko = NULL;
- printf("Wprowadz znak przeszkody: ");
- PrzeszkChar = getchar();
- printf("\nWprowadz ilosc rozgrywek: ");
- scanf_s("%i", &IleRozgrywek);
- printf("\nWprowadz promien walca: ");
- scanf_s("%i", &Promien);
- printf("\nWprowadz wysokosc walca: ");
- scanf_s("%i", &Wysokosc);
- printf("\nPosX: ");
- scanf_s("%i", &x);
- printf("\nPosY: ");
- scanf_s("%i", &y);
- printf("\nPosZ: ");
- scanf_s("%i", &z);
- Wenszyk->PosX = x;
- Wenszyk->PosY = y;
- Wenszyk->PosZ = z;
- printf("\nPosX: ");
- scanf_s("%i", &x);
- printf("\nPosY: ");
- scanf_s("%i", &y);
- printf("\nPosZ: ");
- scanf_s("%i", &z);
- DodajFragmentWeza(&Wenszyk, x, y, z);
- printf("\nIle Elementow specjalnych: ");
- scanf_s("%i", &IleElementow);
- int IlePrzeszkod = 0;
- int IleZarcia = 0;
- for (int i = 0; i < IleElementow; i++) {
- char t;
- char temp;
- printf("\nZnak: ");
- scanf_s(" %c", &t);
- printf("\nPozycja X: ");
- scanf_s("%i", &x);
- scanf_s(" %c", &temp);
- printf("\nPozycja Y: ");
- scanf_s("%i", &y);
- scanf_s(" %c", &temp);
- printf("\nPozycja Z: ");
- scanf_s("%i", &z);
- if (t == PrzeszkChar) {
- if (IlePrzeszkod == 0) {
- Przeszkody = malloc(sizeof(PrzeSzkoda));
- Przeszkody->nast = NULL;
- Przeszkody->PosX = x;
- Przeszkody->PosY = y;
- Przeszkody->PosZ = z;
- Przeszkody->Znak = PrzeszkChar;
- Przeszkody->nast = NULL;
- }
- else
- DodajPrzeszkode(Przeszkody, x, y, z, PrzeszkChar);
- IlePrzeszkod++;
- }
- if (t == '@' || t == '%' || t == '$' || t == '*') {
- if (IleZarcia == 0) {
- Zarelko = malloc(sizeof(Jedzonko));
- Zarelko->nast = NULL;
- Zarelko->PosX = x;
- Zarelko->PosY = y;
- Zarelko->PosZ = z;
- Zarelko->Znak = t;
- if (t == '@')
- Zarelko->Punkty = 1;
- else if (t == '%')
- Zarelko->Punkty = 2;
- else if (t == '$')
- Zarelko->Punkty = 3;
- else if (t == '*')
- Zarelko->Punkty = 4;
- }
- else
- DodajZarcie(&Zarelko, x, y, z, t);
- IleZarcia++;
- }
- }
- while (1) {
- printf("\n^");
- WypiszWonrza(Wenszyk);
- printf("\n");
- WypiszPrzeszkody(Przeszkody);
- printf("\n");
- WypiszZarcie(Zarelko);
- printf("\n\n");
- ZnajdzNajblizszeZarcie(Zarelko, Wenszyk);
- PrzesunWonrza(Wenszyk,Przeszkody);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement