Gra karciana oczko - sztuczna inteligencja

Odpowiedz Nowy wątek
2012-11-29 20:27
0

Witam muszę napisać program "Gra karciana oczko - sztuczna inteligencja". A więc karty od 9,10,Jopek,Dama,Król,As.

Dziewiątka – 0 pkt.
Dziesiątka – 10 pkt.
Walet – 2 pkt.
Dama – 3 pkt.
Król – 4 pkt.
As – 11 pkt.

Gracz ma grać z komputerem który zapamiętuje jakie karty szły(czyli ma wiedzieć jakie karty zostały w talii). Karty w danym rozdaniu nie mogą się powtarzać ( co jest oczywiste ). No i komputer korzystając z wiedzy jakie karty są jeszcze w talii ma określić czy dobrać kartę czy nie. A i jeszcze jeśli ktoś wylosuje 2 asy to ma 21 punktów czyli oczko.

Program najlepiej jakby byl C++, ale jak byłby w pascalu to tez nie bedzie tragedii (chyba ograne)
Proszę o pomoc :)

Pozostało 580 znaków

2012-11-29 20:48
0

Komputer widzi ile ma człowiek, i widzi ile ma aktualnie on sam, jeżeli bez dobierania wygrywa to nie nigdy nie dobiera, jeżeli bez dobierania przegrywa to zawsze dobiera, koniec kropka.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
w blackjacku krupier nie może grać jeżeli ma co najmniej 16 (z tego co pamietam), ale fakt faktem algorytm sam w sobie się za bardzo nie zmieni. Tak tylko jako ciekawostkę piszę ;) - fasadin 2012-11-29 20:51

Pozostało 580 znaków

2012-11-29 20:50
0

Program najlepiej jakby byl C++, ale jak byłby w pascalu to tez nie bedzie tragedii (chyba ograne)
:O
Kpisz sobie? Takie rzeczy to do działu praca. Myślisz, że komuś się chcę siedzieć nad tym x czasu żebyś Ty zrozumiał? Jeszcze raz powtórze. Kpisz sobie?

Powiedz z czym konkretnie masz problem to sądzę, że dostaniesz pomoc.

edytowany 2x, ostatnio: fasadin, 2012-11-29 20:53

Pozostało 580 znaków

2012-12-02 23:07
0

no głównie to chodzi mi o algorytm tej "inteligencji" komputera. Fasadin Już zaraz kpisz :P To jest forum a wiec zapytać można (" Kto pyta nie błądzi"). Jak nie masz czasu to ja to rozumiem sam go za wiele nie mam, choć może znajdzie się ktoś kto ma czas lub ktoś kto już z tym programem się borykał :)

Pozostało 580 znaków

2012-12-02 23:13
0

@micrus, przecież dostałeś algorytm trzy dni temu:

_13th_Dragon napisał(a):

Komputer widzi ile ma człowiek, i widzi ile ma aktualnie on sam, jeżeli bez dobierania wygrywa to nigdy nie dobiera, jeżeli bez dobierania przegrywa to zawsze dobiera, koniec kropka.
Wraz z uwagą od @fasadin: -
w blackjacku krupier nie może grać jeżeli ma co najmniej 16 (z tego co pamietam)"

  • masz pełny komplet.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2012-12-02 23:14

Pozostało 580 znaków

2012-12-02 23:17
0

dobra sprobuje cos z tego wykminic :) ale czy cos z tego bedzie to nie wiem :P Jak cos nie bede wiedział to bede pytał :D W tygodniu jakos sie chyba za to wezme :)

Pozostało 580 znaków

2013-01-03 21:40
0

A więc tak dzisiaj dopiero zabrałem się za pisanie tego diabelskiego programu :P Aktualnie moja praca stoi na takim etapie:

 #include <cstdlib>
#include <iostream>

using namespace std;
void cards (int karty[])
{
    karty [0]= 0;
    karty [1]= 10;
    karty [2]= 2;
    karty [3]= 3;
    karty [4]= 4;
    karty [5]= 11;
    karty [6]= 0;
    karty [7]= 10;
    karty [8]= 2;
    karty [9]= 3;
    karty [10]= 4;
    karty [11]= 11;
    karty [12]= 0;
    karty [13]= 10;
    karty [14]= 2;
    karty [15]= 3;
    karty [16]= 4;
    karty [17]= 11;
    karty [18]= 0;
    karty [19]= 10;
    karty [20]= 2;
    karty [21]= 3;
    karty [22]= 4;
    karty [23]= 11;
}
bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;

    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true;

        i++;
    } while( i < ile );

    return false;
}

int wylosuj()
{
    return( rand() % 24 );
}

int main(int argc, char *argv[])
{
    srand( time( NULL ) );
    int liczba = 0;
    int wylosowanych = 0;
    int sumakomp = 0;
    int sumakrupier = 0;
    int card[24];
    string wybor;
    cards(card);
    cout << "Losuje komputer" << endl;
    do {
    liczba = wylosuj();
    cout << "wylosowana liczba: " << liczba << endl;
    if( czyBylaWylosowana( liczba, card , wylosowanych ) == false )
        {
            sumakomp= sumakomp + card[liczba];
            cout << "Aktualna ilosc oczek: " << sumakomp << endl;
            if (sumakomp > 21)
            {
                         cout << "Komputer przegral!!" << endl;
                         break;
            }
            if (sumakomp == 21)
            {
                         cout << "Komputer wygral !!" << endl;
                         break;
            }

            wylosowanych++;
        }
        } while (sumakomp < 17);
        cout << endl << "Losuje krupier" << endl;
    do {
    liczba = wylosuj();
    if( czyBylaWylosowana( liczba, card , wylosowanych ) == false )
        {
            sumakrupier= sumakrupier + card[liczba];
            cout << "Aktualna ilosc oczek: " << sumakrupier << endl;
            if (sumakrupier > 21)
            {
                         cout << "Krupier przegral!!" << endl;
                         break;
            }
            if (sumakrupier == 21)
            {
                         cout << "Krupier wygral !!" << endl;
                         break;
            }

            wylosowanych++;
            cout << "Czy dobrac karte?" << endl;
            cin >> wybor;
        }
        } while (wybor == "t");
    system("PAUSE");
    return EXIT_SUCCESS;
}

i pojawia się kilka pytań.

  1. Zastanawiam się jak zrobić aby gra toczyła się aż do skończenia talii. Pomyślałem że może stworzyć drugą tablicę i zapisywać w niej liczby wylosowane i jakąś funkcją np sprawdzać czy w tablicy znajduje się mniej niż 20 kart. tablica dala by mi także wgląd na losowane liczby.
    2.Jak sprawdzić czy gracz nie wylosował dwóch "11" jak się wylosuje dwie 11 to jest oczko ( pomimo że suma daje wynik 22)
  2. Co myślicie o tej metodzie sprawdzania powtórzeń?? Bo mam takie wrażenie jakby ona nie działała prawidłowo. Pomyślałem że można by było skorzystać z takiej dodatkowej tabeli o której pisałem w punkcie 1. I po prostu wylosowaną liczbę porównywać z dodatkową tablicą czy taka liczba już się w niej nie znajduje.

Pozostało 580 znaków

2013-01-03 21:50
2

kod użytkownika @shalom, udostępniany na tym forum milion razy..

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

class Card
  {
  private:
    int value;
    string name;
    string color;
  public:
    Card(int v, string n, string c):value(v),name(n),color(c) {}
    int getValue()
    {
      return value;
    }
    string getName()
    {
      return name;
    }
    string getColor()
    {
      return color;
    }
    friend ostream& operator<<(ostream& strumien, Card c)
    {
      strumien<<c.getName()<<" "<<c.getColor();
      return strumien;
    }
  };

class Talia
  {
  private:
    vector<Card> talia;
  public:
    void add(Card c) //dodawania karty do talii
    {
      talia.push_back(c);
    }
    Card popCard() //wyciąganie karty z talii
    {
      srand(time(0));
      int index = rand()%talia.size();
      Card tmp = talia[index];
      talia[index] = talia.back();
      talia.pop_back();
      return tmp;
    }
    void createFull()
    {
      string kolory[4]={"kier","karo","pik","trefl"};
      string figury[13]={"2","3","4","5","6","7","8","9","10","Walet","Dama","Krol","As"}; //można by tu dla 2-10 użyć sstream, ale nie chce mieszać
      for (int i=0;i<4;i++)
        {
          for (int j=0;j<9;j++) //2-10
            {
              Card tmp(j+2,figury[j],kolory[i]); //generujemy kartę
              talia.push_back(tmp); //dodajemy do talii
            }
          for (int j=9;j<12;j++) //walet, dama, krol
            {
              Card tmp(j-7,figury[j],kolory[i]); //generujemy kartę
              talia.push_back(tmp); //dodajemy do talii
            }
          Card tmp(11,figury[12],kolory[i]); //as
          talia.push_back(tmp); //dodajemy do talii
        }
    }
    int getValue() //funkcja zwraca wartość wszystkich kart w talii
    {
      int sum = 0;
      for (int i =0; i<talia.size();i++)
        sum+=talia[i].getValue();
      return sum;
    }
    bool empty() const
      {
        return talia.empty();
      }
  };

int main()
{
  Talia talia, gracz1, gracz2;
  talia.createFull();
  // i może robić na przykład
  gracz1.add(talia.popCard());
  return 0;
}

Pozostało 580 znaków

2013-01-03 21:52
8

edit: haha spóźniłem się z wklejeniem własnego kodu :D


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2013-01-03 21:52

Pozostało 580 znaków

2013-01-03 22:10
0

No dobra chopaki , jest problem nie działa mi to i ni hu..hu nie wiem dlaczego. Dodam że korzystam z Dev C++.

Talia talia, gracz1, gracz2;
zastanawia mnie ta linijka w tym kodzie.

edytowany 1x, ostatnio: micrus, 2013-01-03 22:21
Includa Ci brakuje. cstdio albo cstdlib - kopernik 2013-01-03 22:27

Pozostało 580 znaków

2013-01-03 22:25
2
micrus napisał(a):

Dodam że korzystam z Dev C++.

A po co komputera uzywasz? Przeciez masz kartke i dlugopis. Co ja gadam, kawalek drewna i kawalek kamyka wystarczy do pisania przeciez.
Ile razy mozna mowic, ze to IDE jest nierozwijane od X lat i nie nalezy go uzywac.

Pokaż pozostałe 2 komentarze
@Azarien - równie ciężko Ci będzie przekonywać haterów Dev-C++ że rozwój ruszył, jak było przekonywać jego fanów że już nie jest fajny ;] - msm 2013-01-08 19:47
@Azarien: co nie zmienia faktu że DevC++ nadal ssie i daleko mu do świetności. - Demonical Monk 2013-01-08 20:14
@n0name_l: O masochiźmie wypowiedział się użytkownik vima. Fajnie się refaktoryzuje kod mając gołe copy/paste i regeksy? :D - Demonical Monk 2013-01-08 20:15
@Demonical Monk: ze zdaniem „Dev-C++ nie jest fajny” to ja się zgadzam. Zdanie: „Dev-C++ jest nie rozwijany” jest nieprawdziwe. - Azarien 2013-01-09 11:36
@Azarien masz racje i dobrze, ze mnie poprawiles. Faktycznie nie mialem pojecia, ze ktos sie w to bawi co i tak nie zmienia mojego podejscia. - n0name_l 2013-01-09 15:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0