#include<iostream>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#define N 15
using namespace std;
class Chess
{
public:
void Init();
int Play();
void Print();
int Put();
int Judge();
int Attack();
int Defend();
int aiPut();
void Test();
int Winner();
private:
int p[N][N];
int score1[N][N];
int score2[N][N];
int X; int Y;
int Gamer;
int count;
};
int main()
{
Chess che;
che.Test();
che.Init();
return 0;
}
int Chess::Play()
{
Init();
count = 0;
while (1)
{
Print();
char ch = _getch();
switch (ch)
{
case 32:
if (1 == Put())
{
Attack();
Defend();
aiPut();
Judge();
Winner();
};
break;
case 72:
X--; if (X < 0)X = 14;
break;
case 80:
X++; if (X > 14)X = 0;
break;
case 75:
Y--; if (Y < 0)Y = 14;
break;
case 77:
Y++; if (Y > 14)Y = 0;
break;
}
}
return 0;
}
void Chess::Init()
{
memset(p, 0, sizeof(p));
memset(score1, 0, sizeof(score1));
memset(score2, 0, sizeof(score2));
X = Y = 7;
}
void Chess::Print()
{
system("cls");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (X == i && Y == j)cout << "╬";
else if (p[i][j] == 1)cout << "●";
else if (p[i][j] == 2)cout << "○";
else if (i == 0 && j == 0)cout << "┏";
else if (i == 0 && j == 14)cout << "┓";
else if (i == 14 && j == 0)cout << "┗";
else if (i == 14 && j == 14)cout << "┛";
else if (i == 0)cout << "┯";
else if (i == 14)cout << "┷";
else if (j == 0)cout << "┠";
else if (j == 14)cout << "┨";
else cout << "┼";
}
cout << endl;
}
}
int Chess::Put()
{
if (p[X][Y] == 0)
{
p[X][Y] = 1;
return 1;
}
else
return 0;
}
int Chess::Judge()
{
int h_b = 1; int v_b = 1; int ps_b = 1; int sd_b = 1;
int h_w = 1; int v_w = 1; int ps_w = 1; int sd_w = 1;
for (int i = 1; i < 5; i++)
{
if (Y + i < 15 && p[X][Y + i] == 1)
h_b++;
if (Y + i < 15 && p[X][Y + i] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (Y - i > 0 && p[X][Y - i] == 1)
h_b++;
if (Y - i > 0 && p[X][Y - i] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && p[X + i][Y] == 1)
v_b++;
if (X + i < 15 && p[X + i][Y] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && p[X - i][Y] == 1)
v_b++;
if (X - i > 0 && p[X - i][Y] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
ps_b++;
if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
ps_b++;
if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
sd_b++;
if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
sd_b++;
if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
break;
}
if (h_b == 5 || v_b == 5 || ps_b == 5 || sd_b == 5)
{
return 1;
}
//白子胜利判断
for (int i = 1; i < 5; i++)
{
if (Y + i < 15 && p[X][Y + i] == 2)
h_w++;
if (Y + i < 15 && p[X][Y + i] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (Y - i > 0 && p[X][Y - i] == 2)
h_w++;
if (Y - i > 0 && p[X][Y - i] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && p[X + i][Y] == 2)
v_w++;
if (X + i < 15 && p[X + i][Y] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && p[X - i][Y] == 2)
v_w++;
if (X - i > 0 && p[X - i][Y] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 2)
ps_w++;
if (X + i < 15 && Y + i < 15 && p[X + i][Y + i] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 2)
ps_w++;
if (X - i > 0 && Y - i > 0 && p[X - i][Y - i] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 2)
sd_w++;
if (X - i > 0 && Y + i < 15 && p[X - i][Y + i] == 1)
break;
}
for (int i = 1; i < 5; i++)
{
if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 2)
sd_w++;
if (X + i < 15 && Y - i>0 && p[X + i][Y - i] == 1)
break;
}
if (h_w == 5 || v_w == 5 || ps_w == 5 || sd_w == 5)
{
return 2;
}
}
int Chess::Winner()
{
int winner = Judge();
if (winner == 1)
{
count = 0;
system("cls");
MessageBox(NULL, L"黑子赢了", L"提示", MB_OK);
return 0;
}
else if (winner == 2)
{
count = 0;
system("cls");
MessageBox(NULL, L"白子赢了", L"提示", MB_OK);
return 0;
}
else if (count == 225)
{
count = 0;
system("cls");
MessageBox(NULL, L"平局", L"提示", MB_OK);
return 0;
}
}
void Chess::Test()
{
SetConsoleTitleA("五子棋人机对战");
system("mode con cols=50 lines=20");
system("color 70");
while (1)
{
Play();
}
}
int Chess::Attack()
{
int i1, j1;
int k1, k2, k;
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
if (p[i][j])
score1[i][j] = 0;
if (p[i][j] == 0)
{
k1 = k2 = 0;
for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k1++;
else
break;
}
for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k2++;
else
break;
}
k = k1 > k2 ? k1 : k2;
k1 = k2 = 0;
for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k1++;
else
break;
}
for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
k1 = k2 = 0;
for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k1++;
else
break;
}
for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
k1 = k2 = 0;
for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k1++;
else
break;
}
for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找电脑棋子数
{
if (p[i1][j1] == 2)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
switch (k) //根据连子数赋予权值
{
case 1:
score1[i][j] = 15; break;
case 2:
score1[i][j] = 60; break;
case 3:
score1[i][j] = 240; break;
case 4:
score1[i][j] = 3000; break;
default:
score1[i][j] = 0; break;
}
}
}
}
return 0;
}
int Chess::Defend() //电脑在棋盘各个位置的防守权值
{
int i1, j1;
int k1, k2, k;
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
if (p[i][j])
score2[i][j] = 0;
if (p[i][j] == 0)
{
k1 = k2 = 0;
for (i1 = i, j1 = j - 1; j1 >= 0; j1--)//往左数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k1++;
else
break;
}
for (i1 = i, j1 = j + 1; j1 < 15; j1++)//往右数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k2++;
else
break;
}
k = k1 > k2 ? k1 : k2;
k1 = k2 = 0;
for (i1 = i - 1, j1 = j; i1 >= 0; i1--)//往上数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k1++;
else
break;
}
for (i1 = i + 1, j1 = j; i1 < 15; i1++)//往下数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
k1 = k2 = 0;
for (i1 = i - 1, j1 = j - 1; i1 >= 0 && j1 >= 0; i1--, j1--)//往左上数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k1++;
else
break;
}
for (i1 = i + 1, j1 = j + 1; i1 < 15 && j1 < 15; i1++, j1++)//往右下数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
k1 = k2 = 0;
for (i1 = i + 1, j1 = j - 1; i1 < 15 && j1 >= 0; i1++, j1--)//往左下数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k1++;
else
break;
}
for (i1 = i - 1, j1 = j + 1; i1 >= 0 && j1 < 15; i1--, j1++)//往右上数寻找玩家棋子数
{
if (p[i1][j1] == 1)
k2++;
else
break;
}
k1 = k1 > k2 ? k1 : k2;
k = k > k1 ? k : k1;
switch (k) //根据连子数赋予权值
{
case 1:
score2[i][j] = 10; break;
case 2:
score2[i][j] = 40; break;
case 3:
score2[i][j] = 160; break;
case 4:
score2[i][j] = 4000; break;
default:
score2[i][j] = 0; break;
}
}
}
}
return 0;
}
int Chess::aiPut()
{
int k1 = 0, k2 = 0;
int i, j, max = 0;
for (i = 0; i < 15; i++)
{
for (j = 0; j < 15; j++)
{
if (max <= score1[i][j])
{
max = score1[i][j];
k1 = i;
k2 = j;
}
}
}
for (i = 0; i < 15; i ++)
{
for (j = 0; j < 15; j++)
{
if (max <= score2[i][j])
{
max = score2[i][j];
k1 = i;
k2 = j;
}
}
}
p[k1][k2] = 2;
if (p[k1][k2] == 2)
{
cout << "○";
count++;
}
return 0;
}