Advertisement
Guest User

Untitled

a guest
Mar 29th, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int rozmiar;
  8. bool wTrakcie = false;
  9. char tab[10][10];
  10.  
  11.  
  12.  
  13. struct Gracz
  14. {
  15.     string nick;
  16.     int przegrane;
  17.     int wygrane;
  18.     int iloscGier;
  19. };
  20.  
  21. Gracz gracz1;
  22. Gracz gracz2;
  23.  
  24. struct Pole
  25. {
  26.     int val;
  27.     int id;
  28.     Pole(int ID)
  29.     {
  30.         val = 0;    // Wartosci od 0 do 2. 0 - pole puste, 1 - kolko, 2 - krzyzyk
  31.         id = ID;    // Od 0 do rozmiar*rozmiar - 1
  32.     }
  33.     Pole *Gora      = NULL;
  34.     Pole *PrawaGora = NULL;
  35.     Pole *Prawo     = NULL;
  36.     Pole *PrawyDol  = NULL;
  37.     Pole *Dol       = NULL;
  38.     Pole *LewyDol   = NULL;
  39.     Pole *Lewo      = NULL;
  40.     Pole *LewaGora  = NULL;
  41. };
  42.  
  43. struct Ruch
  44. {
  45.     Ruch(int _id, int _ktory, bool _czyj)
  46.     {
  47.         Indeks = _id;
  48.         Ktory = _ktory;
  49.         Czyj = _czyj;
  50.     }
  51.     int Indeks; // Indeks modyfikowanego pola
  52.     int Ktory;  // Ktory z kolei ruch od poczatku rozgrywki
  53.     bool Czyj;  // Tura ktorego gracza
  54. };
  55.  
  56. struct Lista
  57. {
  58.     Lista(Ruch * nowy)
  59.     {
  60.         ruch = nowy;
  61.     }
  62.     Lista * nastepne = NULL;
  63.     Ruch * ruch;
  64. };
  65.  
  66. void wyswietl(Pole * start, Lista *& poczatek);
  67. void wyswietlInterfejs(Pole * start, Lista *& poczatek);
  68. void wyswietlStatystyki(Pole * start, Lista *& poczatek);
  69.  
  70. Pole* wyszukaj(int wymiar, int nast, Pole * skad)
  71. {
  72.     Pole * temp = skad;
  73.     int ileWPrawo = nast % wymiar - temp->id % wymiar;
  74.     int ileWDol = nast / wymiar - temp->id / wymiar;
  75.     if (ileWPrawo < 0)
  76.     {
  77.         ileWPrawo = -ileWPrawo;
  78.         for (int i = 0; i < ileWPrawo; i++)
  79.         {
  80.             temp = temp->Lewo;
  81.         }
  82.     }
  83.     else
  84.     {
  85.         for (int i = 0; i < ileWPrawo; i++)
  86.         {
  87.             temp = temp->Prawo;
  88.         }
  89.     }
  90.  
  91.     if (ileWDol < 0)
  92.     {
  93.         ileWDol = -ileWDol;
  94.         for (int i = 0; i < ileWDol; i++)
  95.         {
  96.             temp = temp->Gora;
  97.         }
  98.     }
  99.     else
  100.     {
  101.         for (int i = 0; i < ileWDol; i++)
  102.         {
  103.             temp = temp->Dol;
  104.         }
  105.     }
  106.     return temp;
  107. }
  108.  
  109. void Dodaj(Ruch * NowyElement, Lista ** poczatek)
  110. {
  111.     Lista * temp;
  112.     temp = *poczatek;
  113.     if (*poczatek == NULL)
  114.     {
  115.         *poczatek = new Lista(NowyElement);             //tworzy nowy (PIERWSZY) element listy,
  116.                                                         //ktory zawiera wskaznik na nowy ruch
  117.                                                         //odpali sie tylko przy pierwszym ruchu w grze
  118.                                                         //i w sytuacji kiedy gracze cofna wszystkie ruchy
  119.         // Uaktywnienie przycisku pozwalajacego na cofanie ruchu
  120.     }
  121.     else
  122.     {
  123.         while (temp->nastepne != NULL)
  124.         {
  125.             temp = temp->nastepne;              //poruszanie sie na koniec listy
  126.         }
  127.         temp->nastepne = new Lista(NowyElement);    //dodanie nowego elementu do listy
  128.     }
  129. }
  130.  
  131. void Zdejmij(Lista *& poczatek, Pole * start, bool tryb)
  132. {
  133.     int indeks;
  134.     Lista * temp = poczatek;
  135.     if (temp->nastepne == NULL)
  136.     {
  137.         indeks = temp->ruch->Indeks;
  138.         wyszukaj(rozmiar, indeks, start)->val = 0;
  139.         poczatek = NULL;                    //cofnieto wszystkie ruchy - lista jest pusta
  140.         // Dezaktywacja przycisku pozwalajacego na cofanie ruchu
  141.     }
  142.     else
  143.     {
  144.         while (temp->nastepne->nastepne != NULL)
  145.         {
  146.             temp = temp->nastepne;              //poruszanie sie do przedostatniego elementu listy
  147.         }
  148.         indeks = temp->nastepne->ruch->Indeks;
  149.         wyszukaj(rozmiar, indeks, start)->val = 0;
  150.         delete temp->nastepne;                      //zmiana wskaznika na ostatni element na null -
  151.         temp->nastepne = NULL;                      //przedostatni element jest teraz ostatnim
  152.     }
  153.     if (!tryb)
  154.     {
  155.         int x, y;
  156.         x = indeks % rozmiar;
  157.         y = indeks / rozmiar;
  158.         tab[x][y] = '-';
  159.         wyswietl(start, poczatek);
  160.     }
  161. }
  162.  
  163. void reinicjalizujPlansze(Pole * start)
  164. {
  165.     Pole * temp = start;
  166.  
  167.     bool parzysty = 1;
  168.     for (int i = 0; i < rozmiar; i++)
  169.     {
  170.         parzysty = (i % 2 == 0);
  171.         for (int j = 0; j < rozmiar; j++)
  172.         {
  173.             if (parzysty)
  174.             {
  175.                 temp->id = rozmiar * i + j;
  176.                 if (j == rozmiar - 1)
  177.                     temp = temp->Prawo;
  178.                 else if (temp->Dol != NULL)
  179.                     temp = temp->Dol;
  180.             }
  181.             else
  182.             {
  183.                 temp->id = rozmiar * i + rozmiar - j;
  184.                 if (j == rozmiar - 1)
  185.                     temp = temp->Lewo;
  186.                 else if (temp->Dol != NULL)
  187.                     temp = temp->Dol;
  188.             }
  189.         }
  190.     }
  191. }
  192.  
  193. void utworzPlansze(int n, int nastepnePole, Pole * start)
  194. {
  195.     if (start->Dol == NULL)
  196.     {
  197.         start->Dol = new Pole(start->id + 10);
  198.         start->Dol->Gora = start;
  199.     }
  200.     if (start->Prawo == NULL)
  201.     {
  202.         start->Prawo = new Pole(start->id + 1);
  203.         start->Prawo->Lewo = start;
  204.     }
  205.     start->Prawo->LewyDol = start->Dol;
  206.     start->Dol->PrawaGora = start->Prawo;
  207.     if (start->PrawyDol == NULL)
  208.     {
  209.         start->PrawyDol = new Pole(start->id + 10 + 1);
  210.         start->PrawyDol->LewaGora = start;
  211.     }
  212.     start->Prawo->Dol = start->PrawyDol;
  213.     start->PrawyDol->Gora = start->Prawo;
  214.     start->Dol->Prawo = start->PrawyDol;
  215.     start->PrawyDol->Lewo = start->Dol;
  216.     n--;
  217.     if (n == 0)
  218.         return;
  219.  
  220.     if ((nastepnePole + 1) % 10 == 10 - 1)
  221.         nastepnePole += 2;
  222.     else
  223.         nastepnePole++;
  224.  
  225.     utworzPlansze(n, nastepnePole, wyszukaj(10, nastepnePole, start));
  226. }
  227.  
  228. bool sprawdzenieWygranej(Pole * start)
  229. {
  230.     //val pole - gracz 1 kółka, gracz 2 krzyżyk - ruch ktory == 0 - gracz 1, ruch ktory == 1 - gracz 2
  231.     int max;
  232.     if (rozmiar == 3)
  233.         max = 3;
  234.     else if (rozmiar == 4)
  235.         max = 4;
  236.     else if (rozmiar > 4)
  237.         max = 5;
  238.  
  239.     int ile = 1;
  240.     Pole * test = start;
  241.     int wartoscTestowa = -1;
  242.     if (test->val == 1)
  243.     {
  244.         wartoscTestowa = 1;
  245.     }
  246.     else if (test->val == 2)
  247.     {
  248.         wartoscTestowa = 2;
  249.     }
  250.     //testujemy dół/góra
  251.     while (test->Dol != NULL)
  252.     {
  253.         if (test->Dol->val == wartoscTestowa)
  254.         {
  255.             ile++;
  256.             test = test->Dol;
  257.             if (ile == max)
  258.                 return true;
  259.         }
  260.         else
  261.             break;
  262.     }
  263.     test = start;
  264.     while (test->Gora != NULL)
  265.     {
  266.         if (test->Gora->val == wartoscTestowa)
  267.         {
  268.             ile++;
  269.             test = test->Gora;
  270.             if (ile == max)
  271.                 return true;
  272.         }
  273.         else
  274.             break;
  275.     }
  276.     test = start;
  277.     ile = 1;
  278.     //testujemy prawo/lewo
  279.     while (test->Prawo != NULL)
  280.     {
  281.         if (test->Prawo->val == wartoscTestowa)
  282.         {
  283.             ile++;
  284.             test = test->Prawo;
  285.             if (ile == max)
  286.                 return true;
  287.         }
  288.         else
  289.             break;
  290.     }
  291.     test = start;
  292.     while (test->Lewo != NULL)
  293.     {
  294.         if (test->Lewo->val == wartoscTestowa)
  295.         {
  296.             ile++;
  297.             test = test->Lewo;
  298.             if (ile == max)
  299.                 return true;
  300.         }
  301.         else
  302.             break;
  303.     }
  304.     test = start;
  305.     ile = 1;
  306.     //testujemy prawodol/lewogora
  307.     while (test->PrawyDol != NULL)
  308.     {
  309.         if (test->PrawyDol->val == wartoscTestowa)
  310.         {
  311.             ile++;
  312.             test = test->PrawyDol;
  313.             if (ile == max)
  314.                 return true;
  315.         }
  316.         else
  317.             break;
  318.     }
  319.     test = start;
  320.     while (test->LewaGora != NULL)
  321.     {
  322.         if (test->LewaGora->val == wartoscTestowa)
  323.         {
  324.             ile++;
  325.             test = test->LewaGora;
  326.             if (ile == max)
  327.                 return true;
  328.         }
  329.         else
  330.             break;
  331.     }
  332.     test = start;
  333.     ile = 1;
  334.     //testujemy prawogora/lewodol
  335.     while (test->PrawaGora != NULL)
  336.     {
  337.         if (test->PrawaGora->val == wartoscTestowa)
  338.         {
  339.             ile++;
  340.             test = test->PrawaGora;
  341.             if (ile == max)
  342.                 return true;
  343.         }
  344.         else
  345.             break;
  346.     }
  347.     test = start;
  348.     while (test->LewyDol != NULL)
  349.     {
  350.         if (test->LewyDol->val == wartoscTestowa)
  351.         {
  352.             ile++;
  353.             test = test->LewyDol;
  354.             if (ile == max)
  355.                 return true;
  356.         }
  357.         else
  358.             break;
  359.     }
  360.     return false;
  361. }
  362.  
  363. void inicjalizujMape(Pole * start)
  364. {
  365.     for (int i = 0; i < 10; i++)
  366.     {
  367.         for (int j = 0; j < 10; j++)
  368.         {
  369.             tab[i][j] = '-';
  370.         }
  371.     }
  372.     utworzPlansze(9*9, 0, start);
  373. }
  374.  
  375. void czyscMape(Pole * start, Lista *& poczatek)
  376. {
  377.     while (poczatek != NULL)
  378.     {
  379.         Zdejmij(poczatek, start, 1);
  380.     }
  381.     for (int i = 0; i < 10; i++)
  382.     {
  383.         for (int j = 0; j < 10; j++)
  384.         {
  385.             tab[i][j] = '-';
  386.         }
  387.     }
  388. }
  389.  
  390. bool wykonajRuch(Pole * start, Lista *& poczatek, int x, int y)
  391. {
  392.     int indeks = x + rozmiar * y;
  393.     Lista * test = poczatek;
  394.     Pole * obecne = wyszukaj(rozmiar, indeks, start);
  395.     if (obecne->val != 0)
  396.     {
  397.         cout << "Wykonano błędny ruch - pole jest już zajęte!!!\n";
  398.         cout << "Wpisz dowolny znak aby wrócić do gry";
  399.         char komenda;
  400.  
  401.         cin >> komenda;
  402.         return false;
  403.     }
  404.     if (test != NULL)
  405.     {
  406.         while (test->nastepne != NULL)
  407.         {
  408.             test = test->nastepne;
  409.         }
  410.         if (test->ruch->Czyj)
  411.         {
  412.             obecne->val = 1;
  413.         }
  414.         else
  415.         {
  416.             obecne->val = 2;
  417.         }
  418.         Dodaj(new Ruch(indeks, test->ruch->Ktory++, !test->ruch->Czyj), &test);
  419.         tab[x][y] = test->ruch->Czyj ? 'o' : 'x';
  420.     }
  421.     else
  422.     {
  423.         obecne->val = 1;
  424.         Dodaj(new Ruch(indeks, 1, false), &poczatek);
  425.         tab[x][y] = 'o';
  426.     }
  427.    
  428.     if (sprawdzenieWygranej(obecne))
  429.     {
  430.         system("cls");
  431.         int wygrana = test->ruch->Czyj ? 1 : 2;
  432.         for (int i = 0; i < 5; i++)
  433.         {
  434.             cout << "Wygral gracz: " << wygrana << "!!!\n";
  435.         }
  436.         if (wygrana == 1)
  437.         {
  438.             gracz1.wygrane++;
  439.             gracz1.iloscGier++;
  440.             gracz2.przegrane++;
  441.             gracz2.iloscGier++;
  442.         }
  443.         else
  444.         {
  445.             gracz1.przegrane++;
  446.             gracz1.iloscGier++;
  447.             gracz2.wygrane++;
  448.             gracz2.iloscGier++;
  449.  
  450.             Gracz gracztemp = gracz1;
  451.             gracz1 = gracz2;
  452.             gracz2 = gracztemp;
  453.         }
  454.         cout << "Wpisz dowolny znak aby wrocic do poprzedniego menu\n";
  455.         char komenda;
  456.         cin >> komenda;
  457.         wTrakcie = false;
  458.         return true;
  459.     }
  460.     return false;
  461. }
  462.  
  463. void pobierzGraczy()
  464. {
  465.     cout << "Podaj nick gracza 1:\n";
  466.  
  467.     cin >> gracz1.nick;
  468.  
  469.     cout << "Podaj nick gracza 2:\n";
  470.  
  471.     cin >> gracz2.nick;
  472.  
  473.     while (gracz1.nick == gracz2.nick)
  474.     {
  475.         cout << "Blad! Nie mozna wpisac drugi raz tego samego nicku!!!";
  476.         cin >> gracz2.nick;
  477.     }
  478.  
  479.     ifstream plikGracza1(gracz1.nick + "Save");
  480.     ifstream plikGracza2(gracz2.nick + "Save");
  481.  
  482.     if (plikGracza1.is_open())
  483.     {
  484.         string number;
  485.         getline(plikGracza1, number);
  486.         gracz1.przegrane = stoi(number);
  487.         getline(plikGracza1, number);
  488.         gracz1.wygrane = stoi(number);
  489.         getline(plikGracza1, number);
  490.         gracz1.iloscGier = stoi(number);
  491.     }
  492.     else
  493.     {
  494.         gracz1.przegrane = 0;
  495.         gracz1.wygrane = 0;
  496.         gracz1.iloscGier = 0;
  497.     }
  498.     if (plikGracza2.is_open())
  499.     {
  500.         string number;
  501.         getline(plikGracza2, number);
  502.         gracz2.przegrane = stoi(number);
  503.         getline(plikGracza2, number);
  504.         gracz2.wygrane = stoi(number);
  505.         getline(plikGracza2, number);
  506.         gracz2.iloscGier = stoi(number);
  507.     }
  508.     else
  509.     {
  510.         gracz2.przegrane = 0;
  511.         gracz2.wygrane = 0;
  512.         gracz2.iloscGier = 0;
  513.     }
  514.     plikGracza1.close();
  515.     plikGracza2.close();
  516. }
  517.  
  518. void zapisz()
  519. {
  520.     ofstream plikGracza1(gracz1.nick + "Save");
  521.     ofstream plikGracza2(gracz2.nick + "Save");
  522.  
  523.     plikGracza1 << gracz1.przegrane << "\n";
  524.     plikGracza1 << gracz1.wygrane   << "\n";
  525.     plikGracza1 << gracz1.iloscGier << "\n";
  526.  
  527.     plikGracza2 << gracz2.przegrane << "\n";
  528.     plikGracza2 << gracz2.wygrane   << "\n";
  529.     plikGracza2 << gracz2.iloscGier << "\n";
  530. }
  531.  
  532. void wyswietlStatystyki(Pole * start, Lista *& poczatek)
  533. {
  534.     system("cls");
  535.     cout << "Gracz 1 "      << gracz1.nick      << ":\n"
  536.          << "Liczba gier: " << gracz1.iloscGier << "\n"
  537.          << "Wygranych: "   << gracz1.wygrane   << "\n"
  538.          << "Przegranych: " << gracz1.przegrane << "\n\n";
  539.  
  540.     cout << "Gracz 2 "      << gracz2.nick << ":\n"
  541.         << "Liczba gier: "  << gracz2.iloscGier << "\n"
  542.         << "Wygranych: "    << gracz2.wygrane << "\n"
  543.         << "Przegranych: "  << gracz2.przegrane << "\n\n";
  544.  
  545.     cout << "Wpisz dowolny znak aby wrocic do poprzedniego menu\n";
  546.     char komenda;
  547.     cin >> komenda;
  548.     wyswietlInterfejs(start, poczatek);
  549. }
  550.  
  551. void wyswietl(Pole * start, Lista *& poczatek)
  552. {
  553.     system("cls");
  554.     cout << " ";
  555.     for (int i = 0; i < rozmiar; i++)
  556.         cout << i + 1;
  557.     cout << "\n";
  558.     for (int i = 0; i < rozmiar; i++)
  559.     {
  560.         cout << i + 1;
  561.         for (int j = 0; j < rozmiar; j++)
  562.         {
  563.             cout << tab[i][j];
  564.         }
  565.         cout << "\n";
  566.     }
  567.     cout << "Ruch gracza ";
  568.     if (poczatek == NULL)
  569.         cout << gracz1.nick << " (Kolko)\n";
  570.     else
  571.     {
  572.         Lista * temp;
  573.         temp = poczatek;
  574.         while (temp->nastepne != NULL)
  575.         {
  576.             temp = temp->nastepne;
  577.         }
  578.         if (temp->ruch->Czyj)
  579.         {
  580.             cout << gracz1.nick << " (Kolko)\n";
  581.         }
  582.         else
  583.         {
  584.             cout << gracz2.nick << " (Krzyzyk)\n";
  585.         }
  586.     }
  587.    
  588.     cout << "\nPodaj komende:\n"
  589.         << "1. Wykonaj ruch\n"
  590.         << "2. Cofnij ruch\n"
  591.         << "3. Powrot do menu\n";
  592.  
  593.     int komenda;
  594.  
  595.     cin >> komenda;
  596.  
  597.     switch (komenda)
  598.     {
  599.     case 1:
  600.         cout << "Podaj numer pola (wspolrzedne x, y)\n";
  601.         int x, y;
  602.         cin >> x >> y;
  603.         if (wykonajRuch(start, poczatek, x - 1, y - 1))
  604.             czyscMape(start, poczatek);
  605.         wyswietl(start, poczatek);
  606.         break;
  607.     case 2:
  608.         if (poczatek != NULL)
  609.             Zdejmij(poczatek, start, false);
  610.         else
  611.             wyswietl(start, poczatek);
  612.         break;
  613.     default:
  614.         wyswietlInterfejs(start, poczatek);
  615.         break;
  616.     }
  617. }
  618.  
  619. void wyswietlInterfejs(Pole * start, Lista *& poczatek)
  620. {
  621.  
  622.     system("cls");
  623.     cout << "Co chcecie zrobic?\n"
  624.          << "1. Gra\n"
  625.          << "2. Statystyki\n"
  626.          << "3. Wyjscie\n";
  627.     int komenda;
  628.     cin >> komenda;
  629.  
  630.     switch (komenda)
  631.     {
  632.     case 1:
  633.         if (wTrakcie)
  634.             wyswietl(start, poczatek);
  635.         else
  636.         {
  637.             if (!wTrakcie)
  638.             {
  639.                 cout << "Podaj rozmiar mapy (z zakresu od 3 do 10)\n";
  640.                 cin >> rozmiar;
  641.                 while (rozmiar > 10 || rozmiar < 3)
  642.                 {
  643.                     cout << "Bledny rozmiar. Nalezy podac liczbe z zakresu 3 do 10.\n";
  644.                     cin >> rozmiar;
  645.                 }
  646.                 reinicjalizujPlansze(start);
  647.                 wTrakcie = true;
  648.                 wyswietl(start, poczatek);
  649.             }
  650.             else
  651.                 wyswietl(start, poczatek);
  652.         }
  653.  
  654.         break;
  655.     case 2:
  656.         wyswietlStatystyki(start, poczatek);
  657.         break;
  658.     default:
  659.         break;
  660.     }
  661. }
  662.  
  663. int main()
  664. {
  665.     Pole * start = new Pole(0);
  666.     Lista * poczatek = NULL;
  667.     inicjalizujMape(start);
  668.     pobierzGraczy();
  669.     wyswietlInterfejs(start, poczatek);
  670.     zapisz();
  671.     return 0;
  672. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement