Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <unistd.h>
- using namespace std;
- typedef long long ll;
- const ll S = (ll) 1e17;
- const unsigned int B = 500;
- const int stala_symulacji = 1000;
- int rnd(int poc, int kon){
- return poc + rand() % (kon - poc + 1);
- }
- struct karta{
- string kolor;
- string figura;
- // UWAGA, MOZLIWE ZE W KONSTRUKTORACH NALEZY DAC PUBLIC
- karta(string x, string y){
- kolor = x;
- figura = y;
- }
- karta(int X){
- if (! (0 <= X and X <= 51)){
- cout << "Nie ma karty o numerze: " << X << endl;
- exit(0);
- }
- if (X / 13 == 0) kolor = "pik";
- if (X / 13 == 1) kolor = "trefl";
- if (X / 13 == 2) kolor = "karo";
- if (X / 13 == 3) kolor = "kier";
- if (X % 13 <= 7) figura = "" + (char) (X % 13 + '0' + 2);
- if (X % 13 == 8) figura = "10";
- if (X % 13 == 9) figura = "J";
- if (X % 13 == 10) figura = "Q";
- if (X % 13 == 11) figura = "K";
- if (X % 13 == 12) figura = "A";
- }
- int id_karty(){
- int res = 0;
- res += (kolor == "pik") * 0 * 13;
- res += (kolor == "trefl") * 1 * 13;
- res += (kolor == "karo") * 2 * 13;
- res += (kolor == "kier") * 3 * 13;
- res += (figura == "2") * 0;
- res += (figura == "3") * 1;
- res += (figura == "4") * 2;
- res += (figura == "5") * 3;
- res += (figura == "6") * 4;
- res += (figura == "7") * 5;
- res += (figura == "8") * 6;
- res += (figura == "9") * 7;
- res += (figura == "10") * 8;
- res += (figura == "J") * 9;
- res += (figura == "Q") * 10;
- res += (figura == "K") * 11;
- res += (figura == "A") * 12;
- return res;
- }
- int moc_karty(){
- return id_karty() % 13;
- }
- string nazwa(){
- return figura + " " + kolor;
- }
- };
- struct ulozenie{
- int id_gracza;
- ll moc = -1;
- string nazwa;
- vector <karta> karty;
- vector <int> zlicz;
- vector <pair <int, int> > X;
- ulozenie(vector <karta> Z, int x){
- karty = Z;
- // pre-processing
- zlicz.resize(13);
- for (int i = 0; i < 13; i ++)
- zlicz[i] = 0;
- for (auto e : karty)
- zlicz[e.moc_karty()] ++;
- for (int i = 0; i < karty.size(); i ++)
- X.push_back({karty[i].id_karty(), i});
- sort(X.begin(), X.end());
- // end of pre-processing
- if (
- pokor() or
- kareta() or
- full() or
- kolor() or
- strit() or
- trojka() or
- para2() or
- para() or
- wysoka()
- );
- id_gracza = x;
- }
- bool pokor(){
- int ile = 0, prev = 0, border;
- for (int i = X.size() - 1; i >= 0; i --){
- int x = X[i].first;
- int y = X[i].second;
- if (ile == 0 or border > x or prev != x + 1){
- border = x / 13 * 13;
- prev = x;
- ile = 1;
- continue;
- }
- ile ++;
- prev = x;
- if (ile == 5){
- nazwa = "poker " + karty[y].kolor + " od " + karty[y].figura;
- moc = S * 8 + karty[y].moc_karty() * (S / 100);
- return true;
- }
- }
- return false;
- }
- bool kareta(){
- for (int i = 0; i < 13; i ++)
- if (zlicz[i] == 4)
- for (int j = 12; j >= 0; j --)
- if (zlicz[j] > 0 and zlicz[j] < 4){
- nazwa = "kareta " + karta(i).kolor;
- moc = S * 7 + i * (S / 100) + j * (S / 10000);
- return true;
- }
- return false;
- }
- bool full(){
- for (int i = 12; i >= 0; i --)
- if (zlicz[i] >= 3)
- for (int j = 12; j >= 0; j --)
- if (i != j and zlicz[j] >= 2){
- nazwa = "full " + karta(i).figura + " na " + karta(j).figura;
- moc = S * 6 + i * (S / 100) + j * (S / 10000);
- return true;
- }
- return false;
- }
- bool kolor(){
- int ile = 0, border;
- for (int i = X.size() - 1; i >= 0; i --){
- int x = X[i].first;
- int y = X[i].second;
- if (ile == 0 or border > x){
- border = x / 13 * 13;
- ile = 1;
- continue;
- }
- ile ++;
- if (ile == 5){
- nazwa = "kolor " + karty[y].kolor;
- moc = S * 5 + karty[X[i + 4].second].moc_karty() * (S / (ll) 100)
- + karty[X[i + 3].second].moc_karty() * (S / (ll) 10000)
- + karty[X[i + 2].second].moc_karty() * (S / (ll) 1000000)
- + karty[X[i + 1].second].moc_karty() * (S / (ll) 100000000);
- + karty[X[i + 0].second].moc_karty() * (S / (ll) 10000000000);
- return true;
- }
- }
- return false;
- }
- bool strit(){
- int act = 0;
- for (int i = 12; i >= 0; i --){
- if (zlicz[i] == 0){
- act = 0;
- continue;
- }
- act ++;
- if (act == 5){
- nazwa = "strit od " + karta(i).kolor;
- moc = S * 4 + i * (S / (ll) 100);
- return true;
- }
- }
- return false;
- }
- bool trojka(){
- for (int i = 12; i >= 0; i --)
- if (zlicz[i] >= 3){
- vector <int> kickery;
- for (auto e : karty)
- if (e.moc_karty() != i)
- kickery.push_back(e.moc_karty());
- sort(kickery.begin(), kickery.end());
- nazwa = "trojka " + karta(i).figura;
- moc = S * 3 + i * (S / (ll) 100)
- + kickery[kickery.size() - 1] * (S / (ll) 10000)
- + kickery[kickery.size() - 2] * (S / (ll) 1000000);
- return true;
- }
- return false;
- }
- bool para2(){
- for (int i = 12; i >= 0; i --)
- if (zlicz[i] >= 2)
- for (int j = i - 1; j >= 0; j --)
- if (zlicz[j] >= 2){
- vector <int> kickery;
- for (auto e : karty)
- if (e.moc_karty() != i and e.moc_karty() != j)
- kickery.push_back(e.moc_karty());
- nazwa = "dwie pary " + karta(i).figura + " & " + karta(j).figura;
- moc = S * 2 + i * (S / (ll) 100)
- + j * (S / (ll) 10000)
- + kickery[kickery.size() - 1] * (S / (ll) 1000000);
- return true;
- }
- return false;
- }
- bool para(){
- for (int i = 12; i >= 0; i --)
- if (zlicz[i] >= 2){
- vector <int> kickery;
- for (auto e : karty)
- if (e.moc_karty() != i)
- kickery.push_back(e.moc_karty());
- nazwa = "para " + karta(i).figura;
- moc = S * 1 + i * (S / (ll) 100)
- + kickery[kickery.size() - 1] * (S / (ll) 10000)
- + kickery[kickery.size() - 2] * (S / (ll) 1000000)
- + kickery[kickery.size() - 3] * (S / (ll) 100000000);
- return true;
- }
- return false;
- }
- bool wysoka(){
- for (int i = 12; i >= 0; i --)
- if (zlicz[i]){
- vector <int> kickery;
- for (int j = i - 1; kickery.size() != 4; j --)
- if (zlicz[j])
- kickery.push_back(j);
- nazwa = "wysoka karta " + karta(i).figura;
- moc = S * 0 + i * (S / (ll) 100)
- + kickery[kickery.size() - 1] * (S / (ll) 10000)
- + kickery[kickery.size() - 2] * (S / (ll) 1000000)
- + kickery[kickery.size() - 3] * (S / (ll) 100000000)
- + kickery[kickery.size() - 4] * (S / (ll) 10000000000);
- return true;
- }
- cout << "Blad!!!!! nie wybrano zadnego ulozenia";
- exit(0);
- }
- bool operator<(const ulozenie X){
- return (this->moc) > (X.moc);
- }
- };
- struct gracz{
- string nazwa;
- int wartosc_stacka;
- int id_gracza; // gdzie siedzi
- int liczba_pozostalych_graczy;
- int trudnosc_bota;
- bool uzyte_karty[52];
- double szansa; // [0, 1]
- bool bot;
- bool aktualnie_w_grze;
- bool *spasowali;
- vector <vector <int> > szanse; /*/ dla kazdego gracza szanse jaka ma karte
- poczatkowo:
- {{0.19, 0.19, ... , 0.19},
- {0.19, 0.19, ... , 0.19}} /*/
- vector <karta> karty;
- gracz(string x, int a, int y, int z, int T, bool B, vector <karta> K){
- nazwa = x;
- wartosc_stacka = a;
- id_gracza = y;
- liczba_pozostalych_graczy = z;
- trudnosc_bota = T;
- szansa = 1.0;
- bot = B;
- aktualnie_w_grze = true;
- spasowali = new bool[liczba_pozostalych_graczy];
- for (int i = 0; i < liczba_pozostalych_graczy; i ++)
- spasowali[i] = 0;
- vector <int> X = {};
- for (int i = 0; i < 52; i ++)
- X.push_back(1.0 / 52.0);
- for (int i = 0; i < liczba_pozostalych_graczy; i ++)
- szanse.push_back(X);
- karty = K;
- }
- bool all_in(){
- return (wartosc_stacka == 0);
- }
- /*/
- void aktualizuj_szanse( tu trzeba cos pobrac ze stolu ){
- }
- karta losuj_karte(int* prefsum){
- while (true){
- double X = (double) rnd(0, 1 << 15) / (double) (1 << 15);
- int a = 0, b = 52;
- while(a + 1 < b){
- int s = (a + b) / 2;
- if (prefsum[s] > X) b = s;
- else a = s;
- }
- if (!uzyte_karty[a]){
- uzyte_karty[a] = false;
- return karta(a);
- }
- }
- }
- void licz_szanse(vector<karta> karty_na_stole){
- int stala_symulacji;
- double prefsum_szansa_zbalansowana[52], ile_wygralem = 0;
- prefsum_szansa_zbalansowana[0] = 0;
- for(int j = 1; j < 52; ++j)
- prefsum_szansa_zbalansowana[j] = prefsum_szansa_zbalansowana[j] + 1.0 / 52;
- vector <vector <int> > prefsum;
- prefsum_szanse.resize(szanse.size());
- for (int i = 0; i < szanse.size(); i ++)
- prefsum_szanse[i].resize(52);
- for (int i = 0; i < liczba_pozostalych_graczy; ++i){
- prefsum_szanse[i][0] = 0;
- for(int j = 1; j < szanse[i].size(); ++j)
- prefsum_szanse[i][j] = prefsum_szanse[i][j - 1] + szanse[i][j];
- }
- for (int i = 0; i < stala_symulacji; ++i){
- for(int j = 0; j < 52; ++j)
- uzyte_karty[j] = 0;
- uzyte_karty[karty[0].id_karty()] = uzyte_karty[karty[1].id_karty()] = 1;
- for(int j = 0; j < karty_na_stole.size(); ++j)
- uzyte_karty[karty_na_stole[j].id_karty()] = 1;
- vector <vector <int> > karty_przeciwnikow(liczba_pozostalych_graczy);
- for (int j = 0; j < liczba_pozostalych_graczy; j ++)
- karty_przeciwnikow[j].resize(2);
- for (int j = 0; j < liczba_pozostalych_graczy; ++ j){
- karty_przeciwnikow[j][0] = losuj_karte(prefsum_szanse[j]);
- karty_przeciwnikow[j][1] = losuj_karte(prefsum_szanse[j]);
- }
- int dodatkowe_karty_na_stole = 0;
- while (karty_na_stole.size() < 5){
- ++ dodatkowe_karty_na_stole;
- karty_na_stole.push_back(losuj_karte(prefsum_szansa_zbalansowana));
- }
- vector <ulozenie> X;
- karty_przeciwnikow.push_back(karty);
- int cnt = 0;
- for (auto e : karty_przeciwnikow){
- for (auto f : e)
- karty_na_stole.push_back(f);
- X.push_back(ulozenie(karty_na_stole, cnt, -1 * spasowali));
- for (auto f : e)
- karty_na_stole.pop_back();
- }
- karty_przeciwnikow.pop_back();
- sort(X.begin(), X.end());
- int ile_gosci;
- bool odw = false;
- for (int j = 0; j < X.size() and X[j].moc == X[0].moc; j ++){
- ile_gosci = j + 1;
- if (X[j].id_gracza == cnt)
- odw = true;
- }
- while(dodatkowe_karty_na_stole > 0){
- karty_na_stole.pop_back();
- -- dodatkowe_karty_na_stole;
- }
- }
- szansa = ile_wygralem / (double) stala_symulacji;
- }
- /*/
- };
- struct Stol{
- vector <gracz> gracze;
- vector <karta> karty_na_stole;
- vector <karta> karty_wolne;
- vector <int> stacki; // ile kto dal
- // 1. lista osob ktore wchodza za dana pule
- // 2. jaka to pula
- int kto_rozdaje; // zeby wiedziec jak ida blindy
- int big_blind; // ile za wejscie
- int ktora_tura; // ktora aktualnie tura
- int czyja_kolej; // żeby wiedzieć kogo displayowac
- Stol(vector <pair <bool, pair <string, int> > > G, int ile_na_start, int startowy_blind){
- int cnt = 0;
- for (auto e : G){
- gracze.push_back(gracz(
- e.second.first,
- ile_na_start,
- cnt,
- G.size() - 1,
- e.second.second,
- e.first,
- {}
- ));
- cnt ++;
- }
- karty_na_stole = {};
- karty_wolne = {};
- kto_rozdaje = 0;
- big_blind = startowy_blind;
- ktora_tura = 0;
- czyja_kolej = 0;
- odswiez();
- }
- int pula(){
- int res = 0;
- for (auto e : stacki)
- res += e;
- return res;
- }
- vector <int> kto_wygrywa(){
- vector <ulozenie> X;
- vector <karta> Y;
- for (auto e : karty_na_stole)
- Y.push_back(e);
- for (auto e : gracze)
- if (e.aktualnie_w_grze){
- for (auto f : e.karty)
- Y.push_back(f);
- X.push_back(ulozenie(Y, e.id_gracza));
- for (auto f : e.karty)
- Y.pop_back();
- }
- sort(X.begin(), X.end());
- vector <int> res;
- for (auto e : X)
- res.push_back(e.id_gracza);
- }
- void pokaz_stol(){
- vector <string> T = {" ",
- " 2 3 ",
- " ",
- " ________________________________________________________________________________ ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | 2 3 | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | 0 0",
- " | | ",
- " | | ",
- " | | ",
- " | @ | 2",
- " | | ",
- " | | ",
- " | 2 3 | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " | | ",
- " |________________________________________________________________________________| ",
- " ",
- " @ 2"
- };
- for (auto e : T)
- cout << e << "\n";
- cout << endl;
- }
- void pas(int id_gracza){
- gracze[id_gracza].aktualnie_w_grze = false;
- for (auto e : gracze)
- e.spasowali[id_gracza] = true;
- }
- void sprawdz(int id_gracza){
- int maks = 0;
- for (auto e : stacki)
- maks = max(maks, e);
- int ile_trzeba_podbic = min(maks - stacki[id_gracza],
- gracze[id_gracza].wartosc_stacka);
- gracze[id_gracza].wartosc_stacka -= ile_trzeba_podbic;
- stacki[id_gracza] += ile_trzeba_podbic;
- }
- bool podbij(int id_gracza, int x){
- if (x < big_blind / 2 and x < gracze[id_gracza].wartosc_stacka){
- cout << "\nMinimalne podbicie to " << big_blind / 2 << "!";
- return false;
- }
- x = min(x, gracze[id_gracza].wartosc_stacka);
- gracze[id_gracza].wartosc_stacka -= x;
- stacki[id_gracza] += x;
- return true;
- }
- karta losuj_karte(){
- if (karty_wolne.empty()){
- cout << "\nBLAD PROGRAMU, BRAK WOLNYCH KART DO ROZDANIA!\n";
- exit(0);
- }
- swap(karty_wolne[rnd(0, karty_wolne.size() - 1)], karty_wolne.back());
- karta cand = karty_wolne.back();
- karty_wolne.pop_back();
- return cand;
- }
- void rozdaj_karty(){
- for(int i = 0; i < gracze.size(); ++i){
- vector <karta> temp;
- temp.push_back(losuj_karte());
- temp.push_back(losuj_karte());
- gracze[i].karty = temp;
- }
- }
- void rozdaj_kase(){
- vector <int> wygrani = kto_wygrywa();
- for (auto e : wygrani){
- int zabiera = stacki[e];
- for (int i = 0; i < stacki.size(); i ++){
- int ile = min(stacki[i], zabiera);
- gracze[e].wartosc_stacka += ile;
- stacki[i] -= ile;
- }
- }
- }
- void odswiez(){
- ktora_tura ++;
- if (ktora_tura % 5 == 0)
- big_blind *= 2;
- karty_wolne.clear();
- for(int i = 0; i < 52; ++ i)
- karty_wolne.push_back(karta(i));
- karty_na_stole.clear();
- stacki.resize(gracze.size());
- kto_rozdaje = (kto_rozdaje + 1) % gracze.size();
- }
- void wykonaj_ruch_bota(int id_gracza){
- return;
- }
- bool wykonaj_ruch_gracza(int id_gracza){
- return true;
- }
- void rozgrywaj(){
- rozdaj_karty();
- int prev_i = 0;
- for (int i = 0; i <= 5; i ++){
- int kon = gracze.size() - 1;
- for (int j = 0; j <= kon; j ++){
- cout << "ruch gracza " << gracze[j % gracze.size()].nazwa << endl;
- string z; cin >> z;
- system("clear");
- pokaz_stol();
- czyja_kolej = j;
- if (i == 0 and j == 0){
- ++kon;
- podbij(czyja_kolej, big_blind / 2);
- }
- else if (i == 0 and j == 1){
- ++kon;
- podbij(czyja_kolej, big_blind);
- }
- else{
- if (gracze[j % gracze.size()].bot)
- wykonaj_ruch_bota(j % gracze.size());
- else if (!wykonaj_ruch_gracza(j % gracze.size())) j --;
- }
- usleep(B);
- }
- for (int j = 0; j < i - prev_i; j ++)
- karty_na_stole.push_back(losuj_karte());
- prev_i = i;
- if (i == 0) i = 2;
- }
- rozdaj_kase();
- odswiez();
- }
- };
- void solve(){
- vector <pair <bool, pair <string, int> > > X = {{{0, {"Blachu", -1}}, {0, {"Staszek", -1}}}};
- Stol Board(X, 10000, 25);
- while (true)
- Board.rozgrywaj();
- }
- int main(){
- srand(time(NULL));
- ios_base::sync_with_stdio(0);
- cout.tie(0);
- cin.tie(0);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement