Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <string>
- #include <cmath>
- #include <algorithm>
- using namespace std;//deklarujemy biblioteki i przesten nazw
- void pokazplansza(string plansza[8][8])//funkcja wyswietlajaca nasza plansze
- {
- for (int i = 0; i < 8; i++)//petla w petli
- {
- cout << 8 - i <<"";//wyswietlmiy numerki z lewej
- for (int j = 0; j < 8; j++)cout << "|" << plansza[i][j];//wyswietlamy pola planszy
- cout << " " << endl;//wyswietlamy bok planszy i przechodzimy do nastepnej linii
- }
- cout << " A B C D E F G H"<<endl;
- }
- bool wykonajruch(string plansza[8][8], string z, string na, char znakgracza)
- {
- char znakprzeciwny;//zmienna do okreslenie znaku przeciwnika
- if (znakgracza == 'x')znakprzeciwny = 'o'; else znakprzeciwny = 'x';//okreslamy znak przeciwny wzgledem naszego
- //okreslimy wspolrzedne na planszy po ktorych bedziemy sie poruszac
- int x1 = 8-(z[0]-48), y1 = z[1]-65;
- int x2 = 8-(na[0] - 48), y2 = na[1] -65;
- //przepisujemy na int z tablicy ascii i odwracamy wzgledem tablicy
- z = plansza[x1][y1];//przepiszemy do stringow pola z planszy
- na = plansza[x2][y2];
- int d = abs(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)));//liczymy odleglosc miedzy punktami
- int ilezabieramy, ilemamy;
- ilezabieramy = plansza[(x1 + x2) / 2][(y1 + y2) / 2][2] - 48;//okreslamy ile porywamy pionkow (-48 kod ascii)
- ilemamy = plansza[x1][y1][2] - 48;//i ile mamy na danym polu
- if (z[1] != znakgracza || na != " ")return 0; //sprawdzamy czy poruszamy sie swoim pionem i czy na wolne pole jesli nie zwracamy 0
- if (x1 != x2 &&y1 != y2)return 0;//poruszylismy sie po skosie gdy obie wspolrzedne sie zmienia
- //sprawdzamy czy bijemy przeciwnika, czyli jesli odleglosc miedzy polami jest 2 i miedzy nimi jest znak przeciwnika
- if (d == 2 && plansza[(x1 + x2) / 2][(y1 + y2) / 2][1] == znakprzeciwny)
- {
- plansza[x1][y1] = " ";//czyscimy pole
- plansza[(x1 + x2) / 2][(y1 + y2) / 2] = " ";//swoje i przeciwnika
- plansza[x2][y2][1] = znakgracza; plansza[x2][y2][2] = ilemamy + ilezabieramy + 48; //przepisujemy nasz pionek wraz z porwanymi
- return 1;
- }
- else//wykonujemy zwykly ruch
- {
- if (d > ilemamy)return 0;//sprawdzamy czy nie skaczemy dalej niz mozemy
- //sprawdzamy w ktora strone idziemy i czy po drodze jest pusto
- if (x1 > x2) { //do gory
- for (int i = x2; i < x1; i++)
- if (plansza[i][y2] != " ")return 0;
- }
- if (x1 < x2)//do dolu
- {
- for (int i = x1+1; i <= x2; i++)if (plansza[i][y2] != " ")return 0;
- }
- if (y1 < y2)//w prawo
- {
- for (int i = y1+1; i <= y2; i++)if (plansza[x2][i] != " ")return 0;
- }
- if (y1 > y2)//w lewo
- {
- for (int i = y2; i < y1; i++)if (plansza[x2][i] != " ")return 0;
- }
- //jesli wszystko jest ok przemiszczamy pionka i ewentualnie zostawiamy
- if (ilemamy == d)//sprawdzamy systans i ile mamy
- {//jesli przechodzimy o tyle co mamy to zwyczajnie czyscimy pole i przechodzimy
- plansza[x2][y2][1] = znakgracza; plansza[x2][y2][2] = ilemamy + 48; //przepisujemy nasz pionek
- plansza[x1][y1] = " ";
- return 1;
- }
- else
- {//w przeciwnym wypadku zostawiamy pionki i zmieniamy je na przeciwnika
- plansza[x2][y2][1] = znakgracza; plansza[x2][y2][2] = d + 48;
- //wpisujemy w liczbe naszych pionkow dystans
- plansza[x1][y1][1] = znakprzeciwny; plansza[x1][y1][2] = ilemamy -d + 48;
- //i zostawiamy graczowi tyle pionkow ile mamy -dystans (+ascii)
- return 1;
- }
- }
- }
- bool sprawdzczykoniec(string plansza[8][8], char znakprzeciwnika) //funckja sprawdzajaca czy przeciwnik ma jeszcze pionki
- {
- if (znakprzeciwnika == 'o')znakprzeciwnika = 'x'; else znakprzeciwnika = 'o'; //robimy przeciwny znak
- //po prostu petla w petli przejdziemy po wszystkich pionkach jesli natrafimy zwrocimy zero czyli ma jeszcze pionki
- for (int i = 0; i < 8; i++)
- {
- for (int j = 0; j < 8; j++) {
- if (plansza[i][j][1] == znakprzeciwnika)return 0;//znalezlismy
- }
- }
- return 1;//jesli nie natrafimy zwracamy 1
- }
- int main()
- {
- bool gracz;//zmienna logczina gracza, 1-gracz x, gracz o
- char znakgracza;//zmiena dla znak gracza
- string z,na;//zmienna dla danych o ruchu przez nas wprowadzaanych
- for (;;)//petla ktora bedzie obslugiwala cala nasza gre,
- {
- //tworzymy tablice strangiw, ktora bedzie przechowywala pola naszej planszy 8x8
- string plansza[8][8] = { { "---","---"," ", " "," "," ","---","---" },{ "---"," x1"," x1", " o1"," o1"," x1"," x1","---" },
- { " "," o1", " o1"," x1"," x1"," o1"," o1"," " },{ " "," x1"," x1", " o1"," o1"," x1"," x1"," " },
- { " "," o1", " o1"," x1"," x1"," o1"," o1"," " },{ " "," x1"," x1", " o1"," o1"," x1"," x1"," " },
- { "---"," o1", " o1"," x1"," x1"," o1"," o1","---" } ,{ "---","---"," ", " "," "," ","---","---" } };//domyslne wartosci
- gracz = 1;
- for (;;)//petla ktora bedzie obslugiwala aktualna partie
- {
- if (gracz == 1)znakgracza = 'x'; else znakgracza = 'o';
- //czyscimy plansze
- cout << "(Ruch gracza "<<znakgracza<<")"<<endl;//wypisujemy czyj ruch
- pokazplansza(plansza);//wypisujemy plansze
- cout << "Wpisz koniec by wyjsc lub reset by zresetowac gre"<<endl;
- cout << "Podaj z, ktorego pola chcesz sie ruszyc (np. 3A):" << endl;
- cin>>z; //wczytujemy z jakiego pola
- if (z == "koniec")return 0;//sprawdzamy czy nie wpisano koniec lub reset jesli tak to konczymy lub resetujemy gre
- if (z == "reset")break;
- cout << "Na jakie pole:";
- cin >> na;//wczytujemy na jakie pole
- if(wykonajruch(plansza, z, na, znakgracza)==1)gracz=!gracz;
- //wykonujemy ruch, jesli funkcja zwroci zero, znaczy, ze na pole nie mozna przejsc, jesli jeden zmienaimy gracza
- if (sprawdzczykoniec(plansza, znakgracza) == 1) //sprawdzamy czy przeciwnik ma jesccze pionki
- { cout <<endl<< "Wygra³ gracz " << znakgracza << endl;//wypisujemy kto wygral
- system("CLS");
- system("pause"); break; }//wstrzymujemy i konczmy partie
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment