#include <stdio.h>
#include <stdlib.h>
#define MS 5
#define may x
#define nguoi o
typedef enum {e, x, o} xo;
void inBanCo(xo (*bc)[MS]);
void tinhDiem(xo (*bc)[MS], int (*diem)[MS]);
void mayDi(xo (*bc)[MS], int (*diem)[MS]);
int win(xo (*bc)[MS], int (*diem)[MS]);
int hetO(xo (*bc)[MS]);
int checkHang(xo (*bc)[MS], int hang, xo ben);
int checkCot(xo (*bc)[MS], int cot, xo ben);
int checkDuongCheo1(xo (*bc)[MS], xo ben);
int checkDuongCheo2(xo (*bc)[MS], xo ben);
int full0(int (*diem)[MS]);
int checkWin(xo (*bc)[MS], xo ben);
int checkWinHang(xo (*bc)[MS], int h, xo ben);
int checkWinCot(xo (*bc)[MS], int c, xo ben);
int checkWinDuongCheo1(xo (*bc)[MS], xo ben);
int checkWinDuongCheo2(xo (*bc)[MS], xo ben);
void cls();
int main() {
int n, m;
int diem[MS][MS];
xo banCo[MS][MS] = {{e}};
while (!win(banCo, diem)) {
cls();
inBanCo(banCo);
do {
do {
printf("\nBan danh o (hang - cot): "); if (m < 0 || n < 0 || m > MS || n > MS)
printf("\nKhong co o do\n\n"); } while (m < 0 || n < 0 || m > MS || n > MS);
if (banCo[m - 1][n - 1] != e)
printf("\nKhong the danh o nay\n"); } while (banCo[m - 1][n - 1] != e);
banCo[m - 1][n - 1] = nguoi;
tinhDiem(banCo, diem);
mayDi(banCo, diem);
}
return 0;
}
int checkDuongCheo2(xo (*bc)[MS], xo ben) {
for (int k = 0; k < MS; k++)
if (bc[k][MS - k - 1] == ben)
return 1;
return 0;
}
int checkDuongCheo1(xo (*bc)[MS], xo ben) {
for (int k = 0; k < MS; k++)
if (bc[k][k] == ben)
return 1;
return 0;
}
int checkCot(xo (*bc)[MS], int cot, xo ben) {
for (int i = 0; i < MS; i++)
if (bc[i][cot] == ben)
return 1;
return 0;
}
int checkHang(xo (*bc)[MS], int hang, xo ben) {
for (int i = 0; i < MS; i++)
if (bc[hang][i] == ben)
return 1;
return 0;
}
void cls() {
}
int hetO(xo (*bc)[MS]) {
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++)
if (bc[i][j] == e)
return 0;
return 1;
}
int full0(int (*diem)[MS]) {
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++)
if (diem[i][j] != 0)
return 0;
return 1;
}
int checkWinHang(xo (*bc)[MS], int h, xo ben) {
for (int i = 0; i < MS; i++)
if (bc[h][i] != ben)
return 0;
return 1;
}
int checkWinCot(xo (*bc)[MS], int c, xo ben) {
for (int i = 0; i < MS; i++)
if (bc[i][c] != ben)
return 0;
return 1;
}
int checkWinDuongCheo1(xo (*bc)[MS], xo ben) {
for (int k = 0; k < MS; k++)
if (bc[k][k] != ben)
return 0;
return 1;
}
int checkWinDuongCheo2(xo (*bc)[MS], xo ben) {
for (int k = 0; k < MS; k++)
if (bc[k][MS - k - 1] != ben)
return 0;
return 1;
}
int checkWin(xo (*bc)[MS], xo ben) {
for (int k = 0; k < MS; k++) {
if (checkWinHang(bc, k, ben))
return 1;
else if (checkWinCot(bc, k, ben))
return 1;
}
if (checkWinDuongCheo1(bc, ben) || checkWinDuongCheo2(bc, ben))
return 1;
return 0;
}
int win(xo (*bc)[MS], int (*diem)[MS]) {
if (checkWin(bc, may)) {
cls();
inBanCo(bc);
return 1;
}
if (checkWin(bc, nguoi)) {
cls();
inBanCo(bc);
return 1;
}
if (full0(diem)) {
cls();
inBanCo(bc);
return 1;
}
if (hetO(bc)) {
cls();
inBanCo(bc);
return 1;
}
return 0;
}
void mayDi(xo (*bc)[MS], int (*diem)[MS]) {
int k = 0, l = 0;
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++)
if (diem[k][l] <= diem[i][j] && bc[i][j] == e) {
k = i;
l = j;
}
bc[k][l] = may;
}
void tinhDiem(xo (*bc)[MS], int (*diem)[MS]) {
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++) {
diem[i][j] = 0;
if (j == i || i == MS - j - 1)
diem[i][j]++;
}
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++)
if (bc[i][j] == may) {
for (int k = 0; k < MS; k++) {
if (!checkCot(bc, j, nguoi))
diem[k][j]++;
if (!checkHang(bc, i, nguoi))
diem[i][k]++;
}
if (i == j) {
if (!checkDuongCheo1(bc, nguoi))
for (int k = 0; k < MS; k++)
diem[k][k]++;
}
if (i == MS - j - 1) {
if (!checkDuongCheo2(bc, nguoi))
for (int k = 0; k < MS; k++)
diem[k][MS - k - 1]++;
}
} else if (bc[i][j] == nguoi) {
for (int k = 0; k < MS; k++) {
if (checkCot(bc, j, may))
diem[k][j] = 0;
else
diem[k][j]++;
if (checkHang(bc, i, may))
diem[i][k] = 0;
else
diem[i][k]++;
}
if (i == j) {
if (checkDuongCheo1(bc, may))
for (int k = 0; k < MS; k++)
diem[k][k] = 0;
else
for (int k = 0; k < MS; k++)
diem[k][k]++;
}
if (i == MS - j - 1) {
if (checkDuongCheo2(bc, may))
for (int k = 0; k < MS; k++)
diem[k][MS - k - 1] = 0;
else
for (int k = 0; k < MS; k++)
diem[k][MS - k - 1]++;
}
}
for (int i = 0; i < MS; i++)
for (int j = 0; j < MS; j++)
if (bc[i][j] == nguoi || bc[i][j] == may)
diem[i][j] = 0;
}
void inBanCo(xo (*bc)[MS]) {
for (int i = 0; i < MS; i++) {
for (int j = 0; j < MS; j++)
if (bc[i][j] == e)
else if (bc[i][j] == x)
else
}
}