P010 - Gra w OKO dla człowieka z komputerem
Program uruchomiono w środowisku Bloodshed Dev-C++ 4.9.9.2
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------
// Koło informatyczne 2006/7
//--------------------------
// Program: P010
//--------------------------

#include <iostream>
#include <iomanip>

using namespace std;

// Funkcja rysuje kostkę do gry
//-----------------------------
void Kostka(int oczka)
{
  cout << " ----- \n";
  for(int i = 1; i <= 9; i++)
  {
    switch(i)
    {
      case 1:
      case 4:
      case 7: cout << "| ";         
    }        
    switch(i)
    {
      case 1:
      case 9: if(oczka > 1) cout << "O"; else cout << " ";
              break;
      case 2:
      case 8: cout << " "; break;
      case 3:
      case 7: if(oczka > 3) cout << "O"; else cout << " ";
              break;
      case 4:
      case 6: if(oczka == 6) cout << "O"; else cout << " ";
              break;
      case 5: if(oczka % 2) cout << "O"; else cout << " ";
              break;
    }
    switch(i)
    {
      case 3:
      case 6:
      case 9: cout << " |\n";
    }                
  }
  cout << " ----- \n";  
}

// Funkcja wyświetla punkty gracza
//--------------------------------
void Punkty(int n, int pg)
{
  if(n == 1)
    cout << "CZLOWIEK\n";
  else
    cout << "KOMPUTER\n";
  cout << "PUNKTY = " << pg << endl << endl;     
}

// Funkcja dokonuje ruchu
//-----------------------
void Ruch(int n, int &pg, bool &gg, int pp, bool gp)
{
  char odp;
  int  los;
   
  cout << "\n\n--------------------------\n";
  Punkty(n,pg);
  cout << "Grasz dalej ? (T = TAK) : ";

// Tutaj umieszczamy moduł strategii  
  
  if(n == 2)
  {
     if((pg < 16) || (pg < pp) || (gp && (pg < 19)))
     {
       odp = 'T';
       cout << "T\n";
     }
     else
     {
       odp = 'N';
       cout << "N\n";
     }     
  }
  else cin >> odp;
  cout << endl;
  if((odp == 'T') || (odp == 't'))
  {
    los = 1 + rand() % 6;
    Kostka(los);
    pg += los;
    Punkty(n,pg);
  }
  else gg = false;
}

// Funkcja ocenia punkty gracza
//---------------------------
bool Przegrana(int pg, bool &gg)
{
  if(pg > 21)
  {
    gg = false;
    return true;
  }
  return false;
}    

// Funkcja dokonuje oceny gry
//---------------------------
void Ewaluacja(int n, int pg, int pp)
{
  if(n == 1)
    cout << "CZLOWIEK";
  else
    cout << "KOMPUTER";
  cout << ", PUNKTY = " << setw(2) << pg << " : ";
          
  if((pp > 21) || ((pg <= 21) && (pg > pp)))
    cout << "GRATULACJE !!! WYGRANA !!!";
  else if(pg == pp)
    cout << "REMIS";
  else cout << "PRZEGRANA !!!";
  cout << "\n\n";    
}

// Program główny gry
//-------------------
main()
{
  int pg1,pg2;
  bool gg1,gg2;
  char w;
  
  srand((unsigned)time(NULL));
  do
  {
    cout << "Gra w OKO dla czlowieka z komputerem\n"
            "====================================\n\n";
    pg1 = pg2 = 0;
    gg1 = gg2 = true;        
    while(gg1 || gg2)
    {
       if(gg1)
       {
         Ruch(1,pg1,gg1,pg2,gg2);
         if(Przegrana(pg1,gg1)) break;
       }
       if(gg2)
       {
         Ruch(2,pg2,gg2,pg1,gg1);
         if(Przegrana(pg2,gg2)) break;
       }       
    }
    cout << "\n\n\nWYNIKI GRY\n"
            "==========\n\n";
    Ewaluacja(1,pg1,pg2);
    Ewaluacja(2,pg2,pg1);            
    cout << "\n\n--------------------------\n"
            "Jeszcze raz (T = TAK) ? : ";
    cin >> w;
    cout << "\n\n\n\n";
  } while((w == 'T') || (w == 't'));
}

 

Widok okienka konsoli w uruchomionym programie
Gra w OKO dla czlowieka z komputerem
====================================



--------------------------
CZLOWIEK
PUNKTY = 0

Grasz dalej ? (T = TAK) : t

 -----
| O O |
| O O |
| O O |
 -----
CZLOWIEK
PUNKTY = 6



--------------------------
KOMPUTER
PUNKTY = 0

Grasz dalej ? (T = TAK) : T

 -----
| O O |
| O O |
| O O |
 -----
KOMPUTER
PUNKTY = 6



--------------------------
CZLOWIEK
PUNKTY = 6

Grasz dalej ? (T = TAK) :

       Wyjaśnienie

Program P010 jest rozwinięciem programu P009 o moduł gracza komputerowego. Ustalamy, iż komputer zawsze jest graczem nr 2. Strategia komputera jest następująca:

Komputer kontynuuje grę, gdy

  1. komputer ma mniej niż 16 punktów
  2. komputer ma mniej punktów od człowieka
  3. szanse przekroczenia wyniku 21 są mniejsze lub równe szansom osiągnięcia wyniku 21 lub mniejszego, a człowiek wciąż jest w grze.

Wyjaśnienie tej strategii jest bardzo proste:

  1. Jeśli komputer ma mniej niż 16 punktów, to nie może w kolejnym rzucie przekroczyć 21 punktów. Zatem kontynuuje grę.
  2. Jeśli komputer ma mniej punktów od człowieka, to przerywając grę przegra. Nie ma zatem nic do stracenia i liczy na szczęście grając dalej.
  3. Komputer ryzykuje rzut w sytuacji, gdy wynik może przekroczyć 21. Jednakże jest to wykalkulowane ryzyko - robi to tylko wtedy, gdy jego szanse na wyrzucenie do 21 są większe lub równe szansom przekroczenia 21. Dodatkowo człowiek musi być w grze, gdyż inaczej ryzyko to się nie opłaci.

Rozważmy kolejne sytuacje. Kolorem zielonym zaznaczyliśmy wynik rzutu pozytywny, a kolorem czerwonym negatywny - komputer przekracza 21 punktów:

punkty komputera wynik rzutu kostką decyzja
16 1 2 3 4 5 6 gra
17 1 2 3 4 5 6 gra
18 1 2 3 4 5 6 gra
19 1 2 3 4 5 6 nie gra
20 1 2 3 4 5 6 nie gra
21 1 2 3 4 5 6 nie gra

Z tabelki wynika prosty wniosek: jeśli wynik komputera jest mniejszy od 19 punktów, komputer gra dalej.

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe