fork(3) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MS 5
  5. #define may x
  6. #define nguoi o
  7.  
  8. typedef enum {e, x, o} xo;
  9.  
  10. void inBanCo(xo (*bc)[MS]);
  11. void tinhDiem(xo (*bc)[MS], int (*diem)[MS]);
  12. void mayDi(xo (*bc)[MS], int (*diem)[MS]);
  13. int win(xo (*bc)[MS], int (*diem)[MS]);
  14. int hetO(xo (*bc)[MS]);
  15. int checkHang(xo (*bc)[MS], int hang, xo ben);
  16. int checkCot(xo (*bc)[MS], int cot, xo ben);
  17. int checkDuongCheo1(xo (*bc)[MS], xo ben);
  18. int checkDuongCheo2(xo (*bc)[MS], xo ben);
  19. int full0(int (*diem)[MS]);
  20. int checkWin(xo (*bc)[MS], xo ben);
  21. int checkWinHang(xo (*bc)[MS], int h, xo ben);
  22. int checkWinCot(xo (*bc)[MS], int c, xo ben);
  23. int checkWinDuongCheo1(xo (*bc)[MS], xo ben);
  24. int checkWinDuongCheo2(xo (*bc)[MS], xo ben);
  25. void cls();
  26.  
  27. int main() {
  28. int n, m;
  29. int diem[MS][MS];
  30. xo banCo[MS][MS] = {{e}};
  31.  
  32. while (!win(banCo, diem)) {
  33. cls();
  34. inBanCo(banCo);
  35. do {
  36. do {
  37. printf("\nBan danh o (hang - cot): ");
  38. scanf("%d %d", &m, &n);
  39. if (m < 0 || n < 0 || m > MS || n > MS)
  40. printf("\nKhong co o do\n\n");
  41. } while (m < 0 || n < 0 || m > MS || n > MS);
  42. if (banCo[m - 1][n - 1] != e)
  43. printf("\nKhong the danh o nay\n");
  44. } while (banCo[m - 1][n - 1] != e);
  45. banCo[m - 1][n - 1] = nguoi;
  46. tinhDiem(banCo, diem);
  47. mayDi(banCo, diem);
  48. }
  49.  
  50. return 0;
  51. }
  52.  
  53. int checkDuongCheo2(xo (*bc)[MS], xo ben) {
  54. for (int k = 0; k < MS; k++)
  55. if (bc[k][MS - k - 1] == ben)
  56. return 1;
  57. return 0;
  58. }
  59.  
  60. int checkDuongCheo1(xo (*bc)[MS], xo ben) {
  61. for (int k = 0; k < MS; k++)
  62. if (bc[k][k] == ben)
  63. return 1;
  64. return 0;
  65. }
  66.  
  67. int checkCot(xo (*bc)[MS], int cot, xo ben) {
  68. for (int i = 0; i < MS; i++)
  69. if (bc[i][cot] == ben)
  70. return 1;
  71. return 0;
  72. }
  73.  
  74. int checkHang(xo (*bc)[MS], int hang, xo ben) {
  75. for (int i = 0; i < MS; i++)
  76. if (bc[hang][i] == ben)
  77. return 1;
  78. return 0;
  79. }
  80.  
  81. void cls() {
  82. system("cls");
  83. }
  84.  
  85. int hetO(xo (*bc)[MS]) {
  86. for (int i = 0; i < MS; i++)
  87. for (int j = 0; j < MS; j++)
  88. if (bc[i][j] == e)
  89. return 0;
  90. return 1;
  91. }
  92.  
  93. int full0(int (*diem)[MS]) {
  94. for (int i = 0; i < MS; i++)
  95. for (int j = 0; j < MS; j++)
  96. if (diem[i][j] != 0)
  97. return 0;
  98. return 1;
  99. }
  100.  
  101. int checkWinHang(xo (*bc)[MS], int h, xo ben) {
  102. for (int i = 0; i < MS; i++)
  103. if (bc[h][i] != ben)
  104. return 0;
  105. return 1;
  106. }
  107.  
  108. int checkWinCot(xo (*bc)[MS], int c, xo ben) {
  109. for (int i = 0; i < MS; i++)
  110. if (bc[i][c] != ben)
  111. return 0;
  112. return 1;
  113. }
  114.  
  115. int checkWinDuongCheo1(xo (*bc)[MS], xo ben) {
  116. for (int k = 0; k < MS; k++)
  117. if (bc[k][k] != ben)
  118. return 0;
  119. return 1;
  120. }
  121.  
  122. int checkWinDuongCheo2(xo (*bc)[MS], xo ben) {
  123. for (int k = 0; k < MS; k++)
  124. if (bc[k][MS - k - 1] != ben)
  125. return 0;
  126. return 1;
  127. }
  128.  
  129. int checkWin(xo (*bc)[MS], xo ben) {
  130. for (int k = 0; k < MS; k++) {
  131. if (checkWinHang(bc, k, ben))
  132. return 1;
  133. else if (checkWinCot(bc, k, ben))
  134. return 1;
  135. }
  136. if (checkWinDuongCheo1(bc, ben) || checkWinDuongCheo2(bc, ben))
  137. return 1;
  138. return 0;
  139. }
  140.  
  141. int win(xo (*bc)[MS], int (*diem)[MS]) {
  142. if (checkWin(bc, may)) {
  143. cls();
  144. inBanCo(bc);
  145. printf("\nMay thang\n");
  146. return 1;
  147. }
  148. if (checkWin(bc, nguoi)) {
  149. cls();
  150. inBanCo(bc);
  151. printf("\nNguoi thang\n");
  152. return 1;
  153. }
  154. if (full0(diem)) {
  155. cls();
  156. inBanCo(bc);
  157. printf("\nHoa co\n");
  158. return 1;
  159. }
  160. if (hetO(bc)) {
  161. cls();
  162. inBanCo(bc);
  163. printf("\nHoa co\n");
  164. return 1;
  165. }
  166. return 0;
  167. }
  168.  
  169. void mayDi(xo (*bc)[MS], int (*diem)[MS]) {
  170. int k = 0, l = 0;
  171. for (int i = 0; i < MS; i++)
  172. for (int j = 0; j < MS; j++)
  173. if (diem[k][l] <= diem[i][j] && bc[i][j] == e) {
  174. k = i;
  175. l = j;
  176. }
  177. bc[k][l] = may;
  178. }
  179.  
  180. void tinhDiem(xo (*bc)[MS], int (*diem)[MS]) {
  181. for (int i = 0; i < MS; i++)
  182. for (int j = 0; j < MS; j++) {
  183. diem[i][j] = 0;
  184. if (j == i || i == MS - j - 1)
  185. diem[i][j]++;
  186. }
  187. for (int i = 0; i < MS; i++)
  188. for (int j = 0; j < MS; j++)
  189. if (bc[i][j] == may) {
  190. for (int k = 0; k < MS; k++) {
  191. if (!checkCot(bc, j, nguoi))
  192. diem[k][j]++;
  193. if (!checkHang(bc, i, nguoi))
  194. diem[i][k]++;
  195. }
  196. if (i == j) {
  197. if (!checkDuongCheo1(bc, nguoi))
  198. for (int k = 0; k < MS; k++)
  199. diem[k][k]++;
  200. }
  201. if (i == MS - j - 1) {
  202. if (!checkDuongCheo2(bc, nguoi))
  203. for (int k = 0; k < MS; k++)
  204. diem[k][MS - k - 1]++;
  205. }
  206. } else if (bc[i][j] == nguoi) {
  207. for (int k = 0; k < MS; k++) {
  208. if (checkCot(bc, j, may))
  209. diem[k][j] = 0;
  210. else
  211. diem[k][j]++;
  212. if (checkHang(bc, i, may))
  213. diem[i][k] = 0;
  214. else
  215. diem[i][k]++;
  216. }
  217. if (i == j) {
  218. if (checkDuongCheo1(bc, may))
  219. for (int k = 0; k < MS; k++)
  220. diem[k][k] = 0;
  221. else
  222. for (int k = 0; k < MS; k++)
  223. diem[k][k]++;
  224. }
  225. if (i == MS - j - 1) {
  226. if (checkDuongCheo2(bc, may))
  227. for (int k = 0; k < MS; k++)
  228. diem[k][MS - k - 1] = 0;
  229. else
  230. for (int k = 0; k < MS; k++)
  231. diem[k][MS - k - 1]++;
  232. }
  233. }
  234. for (int i = 0; i < MS; i++)
  235. for (int j = 0; j < MS; j++)
  236. if (bc[i][j] == nguoi || bc[i][j] == may)
  237. diem[i][j] = 0;
  238. }
  239.  
  240. void inBanCo(xo (*bc)[MS]) {
  241. printf("\n");
  242. for (int i = 0; i < MS; i++) {
  243. for (int j = 0; j < MS; j++)
  244. if (bc[i][j] == e)
  245. printf("| ");
  246. else if (bc[i][j] == x)
  247. printf("|X");
  248. else
  249. printf("|O");
  250. printf("|\n");
  251. }
  252. }
  253.  
Success #stdin #stdout #stderr 0s 9432KB
stdin
1 1
2 2
3 3
4 4
4 5
stdout
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |

Ban danh o (hang - cot): 
|O| | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | |X|

Ban danh o (hang - cot): 
|O| | | | |
| |O| | | |
| | | | | |
| | | | | |
|X| | | |X|

Ban danh o (hang - cot): 
|O| | | | |
| |O| | | |
| | |O| | |
| | | | | |
|X| |X| |X|

Ban danh o (hang - cot): 
|O| | | | |
| |O| | | |
| | |O| | |
| | | |O| |
|X| |X|X|X|

Ban danh o (hang - cot): 
|O| | | | |
| |O| | | |
| | |O| | |
| | | |O|O|
|X|X|X|X|X|

May thang
stderr
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found