fork 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. int count = 0;
  55. for (int k = 0; k < MS; k++)
  56. if (bc[k][MS - k - 1] == ben)
  57. count++;
  58. return count;
  59. }
  60.  
  61. int checkDuongCheo1(xo (*bc)[MS], xo ben) {
  62. int count = 0;
  63. for (int k = 0; k < MS; k++)
  64. if (bc[k][k] == ben)
  65. count++;
  66. return count;
  67. }
  68.  
  69. int checkCot(xo (*bc)[MS], int cot, xo ben) {
  70. int count = 0;
  71. for (int i = 0; i < MS; i++)
  72. if (bc[i][cot] == ben)
  73. count++;
  74. return count;
  75. }
  76.  
  77. int checkHang(xo (*bc)[MS], int hang, xo ben) {
  78. int count = 0;
  79. for (int i = 0; i < MS; i++)
  80. if (bc[hang][i] == ben)
  81. count++;
  82. return count;
  83. }
  84.  
  85. void cls() {
  86. system("cls");
  87. }
  88.  
  89. int hetO(xo (*bc)[MS]) {
  90. for (int i = 0; i < MS; i++)
  91. for (int j = 0; j < MS; j++)
  92. if (bc[i][j] == e)
  93. return 0;
  94. return 1;
  95. }
  96.  
  97. int full0(int (*diem)[MS]) {
  98. for (int i = 0; i < MS; i++)
  99. for (int j = 0; j < MS; j++)
  100. if (diem[i][j] != 0)
  101. return 0;
  102. return 1;
  103. }
  104.  
  105. int checkWinHang(xo (*bc)[MS], int h, xo ben) {
  106. for (int i = 0; i < MS; i++)
  107. if (bc[h][i] != ben)
  108. return 0;
  109. return 1;
  110. }
  111.  
  112. int checkWinCot(xo (*bc)[MS], int c, xo ben) {
  113. for (int i = 0; i < MS; i++)
  114. if (bc[i][c] != ben)
  115. return 0;
  116. return 1;
  117. }
  118.  
  119. int checkWinDuongCheo1(xo (*bc)[MS], xo ben) {
  120. for (int k = 0; k < MS; k++)
  121. if (bc[k][k] != ben)
  122. return 0;
  123. return 1;
  124. }
  125.  
  126. int checkWinDuongCheo2(xo (*bc)[MS], xo ben) {
  127. for (int k = 0; k < MS; k++)
  128. if (bc[k][MS - k - 1] != ben)
  129. return 0;
  130. return 1;
  131. }
  132.  
  133. int checkWin(xo (*bc)[MS], xo ben) {
  134. for (int k = 0; k < MS; k++) {
  135. if (checkWinHang(bc, k, ben))
  136. return 1;
  137. else if (checkWinCot(bc, k, ben))
  138. return 1;
  139. }
  140. if (checkWinDuongCheo1(bc, ben) || checkWinDuongCheo2(bc, ben))
  141. return 1;
  142. return 0;
  143. }
  144.  
  145. int win(xo (*bc)[MS], int (*diem)[MS]) {
  146. if (checkWin(bc, nguoi)) {
  147. cls();
  148. inBanCo(bc);
  149. printf("\nNguoi thang\n");
  150. return 1;
  151. }
  152. if (checkWin(bc, may)) {
  153. cls();
  154. inBanCo(bc);
  155. printf("\nMay thang\n");
  156. return 1;
  157. }
  158. if (full0(diem)) {
  159. cls();
  160. inBanCo(bc);
  161. printf("\nHoa co\n");
  162. return 1;
  163. }
  164. if (hetO(bc)) {
  165. cls();
  166. inBanCo(bc);
  167. printf("\nHoa co\n");
  168. return 1;
  169. }
  170. return 0;
  171. }
  172.  
  173. void mayDi(xo (*bc)[MS], int (*diem)[MS]) {
  174. int k = 0, l = 0;
  175. for (int i = 0; i < MS; i++)
  176. for (int j = 0; j < MS; j++)
  177. if (diem[k][l] <= diem[i][j] && bc[i][j] == e) {
  178. k = i;
  179. l = j;
  180. }
  181. bc[k][l] = may;
  182. }
  183.  
  184. void inDiem(int (*diem)[MS]) {
  185. for (int i = 0; i < MS; i++) {
  186. for (int j = 0; j < MS; j++)
  187. printf("%d ", diem[i][j]);
  188. printf("\n");
  189. }
  190. }
  191.  
  192. void tinhDiem(xo (*bc)[MS], int (*diem)[MS]) {
  193. for (int i = 0; i < MS; i++)
  194. for (int j = 0; j < MS; j++) {
  195. diem[i][j] = 0;
  196. if (j == i || i == MS - j - 1)
  197. diem[i][j]++;
  198. }
  199. int n = 0, m = 0;
  200. for (int i = 0; i < MS; i++) {
  201. if (checkCot(bc, i, nguoi) && checkCot(bc, i, may))
  202. for (int k = 0; k < MS; k++)
  203. diem[k][i] = 0;
  204. if (checkHang(bc, i, nguoi) && checkHang(bc, i, may))
  205. for (int k = 0; k < MS; k++)
  206. diem[i][k] = 0;
  207. }
  208. n = 0, m = 0;
  209. if ((n = checkDuongCheo1(bc, nguoi)) && (m = checkDuongCheo1(bc, may)))
  210. for (int k = 0; k < MS; k++)
  211. diem[k][k] = 0;
  212. else
  213. for (int k = 0; k < MS; k++)
  214. diem[k][k] += (m > n ? m : n);
  215. n = 0, m = 0;
  216. if ((n = checkDuongCheo2(bc, nguoi)) && (m = checkDuongCheo2(bc, may)))
  217. for (int k = 0; k < MS; k++)
  218. diem[k][MS - k - 1] = 0;
  219. else
  220. for (int k = 0; k < MS; k++)
  221. diem[k][MS - k - 1] += (m > n ? m : n);
  222. for (int i = 0; i < MS; i++) {
  223. n = 0, m = 0;
  224. if (((n = checkCot(bc, i, nguoi)) && !checkCot(bc, i, may)) || (m = checkCot(bc, i, may) && !checkCot(bc, i, nguoi)))
  225. for (int k = 0; k < MS; k++)
  226. diem[k][i] += (m > n ? m : n);
  227. n = 0, m = 0;
  228. if (((n = checkHang(bc, i, nguoi)) && !checkHang(bc, i, may)) || (m = checkHang(bc, i, may) && !checkHang(bc, i, nguoi)))
  229. for (int k = 0; k < MS; k++)
  230. diem[i][k] += (m > n ? m : n);
  231. int emt = 0;
  232. if ((emt = checkCot(bc, i, e) && !checkCot(bc, i, may) && !checkCot(bc, i, nguoi)))
  233. for (int k = 0; k < MS; k++)
  234. diem[k][i] += emt;
  235. emt = 0;
  236. if ((emt = checkHang(bc, i, e) && !checkHang(bc, i, may) && !checkHang(bc, i, nguoi)))
  237. for (int k = 0; k < MS; k++)
  238. diem[i][k] += emt;
  239. }
  240. for (int i = 0; i < MS; i++)
  241. for (int j = 0; j < MS; j++)
  242. if (bc[i][j] == nguoi || bc[i][j] == may)
  243. diem[i][j] = 0;
  244. }
  245.  
  246. void inBanCo(xo (*bc)[MS]) {
  247. printf("\n");
  248. for (int i = 0; i < MS; i++) {
  249. for (int j = 0; j < MS; j++)
  250. if (bc[i][j] == e)
  251. printf("| ");
  252. else if (bc[i][j] == x)
  253. printf("|X");
  254. else
  255. printf("|O");
  256. printf("|\n");
  257. }
  258. }
  259.  
Success #stdin #stdout #stderr 0s 9432KB
stdin
1 1
2 2
3 3
4 4
5 2
1 2
1 3
1 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| | |
| |X| |O| |
|X|O|X|X|X|

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

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

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

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

Hoa co
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
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found
sh: 1: cls: not found