fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // Funkcja rysuje planszę gry w kółko i krzyżyk
  6. // Plansza przechowywana jest w tablicy t[] w elementach o następujących indeksach:
  7. // t[1] t[2] t[3]
  8. // t[4] t[5] t[6]
  9. // t[7] t[8] t[9]
  10. //---------------------------------------------------------------------------------
  11. void plansza(char t[])
  12. {
  13. for(int i = 1; i <= 9; i++)
  14. {
  15. cout << " " << t[i] << " ";
  16. if(i % 3) cout << "|"; // Po elementach 1,2,4,5,7,8 rysujemy |
  17. else if(i != 9) cout << "\n---+---+---\n"; // Po elementach 3 i 6 poprzeczka
  18. else cout << endl; // Po elemencie 9 koniec wiersza
  19. }
  20. }
  21.  
  22. // Funkcja zwraca true, jeśli nastąpiła
  23. // wygrana danego zawodnika
  24. //-------------------------------------
  25. bool wygrana(char t[], char g, bool cisza)
  26. {
  27. bool test;
  28. int i;
  29.  
  30. test = false; // Zmienna przyjmuje true, jeśli zawodnik ma trzy figury
  31. // w wierszu, kolumnie lub na przekątnych
  32.  
  33. // Sprawdzamy wiersze
  34.  
  35. for(i = 1; i <= 7; i += 3) test |= ((t[i] == g) && (t[i+1] == g) && (t[i+2] == g));
  36.  
  37. // Sprawdzamy kolumny
  38.  
  39. for(i = 1; i <= 3; i++) test |= ((t[i] == g) && (t[i+3] == g) && (t[i+6] == g));
  40.  
  41. // Sprawdzamy przekątną 1-5-9
  42.  
  43. test |= ((t[1] == g) && (t[5] == g) && (t[9] == g));
  44.  
  45. // Sprawdzamy przekątną 3-5-7
  46.  
  47. test |= ((t[3] == g) && (t[5] == g) && (t[7] == g));
  48.  
  49. if(test)
  50. {
  51. if(!cisza)
  52. {
  53. plansza(t);
  54. cout << "\nGRACZ " << g << " WYGRYWA!!!\n\n";
  55. }
  56. return true;
  57. }
  58. return false;
  59. }
  60.  
  61. // Funkcja zwraca true, jeśli na planszy nie ma już
  62. // żadnego wolnego pola na ruch.
  63. //-------------------------------------------------
  64. bool remis(char t[], bool cisza)
  65. {
  66. // Jeśli napotkamy spację, to plansza posiada wolne pola - zwracamy false
  67.  
  68. for(int i = 1; i <= 9; i++) if(t[i] == ' ') return false;
  69.  
  70. // Jeśli pętla for zakończyła się normalnie, to na żadnym polu planszy nie było
  71. // spacji. Mamy do czynienia z remisem - zwracamy true
  72.  
  73. if(!cisza)
  74. {
  75. plansza(t); cout << "\nREMIS !!!\n\n";
  76. }
  77. return true;
  78. }
  79.  
  80. // Algorytm rekurencyjny MINIMAX
  81. // Do algorytmu wchodzimy z planszą, na której ustawione jest pole
  82. // bieżącego gracza. Parametr gracz przekazuje literkę gracza, a
  83. // parametr mx przekazuje jego wynik w przypadku wygranej
  84. //----------------------------------------------------------------
  85. int minimax(char t[], char gracz)
  86. {
  87. int m, mmx;
  88.  
  89. // Najpierw sprawdzamy, czy bieżący gracz wygrywa na planszy. Jeśli tak, to
  90. // zwracamy jego maksymalny wynik
  91.  
  92. if(wygrana(t,gracz,true)) return (gracz == 'X') ? 1 : -1;
  93.  
  94. // Następnie sprawdzamy, czy nie ma remisu. Jeśli jest, zwracamy wynik 0
  95.  
  96. if(remis(t,true)) return 0;
  97.  
  98. // Będziemy analizować możliwe posunięcia przeciwnika. Zmieniamy zatem
  99. // bieżącego gracza na jego przeciwnika
  100.  
  101. gracz = (gracz == 'X') ? 'O' : 'X';
  102.  
  103. // Algorytm MINIMAX w kolejnych wywołaniach rekurencyjnych naprzemiennie analizuje
  104. // grę gracza oraz jego przeciwnika. Dla gracza oblicza maksimum wyniku gry, a dla
  105. // przeciwnika oblicza minimum. Wartość mmx ustawiamy w zależności od tego, czyje
  106. // ruchy analizujemy:
  107. // X - liczymy max, zatem mmx <- -10
  108. // O - liczymy min, zatem mmx <- 10
  109.  
  110. mmx = (gracz == 'O') ? 10 : -10;
  111.  
  112. // Przeglądamy planszę szukając wolnych pół na ruch gracza. Na wolnym polu ustawiamy
  113. // literkę gracza i wyznaczamy wartość tego ruchu rekurencyjnym wywołaniem
  114. // algorytmu MINIMAX. Planszę przywracamy i w zależności kto gra:
  115. // X - wyznaczamy maximum
  116. // O - wyznaczamy minimum
  117.  
  118. for(int i = 1; i <= 9; i++)
  119. if(t[i] == ' ')
  120. {
  121. t[i] = gracz;
  122. m = minimax(t,gracz);
  123. t[i] = ' ';
  124. if(((gracz == 'O') && (m < mmx)) || ((gracz == 'X') && (m > mmx))) mmx = m;
  125. }
  126. return mmx;
  127. }
  128.  
  129. // Funkcja wyznacza ruch dla komputera.
  130. //------------------------------------
  131. int komputer(char t[])
  132. {
  133. int ruch, i, m, mmx;
  134.  
  135. mmx = -10;
  136. for(i = 1; i <= 9; i++)
  137. if(t[i] == ' ')
  138. {
  139. t[i] = 'X';
  140. m = minimax(t,'X');
  141. t[i] = ' ';
  142. if(m > mmx)
  143. {
  144. mmx = m; ruch = i;
  145. }
  146. }
  147. return ruch;
  148. }
  149.  
  150. // Funkcja umożliwia ruch gracza
  151. // Po ruchu następuje zamiana gracza
  152. //------------------------------------
  153. void ruch(char t[], char &gracz)
  154. {
  155. int r;
  156.  
  157. plansza(t);
  158. if(gracz == 'O')
  159. {
  160. cout << "\nCZLOWIEK : wybiera ruch : ";
  161. cin >> r;
  162. }
  163. else
  164. {
  165. r = komputer(t);
  166. cout << "\nKOMPUTER : wybiera ruch : " << r << endl;
  167. }
  168. cout << "---------------------------\n\n";
  169. if((r >= 1) && (r <= 9) && (t[r] == ' ')) t[r] = gracz;
  170. gracz = (gracz == 'O') ? 'X' : 'O';
  171. }
  172.  
  173. main()
  174. {
  175. char t[10],gracz,wybor;
  176.  
  177. do
  178. {
  179. cout << "Gra w Kolko i Krzyzyk dla gracza i komputera\n"
  180. "============================================\n\n";
  181. for(int i = 1; i <= 9; i++) t[i] = ' ';
  182. gracz = 'O';
  183.  
  184. while(!wygrana(t,'X',false) && !wygrana(t,'O',false) && !remis(t,false)) ruch(t,gracz);
  185.  
  186. cout << "Jeszcze raz ? (T = TAK) : ";
  187. cin >> wybor;
  188. cout << "\n\n\n";
  189.  
  190. } while((wybor == 'T') || (wybor == 't'));
  191. }
  192.  
Success #stdin #stdout 0.03s 5292KB
stdin
Standard input is empty
stdout
Gra w Kolko i Krzyzyk dla gracza i komputera
============================================

   |   |   
---+---+---
   |   |   
---+---+---
   |   |   

CZLOWIEK : wybiera ruch : ---------------------------

   |   |   
---+---+---
   |   |   
---+---+---
   |   |   

KOMPUTER : wybiera ruch : 1
---------------------------

 X |   |   
---+---+---
   |   |   
---+---+---
   |   |   

CZLOWIEK : wybiera ruch : ---------------------------

 X |   |   
---+---+---
   |   |   
---+---+---
   |   |   

KOMPUTER : wybiera ruch : 2
---------------------------

 X | X |   
---+---+---
   |   |   
---+---+---
   |   |   

CZLOWIEK : wybiera ruch : ---------------------------

 X | X |   
---+---+---
   |   |   
---+---+---
   |   |   

KOMPUTER : wybiera ruch : 3
---------------------------

 X | X | X 
---+---+---
   |   |   
---+---+---
   |   |   

GRACZ X WYGRYWA!!!

Jeszcze raz ? (T = TAK) :