Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 32.44 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include<iostream>
  3. #include<SFML/System.hpp>
  4. #include<SFML/Window.hpp>
  5. #include<SFML/Main.hpp>
  6. #include<SFML/Audio.hpp>
  7. #include<string>
  8. #include<list>
  9. #include <time.h>
  10. #include <windows.h>
  11.  
  12. using namespace std;
  13. //Clasa board, za pomocą niej dodaje wszystkie obrazki/tła/text na ekran, ustawiam ich pozycje, ładuje je
  14. class Board {
  15. public:
  16.     sf::Vector2f position;
  17.     sf::Sprite Sprite;
  18.     sf::Sprite Sprite1;
  19.     sf::Texture texture;
  20.     sf::Texture texture1;
  21.     sf::Text text;
  22.     sf::Text text1;
  23.     sf::Font font;
  24.     string adres = "karty\\tlo.png";
  25.     string backGR = "karty\\background.png";
  26.     void loadBoardPic()
  27.     {
  28.         if (!(texture).loadFromFile(adres))
  29.         {
  30.             system("pause");
  31.         }
  32.     }
  33.     void loadBackGR()
  34.     {
  35.         if (!(texture1).loadFromFile(backGR))
  36.         {
  37.             system("pause");
  38.         }
  39.     }
  40.     void loadText(double resolutionCtrl)
  41.     {
  42.  
  43.         if (!font.loadFromFile("arial.ttf"))
  44.         {
  45.             exit(0);
  46.         }
  47.  
  48.         text.setFont(font);
  49.         text1.setFont(font);
  50.         text.setString("Losuj od nowa");
  51.         text1.setString("Pokaz");
  52.         text.setFillColor(sf::Color::Green);
  53.         text1.setFillColor(sf::Color::Green);
  54.         text.setCharacterSize(16);
  55.         text.setCharacterSize(17);
  56.         position.x = 15 * resolutionCtrl;
  57.         position.y = 700 * resolutionCtrl;
  58.         text.setPosition(position);
  59.         position.x = 15 * resolutionCtrl;
  60.         position.y = 100 * resolutionCtrl;
  61.         text1.setPosition(position);
  62.     }
  63.     void drawBack(sf::RenderWindow* window)
  64.     {
  65.         Sprite1.setTexture(texture1);
  66.         Sprite1.setPosition(position);
  67.         (*window).draw(Sprite1);
  68.     }
  69.     void drawBoard(sf::RenderWindow* window)
  70.     {
  71.         Sprite.setTexture(texture);
  72.         Sprite.setPosition(position);
  73.         (*window).draw(Sprite);
  74.     }
  75.     void drawText(sf::RenderWindow* window)
  76.     {
  77.  
  78.         (*window).draw(text);
  79.         (*window).draw(text1);
  80.  
  81.     }
  82. };
  83. //klasa z kartami przechowuje id karty itd.
  84. class Card {
  85. public:
  86.     int id_karty, value;
  87.     bool enableToMove;
  88.     sf::Vector2f docelowe_polozenie;
  89.     sf::Sprite Sprite;
  90.     sf::Texture texture;
  91.     sf::Texture textureClr;
  92.     unsigned int odkryte;
  93.     string adres;
  94.     string adres1 = "karty\\karta53.png";
  95.     void loadCardPic()
  96.     {
  97.         cout << "Adres ktory zostanie dodany: " << adres << endl;
  98.         if (!(texture).loadFromFile(adres))
  99.         {
  100.             system("pause");
  101.         }
  102.         if (!(textureClr).loadFromFile(adres1))
  103.             exit(0);
  104.     }
  105.     void wyswietlanie(sf::RenderWindow* window)
  106.     {
  107.         if (odkryte == 2)
  108.         {
  109.             Sprite.setTexture(texture);
  110.             Sprite.setPosition(docelowe_polozenie);
  111.             (*window).draw(Sprite);
  112.         }
  113.         if (odkryte == 1)
  114.         {
  115.             Sprite.setTexture(textureClr);
  116.             Sprite.setPosition(docelowe_polozenie);
  117.             (*window).draw(Sprite);
  118.         }
  119.     }
  120.  
  121. };
  122.  
  123. struct infoAboutList {
  124.     double index;
  125.     double x;
  126.     double y;
  127. };
  128. ///DEKLARACJE FUNKCJI///-------------------------------------
  129. void Tworzenie_Kart(sf::RenderWindow* window, Card *Karty, Board* Tlo, double resolutionCtrl);
  130. void podtrzymujaca(sf::RenderWindow* window);
  131. void decision();
  132. void waiting(sf::RenderWindow* window, sf::Music* music, Card *Karty, double resolutionCtrl, Board* Tlo);
  133. void showing(int *Table, list<Card> *lista, sf::RenderWindow* window, double resolutionCtrl, Board *Tlo, int ListNR);
  134. void drukowanieList(list<Card> *lista);
  135. ///-----------------------------------------------------------
  136. ///
  137.  
  138. //funkcja waiting używana w decision ona ładuje pierwszy ekran startowy i czeka na kliknięcie
  139. void waiting(sf::RenderWindow* window, sf::Music* music, Card *Karty, double resolutionCtrl, Board* Tlo)
  140. {
  141.     sf::Sprite Sprite;
  142.     sf::Texture texture;
  143.     sf::Event event;
  144.     if (!(texture).loadFromFile("karty\\karta.png"))
  145.         system("pause");
  146.     Sprite.setTexture(texture);
  147.     Sprite.setPosition(sf::Vector2f(10, 50));
  148.     (*window).draw(Sprite);
  149.     int i = 0;
  150.     (*window).display();
  151.     Sleep(2000);
  152.     while (i == 0)
  153.     {
  154.  
  155.  
  156.  
  157.         if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
  158.         {
  159.             sf::Vector2i localPosition = sf::Mouse::getPosition(*window);
  160.             int x = localPosition.x;
  161.             int y = localPosition.y;
  162.             if ((x >= 239 * resolutionCtrl && x <= 433 * resolutionCtrl) && (y >= 409 * resolutionCtrl && y <= 436 * resolutionCtrl))
  163.             {
  164.                 i = 1;
  165.                 Tworzenie_Kart(&(*window), Karty, Tlo, resolutionCtrl);
  166.  
  167.             }
  168.             if ((x >= 239 * resolutionCtrl && x <= 380 * resolutionCtrl) && (y >= 649 * resolutionCtrl && y <= 676 * resolutionCtrl))
  169.             {
  170.                 i = 1;
  171.                 (*window).close();
  172.                 exit(0);
  173.  
  174.             }
  175.         }
  176.         while ((*window).pollEvent(event))
  177.         {
  178.             if (event.type == sf::Event::Closed)
  179.             {
  180.                 (*window).close();
  181.                 exit(0);
  182.             }
  183.         }
  184.     }
  185.  
  186. }
  187.  
  188.  
  189. ///FUNKCJA ZAPĘTLA PROGRAM I CHRONI PRZED ZATRZYMANIEM---------BĘDZIE USUNIETA W SKRYPCIE--------
  190. void podtrzymujaca(sf::RenderWindow* window)
  191. {
  192.     while ((*window).isOpen())
  193.     {
  194.         sf::Event event;
  195.         while ((*window).pollEvent(event))
  196.         {
  197.             if (event.type == sf::Event::Closed)
  198.                 (*window).close();
  199.         }
  200.     }
  201. }
  202. ///---------------------------------------------------------------------
  203. ///(createBoard)MIESZANIE KOLEJNOSCI LICZB W TABLICY W LOSOWY SPOSOB--------------------------------------------
  204. void Shuffling(int * Table)
  205. {
  206.     int i, i1, i2;
  207.     srand(time(NULL));
  208.     for (i = 1; i <= 3 * 52; i++)
  209.     {
  210.         i1 = rand() % 52; i2 = rand() % 52;
  211.         swap(Table[i1], Table[i2]);
  212.     }
  213. }
  214. //funkcja służy dodawaniu kart na liste w zakresach podanych w parametrach. ta fcja jest dla każdej widocznej listy wywoływana osobno raz. jest ona rozwinięciem fcji Create board
  215.  
  216. void add_to_list(list<Card> *list, int start, int end, int posX, int posY, int* TableID, Card *Karty, double resolutionCtrl)
  217. {
  218.     int i, value;
  219.     for (i = start; i <= end; i++)
  220.     {
  221.         value = TableID[i];
  222.         Karty[value].docelowe_polozenie.x = posX * resolutionCtrl;
  223.         Karty[value].docelowe_polozenie.y = posY;
  224.         if (i == end)
  225.         {
  226.             Karty[value].odkryte = 2;
  227.             Karty[value].enableToMove = true;
  228.         }
  229.         else {
  230.             Karty[value].odkryte = 1;
  231.             Karty[value].enableToMove = false;
  232.         }
  233.         (*list).push_front(Karty[value]);
  234.         posY += 10;
  235.     }
  236.  
  237. }
  238.  
  239. //Ładuje karty do list, ustawia ich pozycje, widoczność, oraz dostępność do przesuwania.
  240. void CreateBoard(int *TableID, Card *Karty, list<Card> *lista, double resolutionCtrl)
  241. {
  242.  
  243.     int  i, value, cardPosX = 1400 * resolutionCtrl, cardPosY = 230 * resolutionCtrl;
  244.     for (i = 0; i < 13; i++)
  245.     {
  246.         lista[i].clear();
  247.     }
  248.     Shuffling(TableID);
  249.  
  250.     cardPosX = 1400, cardPosY = 230 * resolutionCtrl;
  251.     add_to_list(&lista[0], 0, 6, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  252.     cardPosX -= 205;
  253.     cardPosY = 230 * resolutionCtrl;
  254.     add_to_list(&lista[1], 7, 12, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  255.     cardPosX -= 205;
  256.     cardPosY = 230 * resolutionCtrl;
  257.     add_to_list(&lista[2], 13, 17, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  258.     cardPosX -= 205;
  259.     cardPosY = 230 * resolutionCtrl;
  260.     add_to_list(&lista[3], 18, 21, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  261.     cardPosX -= 205;
  262.     cardPosY = 230 * resolutionCtrl;
  263.     add_to_list(&lista[4], 22, 24, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  264.     cardPosX -= 205;
  265.     cardPosY = 230 * resolutionCtrl;
  266.     add_to_list(&lista[5], 25, 26, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  267.     cardPosX -= 205;
  268.     cardPosY = 230 * resolutionCtrl;
  269.     add_to_list(&lista[6], 27, 27, cardPosX, cardPosY, TableID, Karty, resolutionCtrl);
  270.     cardPosX -= 205;
  271.     cardPosY = 230 * resolutionCtrl;
  272.     for (i = 28; i < 52; i++)
  273.     {
  274.         value = TableID[i];
  275.         Karty[value].docelowe_polozenie.x = 0;
  276.         Karty[value].docelowe_polozenie.y = 0;
  277.         Karty[value].odkryte = 0;
  278.         Karty[value].enableToMove = false;
  279.         lista[12].push_back(Karty[value]);
  280.     }
  281. }
  282.  
  283. //Tworzenie kart ta funkcja może tak na prawdę może być wyżej(możesz ją przesunąć) i ona służy głównie do tego aby sterować ładowaniem wszystkich obrazków/tła/itd...
  284. void Tworzenie_Kart(sf::RenderWindow* window, Card *Karty, Board* Tlo, double resolutionCtrl)
  285. {
  286.     int i, k = 1, j = 48, color = 1, posX;
  287.     string sciezka = "karty\\karta";
  288.     string numer;
  289.     posX = 640;
  290.     Tlo[0].loadText(resolutionCtrl);
  291.     Tlo[0].position.x = 0;
  292.     Tlo[0].position.y = 0;
  293.     Tlo[0].loadBackGR();
  294.     for (i = 1; i <= 4; i++)
  295.     {
  296.         Tlo[i].position.x = posX*resolutionCtrl;
  297.         Tlo[i].position.y = 30 * resolutionCtrl;
  298.         Tlo[i].loadBoardPic();
  299.         posX += 180;
  300.     }
  301.     posX = 1400;
  302.     for (i = 5; i < 12; i++)
  303.     {
  304.         cout << "Uzywany resCTRL(tlo): " << resolutionCtrl << endl;
  305.         cout << "DODANE WSP TLA: " << posX << endl;
  306.         Tlo[i].position.x = posX*resolutionCtrl;
  307.         Tlo[i].position.y = 230 * resolutionCtrl;
  308.         Tlo[i].loadBoardPic();
  309.         posX -= 205;
  310.     }
  311.     Tlo[12].adres = "karty\\karta54.png";
  312.     Tlo[12].position.x = 30 * resolutionCtrl;
  313.     Tlo[12].position.y = 50 * resolutionCtrl;
  314.     Tlo[13].adres = "karty\\odNowa.png";
  315.     Tlo[13].position.x = 1480 * resolutionCtrl;
  316.     Tlo[13].position.y = 20 * resolutionCtrl;
  317.     for (i = 12; i < 14; i++)
  318.     {
  319.         Tlo[i].loadBoardPic();
  320.     }
  321.     for (i = 0; i < 52; i++)
  322.     {
  323.         Karty[i].id_karty = k;
  324.         Karty[i].value = color;
  325.         if (k == 13)
  326.         {
  327.             k = 0;
  328.             color++;
  329.         }
  330.         k++;
  331.         numer = sciezka + (char)(i + j) + ".png";
  332.         if (i % 2 == 0) {
  333.             Karty[i].odkryte = 0;
  334.         }
  335.         else
  336.         {
  337.             Karty[i].odkryte = 2;
  338.         }
  339.         Karty[i].adres = numer;
  340.         cout << Karty[i].adres << endl;
  341.         Karty[i].loadCardPic();
  342.  
  343.         Karty[i].docelowe_polozenie.x = 0;
  344.         Karty[i].docelowe_polozenie.y = 0;
  345.         Karty[i].enableToMove = false;
  346.         if (i >= 49)
  347.         {
  348.             sciezka = "karty\\karta5";
  349.             j = -2;
  350.         }
  351.         else {
  352.             if (i >= 39)
  353.             {
  354.                 sciezka = "karty\\karta4";
  355.                 j = 8;
  356.             }
  357.             else
  358.             {
  359.                 if (i >= 29)
  360.                 {
  361.                     sciezka = "karty\\karta3";
  362.                     j = 18;
  363.                 }
  364.                 else
  365.                 {
  366.                     if (i >= 19)
  367.                     {
  368.                         sciezka = "karty\\karta2";
  369.                         j = 28;
  370.                     }
  371.                     else {
  372.                         if (i >= 9)
  373.                         {
  374.                             sciezka = "karty\\karta1";
  375.                             j = 38;
  376.                         }
  377.                     }
  378.                 }
  379.             }
  380.         }
  381.     }
  382. }
  383. //funckja która działą ciągle w programie, wywoływana jest kilka razy na sekunde i służy do wyświetlania tego co jest zbuforowane w ekranie
  384. void showing(int *Table, list<Card> *lista, sf::RenderWindow* window, double resolutionCtrl, Board *Tlo, int ListNR)
  385. {
  386.  
  387.     int i, value;
  388.     (*window).clear(sf::Color::Red);
  389.     Tlo[0].drawBack(&(*window));
  390.     for (i = 1; i < 14; i++)
  391.     {
  392.         Tlo[i].drawBoard(&(*window));
  393.     }
  394.     list <Card>::reverse_iterator it; //użyty jest tu rewerse iterator po to aby te listy były wyświetlane tak jakby od końca.
  395.     //jest tutaj kilka ifów i pętli, służy to temu, że jak złapiesz jakąś karte to aby ona zawsze na wierzchu siępojawiała
  396.     // listNR jest to numer Listy z której karte złapaliśmy kursorem i ją aktualnie trzymamy. i jest tak zrobione że najpierw jest ona wyświetlana
  397.     //jeśli złapaliśmy karte z listy brzegowej to program się inaczej zachowuje(pacz niżej kod)
  398.     if (ListNR == 0)
  399.     {
  400.         for (i = 11; i >= 0; i--)
  401.         {
  402.             for (it = lista[i].rbegin(); it != lista[i].rend(); it++)
  403.             {
  404.                 it->wyswietlanie(&(*window));
  405.             }
  406.         }
  407.     }
  408.     else {
  409.         if (ListNR == 11)
  410.         {
  411.             for (i = 0; i <= 11; i++)
  412.             {
  413.                 for (it = lista[i].rbegin(); it != lista[i].rend(); it++)
  414.                 {
  415.                     it->wyswietlanie(&(*window));
  416.                 }
  417.             }
  418.         }
  419.         else {
  420.             for (i = 11; i > ListNR; i--)
  421.             {
  422.                 for (it = lista[i].rbegin(); it != lista[i].rend(); it++)
  423.                 {
  424.                     it->wyswietlanie(&(*window));
  425.                 }
  426.             }
  427.             for (i = ListNR - 1; i >= 0; i--)
  428.             {
  429.                 for (it = lista[i].rbegin(); it != lista[i].rend(); it++)
  430.                 {
  431.                     it->wyswietlanie(&(*window));
  432.                 }
  433.             }
  434.             for (it = lista[ListNR].rbegin(); it != lista[ListNR].rend(); it++)
  435.             {
  436.                 it->wyswietlanie(&(*window));
  437.             }
  438.         }
  439.  
  440.  
  441.     }
  442.  
  443. }
  444. //tą funkcje wywołuje funkcja check wtedy jeśli przenosimy kartę z listy na liste i do tego też ona służy
  445. void change_list(int add, int del, list<Card> *lista, int wspClickCardX, int wspClickCardY, list <Card>::iterator iter, double resolutionCtrl)
  446. {
  447.     int x, y, counter = 1; //counter potrzebny w przypadku gdy mamy ułożone więcej niż jedną karte i nie złapiemy za ostatnią tylko za jakąś wyżej to counter oblicza za którą karte od końca złapaliśmy
  448.     list <Card>::iterator it;
  449.     it = lista[add].begin(); //add to index listy na którą dodamy element
  450.     list <Card>::iterator it2;
  451.     Card Karta;//tworzymy zmienną klasy Card ponieważ jeśli chcemy dodać karte do nowej listy to można to zrobić tylko w taki sposób, że dodamy tą karte wcześniej dodając do niej wartości z iteratora.
  452.     it2 = lista[del].begin();//del analogicznie jak wyżej
  453.     do  //tutaj liczymy którą karte od końca trzymamy (od razu mówie że ta petla jest porypana, ale trochę się nakombinowałem aby dobrze liczyła i nie wywalała błędów z iteratorem, w końcu w takiej postaci działa, więc zostawiłem)
  454.     {
  455.         if ((it2)->adres == iter->adres)
  456.         {
  457.             it2++;
  458.             break;
  459.         }
  460.         counter++;
  461.     } while ((it2++) != lista[del].end());
  462.     //tutaj teraz pętla która robi to samo dla elementu złapanego oraz tych poniżej
  463.     for (int k = 0; k < counter; k++)
  464.     {
  465.         it2--;
  466.         it = lista[add].begin();
  467.         if (lista[add].empty())
  468.         {
  469.             x = wspClickCardX;
  470.             y = wspClickCardY;
  471.         }
  472.         else
  473.         {
  474.             if (add > 6) {
  475.                 x = it->docelowe_polozenie.x;
  476.                 y = (it->docelowe_polozenie.y);
  477.             }
  478.             else {
  479.                 x = it->docelowe_polozenie.x;
  480.                 y = (it->docelowe_polozenie.y) + 16;
  481.             }
  482.         }
  483.         Karta.id_karty = it2->id_karty;
  484.         Karta.value = it2->value;
  485.         Karta.enableToMove = it2->enableToMove;
  486.         Karta.docelowe_polozenie.x = x;
  487.         Karta.docelowe_polozenie.y = y;
  488.         Karta.Sprite = it2->Sprite;
  489.         Karta.texture = it2->texture;
  490.         Karta.textureClr = it2->textureClr;
  491.         Karta.odkryte = it2->odkryte;
  492.         Karta.adres = it2->adres;
  493.         Karta.adres1 = it2->adres1;
  494.         lista[add].push_front(Karta);
  495.         lista[del].erase(it2);
  496.         it2 = lista[del].begin();
  497.         for (int j = 0; j != (counter - (k + 1)); j++)
  498.         {
  499.             it2++;
  500.         }
  501.     }
  502.     if (lista[del].begin() != lista[del].end())
  503.     {
  504.         it = lista[del].begin();
  505.         it->enableToMove = true;
  506.         it->odkryte = 2;
  507.     }
  508.     //drukowanieList(lista);
  509. }
  510. //do usuniecia w końcowym skrypcie
  511. void drukowanieList(list<Card> *lista)
  512. {
  513.     int i;
  514.     list <Card>::iterator it;
  515.     for (i = 0; i < 7; i++)
  516.     {
  517.         for (it = lista[i].begin(); it != lista[i].end(); ++it)
  518.         {
  519.             cout << it->id_karty << " , ";
  520.         }
  521.         cout << endl;
  522.     }
  523. }
  524. //funkcja wywoływana przez funkcje check jeśli na planszy istnieje jakaś pusta lista, i karta którą trzymamy i potem puszczamy nie jest puszczana nad żadną zapełnioną listą
  525. struct infoAboutList checkEmptyList(double resolutionCtrl, vector<int> emptyList, list <Card>::iterator picked)
  526. {
  527.     cout << "Weszlo w check empty list" << endl;
  528.     //z racji tego, że nie wiemy ile jest pustych list to musimy się dowiedzieć
  529.     int capacity = emptyList.size(), index;
  530.     struct infoAboutList foundList; //tutaj jest zmienna struktury która jest pod deklaracją klas, ma ona zmienne x,y,index. Index to indeks tablicy której współrzędne sięzgadzają a x,y to współrzędne które będzie miałą karta dodana do pustej listy
  531.     foundList.index = -1;
  532.     foundList.x = 0;
  533.     foundList.y = 0;
  534.     //tutaj switchem sprawdzamy które współrzędne się zgadzają, je
  535.     for (int i = 0; i < capacity; i++)
  536.     {
  537.         index = emptyList[i];
  538.         switch (index)
  539.         {
  540.         case 0: {
  541.             if (picked->docelowe_polozenie.x >= (1400 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (1400 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  542.             {
  543.                 foundList.index = 0;
  544.                 foundList.x = 1400 * resolutionCtrl;
  545.                 foundList.y = 230 * resolutionCtrl;
  546.             }
  547.         }
  548.                 break;
  549.         case 1: {
  550.             if (picked->docelowe_polozenie.x >= (1195 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (1195 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  551.             {
  552.                 foundList.index = 1;
  553.                 foundList.x = 1195 * resolutionCtrl;
  554.                 foundList.y = 230 * resolutionCtrl;
  555.             }
  556.         }
  557.                 break;
  558.         case 2: {
  559.             if (picked->docelowe_polozenie.x >= (990 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (990 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  560.             {
  561.                 foundList.index = 2;
  562.                 foundList.x = 990 * resolutionCtrl;
  563.                 foundList.y = 230 * resolutionCtrl;
  564.             }
  565.         }
  566.                 break;
  567.         case 3: {
  568.             if (picked->docelowe_polozenie.x >= (785 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (785 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  569.             {
  570.                 foundList.index = 3;
  571.                 foundList.x = 785 * resolutionCtrl;
  572.                 foundList.y = 230 * resolutionCtrl;
  573.             }
  574.         }
  575.                 break;
  576.         case 4: {
  577.             if (picked->docelowe_polozenie.x >= (580 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (580 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  578.             {
  579.                 foundList.index = 4;
  580.                 foundList.x = 580 * resolutionCtrl;
  581.                 foundList.y = 230 * resolutionCtrl;
  582.             }
  583.         }
  584.                 break;
  585.         case 5: {
  586.             if (picked->docelowe_polozenie.x >= (375 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (375 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  587.             {
  588.                 foundList.index = 5;
  589.                 foundList.x = 375 * resolutionCtrl;
  590.                 foundList.y = 230 * resolutionCtrl;
  591.             }
  592.         }
  593.                 break;
  594.         case 6: {
  595.             if (picked->docelowe_polozenie.x >= (170 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (170 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (230 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (230 * resolutionCtrl + 25))
  596.             {
  597.                 foundList.index = 6;
  598.                 foundList.x = 170 * resolutionCtrl;
  599.                 foundList.y = 230 * resolutionCtrl;
  600.             }
  601.         }
  602.                 break;
  603.         case 7: {
  604.             if (picked->docelowe_polozenie.x >= (1180 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (1180 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (30 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (30 * resolutionCtrl + 25))
  605.             {
  606.                 foundList.index = 7;
  607.                 foundList.x = 1180 * resolutionCtrl;
  608.                 foundList.y = 30 * resolutionCtrl;
  609.             }
  610.         }
  611.                 break;
  612.         case 8: {
  613.             if (picked->docelowe_polozenie.x >= (1000 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (1000 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (30 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (30 * resolutionCtrl + 25))
  614.             {
  615.                 foundList.index = 8;
  616.                 foundList.x = 1000 * resolutionCtrl;
  617.                 foundList.y = 30 * resolutionCtrl;
  618.             }
  619.         }
  620.                 break;
  621.         case 9: {
  622.             if (picked->docelowe_polozenie.x >= (820 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (820 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (30 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (30 * resolutionCtrl + 25))
  623.             {
  624.                 foundList.index = 9;
  625.                 foundList.x = 820 * resolutionCtrl;
  626.                 foundList.y = 30 * resolutionCtrl;
  627.             }
  628.         }
  629.                 break;
  630.         case 10: {
  631.             if (picked->docelowe_polozenie.x >= (640 * resolutionCtrl - 25) && picked->docelowe_polozenie.x <= (640 * resolutionCtrl + 25) && picked->docelowe_polozenie.y >= (30 * resolutionCtrl - 25) && picked->docelowe_polozenie.y <= (30 * resolutionCtrl + 25))
  632.             {
  633.                 foundList.index = 10;
  634.                 foundList.x = 640 * resolutionCtrl;
  635.                 foundList.y = 30 * resolutionCtrl;
  636.             }
  637.         }
  638.                  break;
  639.         }
  640.     }
  641.     cout << "Uzywany resCTRL(empty): " << resolutionCtrl << endl;
  642.     cout << "w emtpy list wpspółrzedne: "<<foundList.x<<" y: "<<foundList.y << endl;
  643.     //zwraca info o tej liście
  644.     return foundList;
  645. }
  646. //funkcja używana do pokazywania ukrytych kard za pomocą klikania w karte w gólnym lewym rogu
  647.  
  648. void transferingToShow(list<Card> *lista, double resolutionCtrl)
  649. {
  650.     Card Karta;
  651.     list <Card>::iterator it;
  652.     if (lista[12].empty())  //jeśli już pokazaliśmy wszystkie karty i lista jest pusta to zamieniamy listy elementami
  653.     {
  654.         lista[12].swap(lista[11]);
  655.  
  656.     }
  657.     else {
  658.         it = lista[12].end();
  659.         it--;
  660.         Karta.id_karty = it->id_karty;
  661.         Karta.value = it->value;
  662.         Karta.enableToMove = true;
  663.         Karta.docelowe_polozenie.x = 170 * resolutionCtrl;
  664.         Karta.docelowe_polozenie.y = 50 * resolutionCtrl;
  665.         Karta.Sprite = it->Sprite;
  666.         Karta.texture = it->texture;
  667.         Karta.textureClr = it->textureClr;
  668.         Karta.odkryte = 2;
  669.         Karta.adres = it->adres;
  670.         Karta.adres1 = it->adres1;
  671.         lista[11].push_front(Karta);
  672.         lista[12].pop_back();
  673.     }
  674. }
  675. //no i wisienka tego programu, teraz do końca sam nie wiem dokłądnie co autor miał na myśli pisząc tą funkcje (czyli ja) XDXDXD
  676. //w tą funkcje wchodzi program jeśli użytkownik naciśnie LPM
  677. void check(int *Table, sf::RenderWindow* window, list<Card> *lista, Card *Karty, double resolutionCtrl, Board *Tlo, vector<int> emptyList)
  678. {
  679.     sf::Vector2i localPosition = sf::Mouse::getPosition(*window);  //tutaj odczytuje współrzędne kliknięcia
  680.     int x = localPosition.x;
  681.     int y = localPosition.y;// i sprawdza czy to nie jest np. przycisk pokazujący ukrytą karte (umieszczony od razu aby gdy program przeszedł w tą funkcje mógł to sprawdzić szybko
  682.     if ((((x >= 28 * resolutionCtrl) && (x <= 118 * resolutionCtrl)) && ((y >= 48 * resolutionCtrl) && (y <= 172 * resolutionCtrl))) && (sf::Mouse::isButtonPressed(sf::Mouse::Left)))
  683.     {
  684.         transferingToShow(lista, resolutionCtrl);
  685.         showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  686.         (*window).display();
  687.         Sleep(350);
  688.         return;
  689.     }
  690.     // tworzymy az 4 iteratory, byly 2 na początku i było fajnie dopóki zachciało mi się zrobić bajer aby nie tylko złapana karta się przesuwała po ekranie ale też te pod nią
  691.     list <Card>::iterator it;
  692.     list <Card>::iterator it2;
  693.     list <Card>::iterator it3;
  694.     list <Card>::iterator it4;
  695.     vector<sf::Vector2f> coOrdinates;  //tutaj jest wektor ze współrzędnymi tych kart ( tej klikniętej i tych poniżej) są one zapamiętywane na wypadek gdyby potem trzeba je cofnąć
  696.     int ordX, var = 0, ordY, i, m, saveListI, counter = 0;
  697.     struct infoAboutList result; //tutaj zmienna zapisująca wynik funkcji o pustych listach
  698.     result.index = -1; // tu taka wartość początkowa, potrzebne
  699.  
  700.     for (i = 0; i < 12; i++) //tutaj wchodzi w tą pętle i szuka czy to nasze kliknięcie to było w jakąś karte dlatego przechodzi aż przez 12 list. (zapamiętak że "i" to indeks listy z której zdejmujemy karte a "k" to indeks listy na którą dodamy karte
  701.  
  702.     {
  703.         for (it = lista[i].begin(); it != lista[i].end(); ++it)
  704.         {
  705.             if ((((x >= it->docelowe_polozenie.x) && (x <= (it->docelowe_polozenie.x + 86))) && ((y >= it->docelowe_polozenie.y) && (y <= (it->docelowe_polozenie.y + 120)))) && it->enableToMove)
  706.             {
  707.                 cout << "ID trzymanej karty!! HEHE: " << it->id_karty << endl;
  708.                 it3 = it;   //tutaj zapisujemy informacje i klikniętej i trzymanej karcie( trzeba pracować na kopii a nie oryginale, dlatego Tworzę it3)
  709.                 it3++;
  710.                 it4 = it;  //potrzebna druga kopia iteratora it ale ona będzie działała inaczej niż it3
  711.                 do {   //ta petla działa praktycznie tak samo jak ta w change list, liczy ile elementów jest pod trzymaną kartą
  712.                     if (it3 != lista[i].begin())
  713.                     {
  714.                         it3--;
  715.                     }
  716.                     coOrdinates.push_back(it3->docelowe_polozenie);
  717.                     counter++;
  718.                 } while (it3 != lista[i].begin());
  719.                 ordX = it->docelowe_polozenie.x;  // zapisuje też tu położenie tej karty trzymanej, w sumie możnaby to odczytywać z tego vectora, ale już nie chce mi siętego poprawiać( jak chcesz to poraw, będę wdzięczny :D)
  720.                 ordY = it->docelowe_polozenie.y;
  721.  
  722.                 while (sf::Mouse::isButtonPressed(sf::Mouse::Left))  //petla która przesuwa wszystkie karty i wyświetla potem
  723.                 {
  724.                     localPosition = sf::Mouse::getPosition(*window);
  725.                     for (m = 0; m < counter; m++)
  726.                     {
  727.                         (it4->docelowe_polozenie.x) = coOrdinates[m].x + (localPosition.x - x);
  728.                         it4->docelowe_polozenie.y = coOrdinates[m].y + (localPosition.y - y);
  729.                         if (it4 != lista[i].begin())
  730.                         {
  731.                             it4--;
  732.                         }
  733.                     }
  734.                     it4 = it;
  735.                     showing(Table, lista, &(*window), resolutionCtrl, Tlo, i);
  736.                     (*window).display();
  737.                 }
  738.                 if ((it->docelowe_polozenie.x != ordX) || (it->docelowe_polozenie.y != ordY))  //tutaj jest warunek który sprawdza czy wgl karta została ruszona ze swojego miejsca, bo jeśli nie to tu zostaje.
  739.                 {
  740.                     for (int k = 0; k<7; k++)  // ta pętla szuka listy ( z tych dolnych) na którą możnaby przesunąć karte/karty
  741.                     {
  742.                         if (lista[k].empty() && it->id_karty == 13)  //tu sprawdza czy lista[i] jest pusta a złapana karta to król, jeśli tak jest to dodaje indeks tej listy to wektora z indeksami pustych list
  743.                         {
  744.                             cout << "Przeszlo tu" << endl;
  745.                             emptyList.push_back(k);
  746.                         }
  747.                         else {
  748.                             cout << "Jednak Tu:" << endl;
  749.                             if(lista[k].empty())  //tu jeśli jest lista pusta to breakuje i nie pozwala nic zrobić ( tu może wynikać błąd że te karty nieraz nie chciały się przesuwać, trzeba się temu przyjrzeć)
  750.                         {
  751.                             break;
  752.                         }
  753.                             //tu sprawdza dla list zapełnionych czy współrzędne ostatniej karty się zgadzają ze współrzędnymi karty przesuwanej
  754.                             it2 = lista[k].begin();
  755.                             cout << "Polozenie karty badanej: X: " << it2->docelowe_polozenie.x << ", Y: " << it2->docelowe_polozenie.y << endl;
  756.                             if ((it->docelowe_polozenie.x < it2->docelowe_polozenie.x + 30 && it->docelowe_polozenie.x >= it2->docelowe_polozenie.x - 30 && it->docelowe_polozenie.y <= it2->docelowe_polozenie.y + 55 && it->docelowe_polozenie.y >= it2->docelowe_polozenie.y - 55 && it2->enableToMove && ((it->value % 2) != (it2->value % 2)) && it->id_karty == it2->id_karty - 1))
  757.                             {
  758.                                 cout << "Weszło dla jednej " << it->id_karty << " i drugiej " << it2->id_karty << endl;
  759.                                 if (i != k)  //tu sprawdza czy nie chcemy na jedną i tą samą lite przesunąć czyli na samą siebie
  760.                                 {
  761.                                     x = it2->docelowe_polozenie.x;
  762.                                     y = it2->docelowe_polozenie.y;
  763.                                     var = 1;  //to informuje że znalazło taką liste
  764.                                     saveListI = k; //a to zapisuje indeks listy na który zostanie przesunięta karta
  765.                                     result.index = 0;
  766.                                     break;
  767.                                 }
  768.                             }
  769.                         }
  770.                        
  771.  
  772.                     }
  773.                     if (var != 1) {  //jeśli nie znalazło listy na którą można przenieść to sprawdza w tych kartach u góry
  774.  
  775.                         for (int k = 7; k < 11; k++)
  776.                         {
  777.                             for (it2 = lista[k].begin(); it2 != lista[k].end(); ++it2)  //sprawdza czy współrzędne zgadzają się ze współrzędnymi ostatnich kart w tych listach
  778.                             {
  779.                                 if ((it->docelowe_polozenie.x < it2->docelowe_polozenie.x + 30 && it->docelowe_polozenie.x >= it2->docelowe_polozenie.x - 30 && it->docelowe_polozenie.y <= it2->docelowe_polozenie.y + 55 && it->docelowe_polozenie.y >= it2->docelowe_polozenie.y - 55 && it2->enableToMove && (it->value == it2->value) && it->id_karty == it2->id_karty + 1))
  780.                                 {
  781.                                     if (i != k)
  782.                                     {
  783.                                         x = it2->docelowe_polozenie.x;
  784.                                         y = it2->docelowe_polozenie.y;
  785.                                         var = 1;
  786.                                         saveListI = k;
  787.                                     }
  788.                                 }
  789.                             }
  790.                             if (lista[k].empty() && it->id_karty == 1) //jeśli nie to dodaje liste do tych pustych
  791.                             {
  792.                                 emptyList.push_back(k);
  793.                             }
  794.  
  795.                         }
  796.                     }
  797.                     if (var != 1)
  798.                     {
  799.                         if (!(emptyList.empty())) //i tutaj wchodzimy jeśli wektor z pustymi listami nie jest pusty
  800.                         {
  801.                             result = checkEmptyList(resolutionCtrl, emptyList, it); //tutaj wywołujemy funkcje szukającą tej pustej listy na którą przenosimy te karte, jeśli nic nie znajdzie czyli zwrócu -1 to karty powracają na miejsce początkowe
  802.                             if (result.index == -1)
  803.                             {
  804.                                 for (m = 0; m < counter; m++)
  805.                                 {
  806.  
  807.                                     it4->docelowe_polozenie.x = coOrdinates[m].x;
  808.                                     it4->docelowe_polozenie.y = coOrdinates[m].y;
  809.                                     if (it4 != lista[i].begin())
  810.                                     {
  811.                                         it4--;
  812.                                     }
  813.                                 }
  814.                                 it4 = it;
  815.                                 showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  816.                                 (*window).display();
  817.                             }
  818.                             else {   // a jeśli funkcja nie zwróci -1 to wywołuje funkcje change list tylko dla innych parametrów
  819.                                 change_list(result.index, i, lista, result.x, result.y, it, resolutionCtrl);
  820.                                 showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  821.                                 (*window).display();
  822.                             }
  823.  
  824.                         }
  825.                         else  // a jeśli te karty które chcemy przenieść nie zgadzają sięz niczym, tzn nie da się ich nigdzie przenieść do cofamy je do położenia początkowego
  826.                         {
  827.                             for (m = 0; m < counter; m++)
  828.                             {
  829.                                 it4->docelowe_polozenie.x = coOrdinates[m].x;
  830.                                 it4->docelowe_polozenie.y = coOrdinates[m].y;
  831.                                 if (it4 != lista[i].begin())
  832.                                 {
  833.                                     it4--;
  834.                                 }
  835.                             }
  836.                             it4 = it;
  837.                             showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  838.                             (*window).display();
  839.                         }
  840.                     }
  841.                     else
  842.                     { //tutaj wywołujemy funkcje change list jeśli znalazła sięjakaś zapełniona lista na krórą możemy przenieść karty
  843.                         change_list(saveListI, i, lista, ordX, ordY, it, resolutionCtrl);
  844.                         showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  845.                         (*window).display();
  846.                     }
  847.                 }
  848.                 break;
  849.             }
  850.  
  851.         }
  852.     }
  853.     //poniżej sprawdza czy nie klikneliśmy w "zacznij od nowa"
  854.     if ((((x >= 1478 * resolutionCtrl) && (x <= 1616 * resolutionCtrl)) && ((y >= 20 * resolutionCtrl) && (y <= 67 * resolutionCtrl))) && (sf::Mouse::isButtonPressed(sf::Mouse::Left)))
  855.     {
  856.         CreateBoard(Table, Karty, lista, resolutionCtrl);
  857.         showing(Table, lista, &(*window), resolutionCtrl, Tlo, 11);
  858.         (*window).display();
  859.         Sleep(700);
  860.     }
  861. }
  862.  
  863. void decision()
  864. {
  865.     double resolutionControl;
  866.     int koniec = 0;
  867.     vector <int> emptyList;
  868.     sf::VideoMode desktop = sf::VideoMode().getDesktopMode();
  869.     cout << "Width wynosi: " << desktop.width << endl;
  870.     resolutionControl = desktop.width / (double)1680;
  871.     cout << "Wynik mnoznika wynosi: " << resolutionControl << endl;
  872.     desktop.width -= 15;
  873.     desktop.height -= 70;
  874.     sf::Font font;
  875.     if (!font.loadFromFile("arial.ttf"))
  876.     {
  877.         system("pause");
  878.     }
  879.     sf::Text Title;
  880.     sf::Vector2f position;
  881.     position.x = 300 * resolutionControl;
  882.     position.y = 200 * resolutionControl;
  883.     Title.setFont(font);
  884.     Title.setString("Witamy w Pasjansie");
  885.     Title.setFillColor(sf::Color::Blue);
  886.     Title.setCharacterSize(44);
  887.     Title.setPosition(position);
  888.     sf::Text text;
  889.     position.x = 240 * resolutionControl;
  890.     position.y = 410 * resolutionControl;
  891.     text.setFont(font);
  892.     text.setString("Nowa gra");
  893.     text.setFillColor(sf::Color::Red);
  894.     text.setCharacterSize(24);
  895.     text.setPosition(position);
  896.     /*sf::Text text2;
  897.     position.x = 240 * resolutionControl;
  898.     position.y = 570 * resolutionControl;
  899.     text2.setFont(font);
  900.     text2.setString("Najlepsze wyniki");
  901.     text2.setFillColor(sf::Color::Red);
  902.     text2.setCharacterSize(24);
  903.     text2.setPosition(position); */
  904.     sf::Text text3;
  905.     position.x = 240 * resolutionControl;
  906.     position.y = 650 * resolutionControl;
  907.     text3.setFont(font);
  908.     text3.setString("Wyjdz");
  909.     text3.setFillColor(sf::Color::Red);
  910.     text3.setCharacterSize(24);
  911.     text3.setPosition(position);
  912.     Sleep(2000);
  913.     sf::Music music;
  914.     if (!music.openFromFile("audio.wav"))
  915.         system("pause");
  916.     music.setLoop(true);
  917.     music.setVolume(10);
  918.     music.play();
  919.     sf::RenderWindow window(desktop, "Pasjans", sf::Style::Close);
  920.     sf::Vector2i zero;
  921.     zero.x = 0;
  922.     zero.y = 1;
  923.     window.setPosition(zero);
  924.     /*
  925.     sf::Image Icon;
  926.     if (!Icon.loadFromFile("karty\\icon.bmp"))
  927.     exit(0);
  928.     window.setIcon(32, 32, Icon.getPixelsPtr());
  929.     */
  930.     window.clear(sf::Color::Green);
  931.     window.draw(Title);
  932.     window.draw(text);
  933.     window.draw(text3);
  934.     Card *Karty;
  935.     Board *Tlo;
  936.     Tlo = new Board[14];
  937.     Karty = new Card[52];
  938.     list<Card>*lista;
  939.     lista = new list<Card>[13];
  940.     int Table[52];
  941.     for (int i = 0; i < 52; i++)
  942.     {
  943.         Table[i] = i;
  944.     }
  945.  
  946.     waiting(&window, &music, Karty, resolutionControl, Tlo);
  947.     CreateBoard(Table, Karty, lista, resolutionControl);
  948.     showing(Table, lista, &(window), resolutionControl, Tlo, 11);
  949.     window.display();
  950.     while (true)
  951.     {
  952.         sf::Event event;
  953.         if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
  954.         {
  955.             check(Table, &window, lista, Karty, resolutionControl, Tlo, emptyList);
  956.         }
  957.         else {
  958.             while (window.pollEvent(event))
  959.             {
  960.                 if (event.type == sf::Event::Closed)
  961.                 {
  962.                     window.close();
  963.                     exit(0);
  964.                 }
  965.             }
  966.         }
  967.  
  968.         for (int i = 0; i < 7; i++)
  969.         {
  970.             if (lista[i].empty())
  971.             {
  972.                 koniec++;
  973.             }
  974.         }
  975.         for (int i = 11; i < 13; i++)
  976.         {
  977.             if (lista[i].empty())
  978.             {
  979.                 koniec++;
  980.             }
  981.         }
  982.         if (koniec == 9)
  983.             break;
  984.         else
  985.             koniec = 0;
  986.  
  987.     }
  988.     window.display();
  989. }
  990. int main()
  991. {
  992.     //FreeConsole();
  993.     decision();
  994.  
  995.     return 0;
  996. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement