#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
// 棋盘大小
const int BOARD_SIZE = 15;
// 棋子类型
enum ChessType {
EMPTY,
BLACK,
WHITE
};
// 棋盘类
class ChessBoard {
private:
vector<vector<ChessType>> board;
public:
ChessBoard() {
board.resize(BOARD_SIZE, vector<ChessType>(BOARD_SIZE, EMPTY));
}
// 打印棋盘
void print() {
for (int i = 0; i < BOARD_SIZE; ++i) {
for (int j = 0; j < BOARD_SIZE; ++j) {
switch (board[i][j]) {
case BLACK: cout << "● "; break;
case WHITE: cout << "○ "; break;
default: cout << "· "; break;
}
}
cout << endl;
}
}
// 下棋
bool placeChess(ChessType type, int x, int y) {
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y] != EMPTY) {
return false;
}
board[x][y] = type;
return true;
}
// 检查是否胜利
bool checkWin(ChessType type, int x, int y) {
// 检查八个方向(上下左右,四个对角线)
vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1},
{-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
for (auto dir : directions) {
int count = 1;
for (int i = 1; i < 5; ++i) {
int nx = x + i * dir.first;
int ny = y + i * dir.second;
if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == type) {
++count;
} else {
break;
}
}
for (int i = 1; i < 5; ++i) {
int nx = x - i * dir.first;
int ny = y - i * dir.second;
if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == type) {
++count;
} else {
break;
}
}
if (count >= 5) {
return true;
}
}
return false;
}
};
int main() {
ChessBoard board;
ChessType currentPlayer = BLACK;
bool gameOver = false;
while (!gameOver) {
board.print();
cout << (currentPlayer == BLACK ? "Black" : "White") << ", enter your move (x y): ";
int x, y;
cin >> x >> y;
if (board.placeChess(currentPlayer, x, y)) {
if (board.checkWin(currentPlayer, x, y)) {
board.print();
cout << (currentPlayer == BLACK ? "Black wins!" : "White wins!") << endl;
gameOver = true;
} else {
currentPlayer = (currentPlayer == BLACK) ? WHITE : BLACK;
}
} else {
cout << "Invalid move. Try again." << endl;
}
}
return 0;
}
编译通过后的执行效果: