Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <iostream>
- #include <windows.h>
- #define KONIEC -1
- #define GRACZ2_WYGRYWA 0
- #define GRACZ1_WYGRYWA 1
- #define REMIS 2
- #define RANK 15
- #define PLIK "Eksperyment2.txt"
- #define ZAMIANA 1
- #define BRAK_ZAMIANY 0
- using namespace std;
- enum kolory_kart {
- PIK, //0
- KIER, //1
- TREFL, //2
- KARO //3
- };
- enum strategie {
- PODSTAWOWA = 1,
- LOSOWA,
- WSCIEKLA,
- POKOJOWA
- };
- struct karta_t {
- int kolor;
- int wartosc;
- };
- struct gracz {
- karta_t karta;
- gracz* kolejny;
- };
- int porownajKarty(gracz* gracz1, gracz* gracz2) {
- if (gracz1->kolejny == NULL) {
- cout << "GRACZ 2 WYGRYWA! " << endl;
- return KONIEC;
- }
- else if (gracz2->kolejny == NULL) {
- cout << "GRACZ 1 WYGRYWA! " << endl;
- return KONIEC;
- }
- else {
- cout << gracz1->kolejny->karta.wartosc << "/" << gracz1->kolejny->karta.kolor;
- cout << " vs ";
- cout << gracz2->kolejny->karta.wartosc << "/" << gracz2->kolejny->karta.kolor << endl;
- if (gracz1->kolejny->karta.wartosc > gracz2->kolejny->karta.wartosc) {
- cout << "GRACZ 1 WYGRYWA TE RUNDE" << endl;
- return GRACZ1_WYGRYWA;
- }
- else if (gracz1->kolejny->karta.wartosc < gracz2->kolejny->karta.wartosc) {
- cout << "GRACZ 2 WYGRYWA TE RUNDE" << endl;
- return GRACZ2_WYGRYWA;
- }
- else if (gracz1->kolejny->karta.wartosc == gracz2->kolejny->karta.wartosc) {
- cout << "WOJNA!" << endl;
- return REMIS;
- }
- }
- }
- void przetrzymajKarty(gracz* player1, gracz* player2, int zwyciezca) {
- struct gracz* karty_gracza1 = (struct gracz*) malloc(sizeof(gracz));
- struct gracz* karty_gracza2 = (struct gracz*) malloc(sizeof(gracz));
- karty_gracza1->karta = player1->kolejny->karta;
- karty_gracza2->karta = player2->kolejny->karta;
- karty_gracza1->kolejny = NULL;
- karty_gracza2->kolejny = NULL;
- if (zwyciezca == GRACZ1_WYGRYWA) {
- karty_gracza1->kolejny = karty_gracza2;
- gracz* p1 = player1;
- while (p1->kolejny != NULL) {
- p1 = p1->kolejny;
- }
- p1->kolejny = karty_gracza1;
- }
- if (zwyciezca == GRACZ2_WYGRYWA) {
- karty_gracza2->kolejny = karty_gracza1;
- gracz* p2 = player2;
- while (p2->kolejny != NULL) {
- p2 = p2->kolejny;
- }
- p2->kolejny = karty_gracza2;
- }
- }
- void fuzjaKart(struct gracz* player, struct gracz* player_win, struct gracz* player_lose) { //Połączenie kart, które brały udział w wojnie w logiczny sposób
- gracz* gracz_win = player_win;
- while (gracz_win->kolejny != NULL) {
- gracz_win = gracz_win->kolejny;
- }
- gracz_win->kolejny = player_lose->kolejny;
- gracz* p = player;
- while (p->kolejny != NULL) {
- p = p->kolejny;
- }
- p->kolejny = player_win->kolejny;
- }
- void zapiszKarty(struct gracz* player, struct gracz* wojna) { //Kontener na karty biorące udział w wojnie
- gracz* zawodnik = player;
- while (zawodnik->kolejny != NULL) {
- zawodnik = zawodnik->kolejny;
- }
- zawodnik->kolejny = wojna->kolejny;
- }
- void wypiszKarty(struct gracz* gracz1, struct gracz* gracz2, int rozmiar) { //Wypisywanie kart posiadanych przez każdego z graczy
- gracz* gr1 = gracz1;
- gracz* gr2 = gracz2;
- cout << "GRACZ1: ";
- while (gr1->kolejny != NULL) {
- cout << gr1->kolejny->karta.wartosc << "/" << gr1->kolejny->karta.kolor << " | ";
- gr1 = gr1->kolejny;
- }
- cout << endl;
- cout << "GRACZ2: ";
- while (gr2->kolejny != NULL) {
- cout << gr2->kolejny->karta.wartosc << "/" << gr2->kolejny->karta.kolor << " | ";
- gr2 = gr2->kolejny;
- }
- cout << endl;
- }
- int wyborKarty(struct gracz* gracz_1, int tryb,struct gracz* gracz_2) { //MADRA WOJNA
- int wybor;
- if (tryb == PODSTAWOWA) {
- cout << "Aby wybrac karte: " << gracz_1->kolejny->karta.wartosc << "/" << gracz_1->kolejny->karta.kolor <<" do bitwy, kliknij 1" << endl;
- cout << "Jesli jednak ma to byc karta: " << gracz_1->kolejny->kolejny->karta.wartosc << "/" << gracz_1->kolejny->kolejny->karta.kolor << " kliknij 2" << endl;
- cin >> wybor;
- if (wybor == 1) {
- return BRAK_ZAMIANY;
- }
- else {
- return ZAMIANA;
- }
- }
- else if (tryb == LOSOWA) {
- wybor = rand() % 2 + 1;
- if (wybor == 1) {
- return BRAK_ZAMIANY;
- }
- else {
- return ZAMIANA;
- }
- }
- else if (tryb == WSCIEKLA) {
- if (gracz_1->kolejny->karta.wartosc == gracz_2->kolejny->karta.wartosc) {
- return BRAK_ZAMIANY;
- }
- else {
- if ((gracz_1->kolejny->karta.wartosc > gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->karta.wartosc < gracz_1->kolejny->kolejny->karta.wartosc)) {
- return BRAK_ZAMIANY;
- }
- else if ((gracz_1->kolejny->karta.wartosc < gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->karta.wartosc > gracz_1->kolejny->kolejny->karta.wartosc)) {
- return ZAMIANA;
- }
- else if (gracz_1->kolejny->kolejny->karta.wartosc > gracz_2->kolejny->karta.wartosc) {
- return ZAMIANA;
- }
- else if (gracz_1->kolejny->kolejny->karta.wartosc == gracz_2->kolejny->karta.wartosc) {
- return ZAMIANA;
- }
- else {
- return BRAK_ZAMIANY;
- }
- }
- }
- else if (tryb == POKOJOWA) {
- if (gracz_1->kolejny->karta.wartosc == gracz_2->kolejny->karta.wartosc) {
- return ZAMIANA;
- }
- else if (gracz_1->kolejny->kolejny->karta.wartosc == gracz_2->kolejny->karta.wartosc) {
- return BRAK_ZAMIANY;
- }
- else {
- if ((gracz_1->kolejny->karta.wartosc < gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->kolejny->karta.wartosc < gracz_2->kolejny->karta.wartosc)) {
- if (gracz_1->kolejny->karta.wartosc <= gracz_1->kolejny->kolejny->karta.wartosc) {
- return BRAK_ZAMIANY;
- }
- else {
- return ZAMIANA;
- }
- }
- else if ((gracz_1->kolejny->kolejny->karta.wartosc > gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->kolejny->karta.wartosc < gracz_1->kolejny->karta.wartosc)) {
- return ZAMIANA;
- }
- else if ((gracz_1->kolejny->karta.wartosc > gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->karta.wartosc < gracz_1->kolejny->kolejny->karta.wartosc)) {
- return BRAK_ZAMIANY;
- }
- else if ((gracz_1->kolejny->karta.wartosc > gracz_2->kolejny->karta.wartosc) && (gracz_1->kolejny->karta.wartosc < gracz_2->kolejny->karta.wartosc)) {
- return BRAK_ZAMIANY;
- }
- else {
- return ZAMIANA;
- }
- }
- }
- }
- void zamienKarty(struct gracz* zawodnik) {
- gracz* gr = zawodnik->kolejny;
- zawodnik->kolejny = zawodnik->kolejny->kolejny;
- gr->kolejny = gr->kolejny->kolejny;
- zawodnik->kolejny->kolejny = gr;
- }
- void potasujWygrane(struct gracz* gracz_1, struct gracz* gracz_2) {
- struct gracz* tymczasowe1 = gracz_1;
- struct gracz* tymczasowe2 = gracz_2;
- int losowa = rand() % 2;
- if (losowa) {
- gracz_1 = tymczasowe2;
- gracz_2 = tymczasowe1;
- }
- }
- karta_t* kartyZWojny(struct gracz* gracz_1, struct gracz* gracz_2, int licznik_wojen) {
- int liczba_kart = licznik_wojen * 2 + 1;
- struct gracz* tymczasowe1 = gracz_1;
- struct gracz* tymczasowe2 = gracz_2;
- tymczasowe1 = tymczasowe1->kolejny;
- tymczasowe2 = tymczasowe2->kolejny;
- struct karta_t* talia = (karta_t*)malloc(sizeof(karta_t));
- for (int i = 0; i < liczba_kart*2; i+=2) {
- talia[i] = tymczasowe1->karta;
- talia[i + 1] = tymczasowe2->karta;
- tymczasowe1 = tymczasowe1->kolejny;
- tymczasowe2 = tymczasowe2->kolejny;
- }
- free(tymczasowe1);
- free(tymczasowe2);
- return talia;
- }
- /* FUNKCJE RANKINGOWE
- int policzRange1(struct gracz* gracz_) {
- gracz* pierwszy = gracz_;
- int ranga = 0;
- while (pierwszy->kolejny != NULL) {
- ranga += pierwszy->kolejny->karta.wartosc;
- pierwszy = pierwszy->kolejny;
- }
- return ranga;
- }
- int policzRange3(struct gracz* gracz_) {
- gracz* pierwszy = gracz_;
- int ranga = 0;
- while (pierwszy->kolejny != NULL) {
- if (pierwszy->kolejny->karta.wartosc == 14) { //AS liczony *2,5 (bo jego wartosc to 14, dodajemy 7 i jeszcze 14 z kolejnej instrukcji if)
- ranga += 7;
- }
- if (pierwszy->kolejny->karta.wartosc > 9) { //Karty od 10 do KRÓLA(13) liczone podwójnie
- ranga += pierwszy->kolejny->karta.wartosc;
- }
- if (ranga += pierwszy->kolejny->karta.wartosc > 3) { //2 i 3 nie są wcale liczone
- ranga += pierwszy->kolejny->karta.wartosc;
- }
- pierwszy = pierwszy->kolejny;
- }
- return ranga;
- }
- int policzRange2(struct gracz* gracz_) {
- gracz* pierwszy = gracz_;
- int ranga = 0;
- while (pierwszy->kolejny != NULL) {
- if(pierwszy->kolejny->karta.wartosc >=9)
- ranga += pierwszy->kolejny->karta.wartosc;
- pierwszy = pierwszy->kolejny;
- }
- return ranga;
- }*/
- void rozdajKartyZMadrej(struct gracz* gracz_1, struct gracz* gracz_2, karta_t talia_[], int rozmiar_) {
- struct gracz* tymczasowe_1 = gracz_1;
- struct gracz* tymczasowe_2 = gracz_2;
- for (int i = 0, j = (rozmiar_ / 2); i < (rozmiar_ /2) ; i++,j++) {
- tymczasowe_1->kolejny->karta = talia_[i];
- tymczasowe_2->kolejny->karta = talia_[j];
- tymczasowe_1 = tymczasowe_1->kolejny;
- tymczasowe_2 = tymczasowe_2->kolejny;
- }
- tymczasowe_1->kolejny = NULL;
- tymczasowe_2->kolejny = NULL;
- }
- void pozyczKarty(struct gracz* potrzebujacy, struct gracz* oddajacy, int liczba_kart, int liczba_wojen) { //Funkcja odpowiedzialna za turę wspomaganą, warunki są powiązane z tymi znajdującymi się w main'ie, dotyczącymi wariantu B
- gracz* oddajacy_tymczasowa = oddajacy->kolejny;
- if (liczba_kart != 2) {
- for (int i = 0; i < 1; i++)
- oddajacy_tymczasowa = oddajacy_tymczasowa->kolejny;
- }
- if (liczba_kart == 1 && liczba_wojen > 1) {
- oddajacy->kolejny->kolejny = oddajacy->kolejny->kolejny->kolejny;
- oddajacy_tymczasowa->kolejny = NULL;
- }
- else if (liczba_wojen >= 2 && liczba_kart == 2) {
- oddajacy->kolejny = oddajacy->kolejny->kolejny->kolejny;
- oddajacy_tymczasowa->kolejny->kolejny = NULL;
- }
- else if (liczba_wojen==1 && liczba_kart==2) {
- oddajacy_tymczasowa = oddajacy_tymczasowa->kolejny;
- oddajacy->kolejny->kolejny = oddajacy->kolejny->kolejny->kolejny->kolejny;
- oddajacy_tymczasowa->kolejny->kolejny = NULL;
- }
- else if (liczba_wojen == 1 && liczba_kart == 1) {
- oddajacy_tymczasowa = oddajacy_tymczasowa->kolejny;
- oddajacy->kolejny->kolejny->kolejny = oddajacy->kolejny->kolejny->kolejny->kolejny;
- oddajacy_tymczasowa->kolejny = NULL;
- }
- else {
- oddajacy->kolejny->kolejny = oddajacy->kolejny->kolejny->kolejny->kolejny;
- oddajacy_tymczasowa->kolejny->kolejny = NULL;
- }
- if (liczba_wojen == 1 && liczba_kart == 1) {
- potrzebujacy->kolejny->kolejny->kolejny = oddajacy_tymczasowa;
- }
- else if (liczba_wojen != 1 && liczba_kart == 2) {
- potrzebujacy->kolejny = oddajacy_tymczasowa;
- }
- else
- potrzebujacy->kolejny->kolejny = oddajacy_tymczasowa;
- }
- void rozdawanieKart(struct gracz* player, struct karta_t talia[], int rozmiar) {
- if (rozmiar != 0) {
- struct gracz* pomoc = (struct gracz*) malloc(sizeof(gracz));
- pomoc->karta = talia[rozmiar - 1];
- pomoc->kolejny = player->kolejny;
- player->kolejny = pomoc;
- rozdawanieKart(player->kolejny, talia, rozmiar - 1); //Rozdawanie kolejnych kart z talii, kazdy z graczy otrzymuje polowe przetasowanej talii
- }
- }
- karta_t* tworzenieTalii(struct karta_t talia[], int rozmiar) {
- talia = (karta_t*)malloc(rozmiar * sizeof(karta_t));
- if (talia == NULL) {
- cout << "Brak pamięci";
- return NULL;
- }
- int ranking = RANK;
- int kolor = 0;
- for (int i = 0; i < rozmiar; i++) {
- talia[i].wartosc = --ranking; //Przydzielanie każdej karcie wartośći [2-14] gdzie 14=AS
- talia[i].kolor = kolor; //Przydzielanie każdej karcie koloru, patrz. enum
- if (ranking == RANK - rozmiar / 4) {
- ranking = 15;
- kolor++;
- }
- }
- return talia;
- }
- karta_t* tasowanieTalii(struct karta_t talia[], int rozmiar) { //Tasowanie kart wykonywane 5-krotnie, dla większej pewności, że będą dobrze potasowane oraz przedewszystkim dla realizmu gry
- int wartosc_pomocnicza;
- int kolor_pomocniczy;
- for (int i = 0; i < 5 * rozmiar; i++) {
- int indeks_pomocniczy = rand() % rozmiar;
- wartosc_pomocnicza = talia[i % rozmiar].wartosc;
- kolor_pomocniczy = talia[i % rozmiar].kolor;
- talia[i % rozmiar].wartosc = talia[indeks_pomocniczy].wartosc;
- talia[i % rozmiar].kolor = talia[indeks_pomocniczy].kolor;
- talia[indeks_pomocniczy].wartosc = wartosc_pomocnicza;
- talia[indeks_pomocniczy].kolor = kolor_pomocniczy;
- }
- return talia;
- }
- int main() {
- srand(time(NULL));
- //FILE* zapis;
- //zapis = fopen(PLIK, "w");
- struct karta_t* karty = NULL;
- int rozmiar_talii;
- bool gra = true;
- short int wynik;
- int licznik_wojen = 0;
- int brakujace_karty = 0;
- int tury_wspomagane = 0;
- cout << "GRA W WOJNE" << "\n\n";
- cout << "Podaj rozmiar talii, ktora chcesz zagrac: ";
- cin >> rozmiar_talii;
- karty = tworzenieTalii(karty, rozmiar_talii);
- tasowanieTalii(karty, rozmiar_talii);
- //ROZDAWANIE KART GRACZOM
- gracz* gracz1 = (gracz*)malloc(sizeof(gracz));
- gracz* gracz2 = (gracz*)malloc(sizeof(gracz));
- rozdawanieKart(gracz1, karty, rozmiar_talii / 2);
- rozdawanieKart(gracz2, karty + rozmiar_talii / 2, rozmiar_talii / 2);
- gracz* gr1_ = gracz1;
- gracz* gr2_ = gracz2;
- for (int i = 0; i < rozmiar_talii / 2; i++) { //Przypisanie ostatniej karcie każdego gracza wskaznika na kolejna == NULL, dzieki temu prostsze stanie sie porowywanie kart
- gr1_ = gr1_->kolejny;
- gr2_ = gr2_->kolejny;
- }
- gr1_->kolejny = NULL;
- gr2_->kolejny = NULL;
- /* SPRAWADZENIE CZY KARTY ROZDAJA SIE POPRAWNIE
- int licznik = 1;
- gracz* gr1 = gracz1;
- gracz* gr2 = gracz2;
- while (licznik <= rozmiar_talii/2) {
- cout <<licznik<< " " << gr1->kolejny->karta.wartosc << " " << gr1->kolejny->karta.kolor << endl;
- gr1 = gr1->kolejny;
- cout <<licznik++ << ".2 "<< gr2->kolejny->karta.wartosc << " " << gr2->kolejny->karta.kolor << endl;
- gr2 = gr2->kolejny;
- } */
- // WOJNA
- char komenda;
- cout << "Wybierz warinat gry sposrod A i B oraz M (madra wojna): ";
- cin >> komenda;
- switch (komenda)
- {
- case 'A': //WARIANT B
- while (gra) {
- wypiszKarty(gracz1, gracz2, rozmiar_talii);
- tury_wspomagane = 0;
- wynik = porownajKarty(gracz1, gracz2);
- if (wynik == GRACZ1_WYGRYWA || wynik == GRACZ2_WYGRYWA) {
- przetrzymajKarty(gracz1, gracz2, wynik);
- gracz1 = gracz1->kolejny;
- gracz2 = gracz2->kolejny;
- }
- else if (wynik == REMIS) {
- gracz* g1 = (gracz*)malloc(sizeof(gracz));
- gracz* g2 = (gracz*)malloc(sizeof(gracz));
- while (wynik == REMIS) {
- ++licznik_wojen;
- gracz* g1_remis = (gracz*)malloc(sizeof(gracz));
- gracz* g2_remis = (gracz*)malloc(sizeof(gracz));
- if (gracz1->kolejny == NULL && gracz2->kolejny == NULL) {
- cout << "REMIS!" << endl;
- gra = false;
- break;
- }
- if (gracz1 != NULL && gracz1->kolejny != NULL && gracz1->kolejny->kolejny != NULL) {
- g1_remis->kolejny = gracz1->kolejny;
- if (licznik_wojen == 1 && gracz1->kolejny->kolejny->kolejny != NULL) {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 2 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (gracz2 != NULL && gracz2->kolejny != NULL && gracz2->kolejny->kolejny != NULL) {
- g2_remis->kolejny = gracz2->kolejny;
- if (licznik_wojen == 1 && gracz2->kolejny->kolejny->kolejny != NULL) {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 1 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (licznik_wojen == 1)
- wynik = porownajKarty(g1_remis->kolejny->kolejny, g2_remis->kolejny->kolejny);
- else
- wynik = porownajKarty(g1_remis->kolejny, g2_remis->kolejny);
- if (licznik_wojen == 1) {
- g1 = g1_remis;
- g2 = g2_remis;
- }
- else {
- zapiszKarty(g1, g1_remis);
- zapiszKarty(g2, g2_remis);
- }
- }
- if (wynik == GRACZ1_WYGRYWA) {
- fuzjaKart(gracz1, g1, g2);
- licznik_wojen = 0;
- }
- else if (wynik == GRACZ2_WYGRYWA) {
- fuzjaKart(gracz2, g2, g1);
- licznik_wojen = 0;
- }
- }
- else if (wynik == KONIEC) {
- gra = false;
- }
- }
- break;
- case 'B' : //Wariant B
- while (gra) {
- wypiszKarty(gracz1, gracz2, rozmiar_talii);
- wynik = porownajKarty(gracz1, gracz2);
- tury_wspomagane = 0;
- if (wynik == GRACZ1_WYGRYWA || wynik == GRACZ2_WYGRYWA) {
- przetrzymajKarty(gracz1, gracz2, wynik);
- gracz1 = gracz1->kolejny;
- gracz2 = gracz2->kolejny;
- }
- else if (wynik == REMIS) {
- gracz* g1 = (gracz*)malloc(sizeof(gracz));
- gracz* g2 = (gracz*)malloc(sizeof(gracz));
- while (wynik == REMIS) {
- ++licznik_wojen;
- gracz* g1_remis = (gracz*)malloc(sizeof(gracz));
- gracz* g2_remis = (gracz*)malloc(sizeof(gracz));
- if (gracz1->kolejny == NULL && gracz2->kolejny == NULL) {
- cout << "REMIS!" << endl;
- gra = false;
- break;
- }
- if (tury_wspomagane == 0) {
- if (gracz1->kolejny == NULL && licznik_wojen > 1) { //Poniższe 4 przypadki definiują zachowanie gry w przypadku wariantu B, konkretnie gdy jednemu z graczy "brakują" 2 KARTY
- brakujace_karty = 2;
- pozyczKarty(gracz1, gracz2, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz1->kolejny->kolejny == NULL && licznik_wojen == 1) {
- brakujace_karty = 2;
- pozyczKarty(gracz1, gracz2, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz2->kolejny == NULL && licznik_wojen > 1) {
- brakujace_karty = 2;
- pozyczKarty(gracz2, gracz1, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz2->kolejny->kolejny == NULL && licznik_wojen == 1) {
- brakujace_karty = 2;
- pozyczKarty(gracz2, gracz1, brakujace_karty, licznik_wojen);
- tury_wspomagane++; //Koniec przypadków dla brakujących 2 KART
- }
- else if (gracz1->kolejny->kolejny == NULL && licznik_wojen > 1) { //Poniższe 4 przypadki definiują zachowanie gry w przypadku wariantu B, konkretnie gdy jednemu z graczy "brakuje" 1 KARTA
- brakujace_karty = 1;
- pozyczKarty(gracz1, gracz2, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz1->kolejny->kolejny->kolejny == NULL && licznik_wojen == 1) {
- brakujace_karty = 1;
- pozyczKarty(gracz1, gracz2, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz2->kolejny->kolejny == NULL && licznik_wojen > 1) {
- brakujace_karty = 1;
- pozyczKarty(gracz2, gracz1, brakujace_karty, licznik_wojen);
- tury_wspomagane++;
- }
- else if (gracz2->kolejny->kolejny->kolejny == NULL && licznik_wojen == 1) {
- brakujace_karty = 1;
- pozyczKarty(gracz2, gracz1, brakujace_karty, licznik_wojen);
- tury_wspomagane++; //Koniec przypadków dla brakującej 1 KARTY
- }
- }
- if (gracz1 != NULL && gracz1->kolejny != NULL && gracz1->kolejny->kolejny != NULL) {
- g1_remis->kolejny = gracz1->kolejny;
- if (licznik_wojen == 1 && gracz1->kolejny->kolejny->kolejny != NULL) {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 2 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (gracz2 != NULL && gracz2->kolejny != NULL && gracz2->kolejny->kolejny != NULL) {
- g2_remis->kolejny = gracz2->kolejny;
- if (licznik_wojen == 1 && gracz2->kolejny->kolejny->kolejny != NULL) {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 1 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (licznik_wojen == 1)
- wynik = porownajKarty(g1_remis->kolejny->kolejny, g2_remis->kolejny->kolejny);
- else
- wynik = porownajKarty(g1_remis->kolejny, g2_remis->kolejny);
- if (licznik_wojen == 1) {
- g1 = g1_remis;
- g2 = g2_remis;
- }
- else {
- zapiszKarty(g1, g1_remis);
- zapiszKarty(g2, g2_remis);
- }
- }
- if (wynik == GRACZ1_WYGRYWA) {
- fuzjaKart(gracz1, g1, g2);
- licznik_wojen = 0;
- tury_wspomagane = 0;
- }
- else if (wynik == GRACZ2_WYGRYWA) {
- fuzjaKart(gracz2, g2, g1);
- licznik_wojen = 0;
- tury_wspomagane = 0;
- }
- }
- else if (wynik == KONIEC) {
- gra = false;
- }
- }
- break;
- case 'M' : //MĄDRA WOJNA
- int tury = 0;
- int zamiana;
- int tryb1,tryb2;
- cout << "Wybierz strategie: " << endl;
- cout << " 1.Podstawowa \n 2.Losowa \n 3.Wsciekla \n 4.Pokojowa \n Wpisz numer strategii" << endl;
- cout << " Strategia gracz1: ";
- cin >> tryb1;
- cout << " Strategia gracz2: ";
- cin >> tryb2;
- while (gra) {
- wypiszKarty(gracz1, gracz2, rozmiar_talii);
- if (gracz1->kolejny == NULL) {
- cout << "GRACZ 2 WYGRYWA! " << endl;
- gra = false;
- break;
- }
- else if (gracz2->kolejny == NULL) {
- cout << "GRACZ 1 WYGRYWA! " << endl;
- gra = false;
- break;
- }
- if (tury % 2 == 0) {
- zamiana = wyborKarty(gracz2, tryb2, gracz1);
- if (zamiana) {
- zamienKarty(gracz2);
- }
- }
- else {
- zamiana = wyborKarty(gracz1, tryb1, gracz2);
- if (zamiana) {
- zamienKarty(gracz1);
- }
- }
- tury++;
- tury_wspomagane = 0;
- wynik = porownajKarty(gracz1, gracz2);
- if (wynik == GRACZ1_WYGRYWA || wynik == GRACZ2_WYGRYWA) {
- przetrzymajKarty(gracz1, gracz2, wynik);
- gracz1 = gracz1->kolejny;
- gracz2 = gracz2->kolejny;
- }
- else if (wynik == REMIS) {
- gracz* g1 = (gracz*)malloc(sizeof(gracz));
- gracz* g2 = (gracz*)malloc(sizeof(gracz));
- while (wynik == REMIS) {
- ++licznik_wojen;
- gracz* g1_remis = (gracz*)malloc(sizeof(gracz));
- gracz* g2_remis = (gracz*)malloc(sizeof(gracz));
- if (gracz1->kolejny == NULL && gracz2->kolejny == NULL) {
- cout << "REMIS!" << endl;
- gra = false;
- break;
- }
- if (gracz1 != NULL && gracz1->kolejny != NULL && gracz1->kolejny->kolejny != NULL) {
- g1_remis->kolejny = gracz1->kolejny;
- if (licznik_wojen == 1 && gracz1->kolejny->kolejny->kolejny != NULL) {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz1->kolejny = gracz1->kolejny->kolejny->kolejny;
- g1_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 2 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (gracz2 != NULL && gracz2->kolejny != NULL && gracz2->kolejny->kolejny != NULL) {
- g2_remis->kolejny = gracz2->kolejny;
- if (licznik_wojen == 1 && gracz2->kolejny->kolejny->kolejny != NULL) {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny->kolejny = NULL;
- }
- else {
- gracz2->kolejny = gracz2->kolejny->kolejny->kolejny;
- g2_remis->kolejny->kolejny->kolejny = NULL;
- }
- }
- else {
- cout << "\n" << "Gracz 1 wygrywa przez brak kart do stoczenia wojny przez przeciwnika!" << endl;
- gra = false;
- break;
- }
- if (licznik_wojen == 1)
- wynik = porownajKarty(g1_remis->kolejny->kolejny, g2_remis->kolejny->kolejny);
- else
- wynik = porownajKarty(g1_remis->kolejny, g2_remis->kolejny);
- if (licznik_wojen == 1) {
- g1 = g1_remis;
- g2 = g2_remis;
- }
- else {
- zapiszKarty(g1, g1_remis);
- zapiszKarty(g2, g2_remis);
- }
- }
- if (wynik == GRACZ1_WYGRYWA) {
- if (licznik_wojen == 0)
- potasujWygrane(g1, g2); //W przypadku tylko 2 kart, bez wojny
- else {
- karta_t* talia_tymczasowa = (karta_t*)malloc(sizeof(karta_t));
- talia_tymczasowa = kartyZWojny(g1, g2, licznik_wojen);
- int rozmiar_talii_tymczasowej = (licznik_wojen * 2 + 1) * 2;
- tasowanieTalii(talia_tymczasowa, rozmiar_talii_tymczasowej);
- rozdajKartyZMadrej(g1, g2, talia_tymczasowa, rozmiar_talii_tymczasowej);
- }
- fuzjaKart(gracz1, g1, g2);
- licznik_wojen = 0;
- }
- else if (wynik == GRACZ2_WYGRYWA) {
- if(licznik_wojen==0)
- potasujWygrane(g1, g2); //W przypadku tylko 2 kart, bez wojny
- else {
- karta_t* talia_tymczasowa = (karta_t*)malloc(sizeof(karta_t));
- talia_tymczasowa = kartyZWojny(g2, g1, licznik_wojen);
- int rozmiar_talii_tymczasowej = (licznik_wojen * 2 + 1) * 2;
- tasowanieTalii(talia_tymczasowa, rozmiar_talii_tymczasowej);
- rozdajKartyZMadrej(g2, g1, talia_tymczasowa, rozmiar_talii_tymczasowej);
- }
- fuzjaKart(gracz2, g2, g1);
- licznik_wojen = 0;
- }
- }
- else if (wynik == KONIEC) {
- gra = false;
- }
- }
- }
- //fprintf(zapis, "%d\t %d\t %d\t %d\n", gracz1_wygrywa, r1, r2, gracz2_wygrywa); //Pozostałości po zapisie danych z symulacji(eksperyment 2) do pliku
- //fclose(zapis);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement