小唐唐 • 9小时前
using namespace std; // 游戏常量定义 const int BOARD_SIZE = 15; // 棋盘大小(15x15,标准五子棋尺寸) const char EMPTY = '+'; // 空位置标记 const char PLAYER1 = 'b'; // 玩家1(黑子) const char PLAYER2 = 'w'; // 玩家2(白子)
// 棋盘数组 char board[BOARD_SIZE][BOARD_SIZE];
// 初始化棋盘 void initBoard() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = EMPTY;
}
}
}
// 绘制棋盘 void drawBoard() {
system("cls"); // Windows清屏,Linux/macOS替换为system("clear")
cout << " ";
// 绘制列号
for (int j = 0; j < BOARD_SIZE; j++) {
cout << setw(2) << j << " ";
}
cout << endl;
cout << " +";
for (int j = 0; j < BOARD_SIZE; j++) {
cout << "---+";
}
cout << endl;
// 绘制棋盘内容和行号
for (int i = 0; i < BOARD_SIZE; i++) {
cout << setw(2) << i << " |";
for (int j = 0; j < BOARD_SIZE; j++) {
cout << " " << board[i][j] << " |";
}
cout << endl;
cout << " +";
for (int j = 0; j < BOARD_SIZE; j++) {
cout << "---+";
}
cout << endl;
}
}
// 检查坐标是否合法 bool isValidPos(int x, int y) {
return x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY;
}
// 检查是否获胜 bool checkWin(int x, int y, char player) {
// 定义四个检查方向:水平、垂直、左斜、右斜
int dx[] = {0, 1, 1, 1};
int dy[] = {1, 0, 1, -1};
for (int dir = 0; dir < 4; dir++) {
int count = 1; // 当前位置已有一个棋子
// 正向检查
int nx = x + dx[dir];
int ny = y + dy[dir];
while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) {
count++;
nx += dx[dir];
ny += dy[dir];
}
// 反向检查
nx = x - dx[dir];
ny = y - dy[dir];
while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) {
count++;
nx -= dx[dir];
ny -= dy[dir];
}
// 五子连珠判定
if (count >= 5) {
return true;
}
}
return false;
}
// 检查棋盘是否已满(平局) bool isBoardFull() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == EMPTY) {
return false;
}
}
}
return true;
}
// 游戏主逻辑 void gameLoop() {
int x, y;
char currentPlayer = PLAYER1;
bool gameOver = false;
initBoard();
drawBoard();
while (!gameOver) {
cout << endl << "玩家" << (currentPlayer == PLAYER1 ? "1(黑子)" : "2(白子)")
<< " 请输入坐标(行 列):";
cin >> x >> y;
// 检查输入合法性
if (!isValidPos(x, y)) {
cout << "坐标不合法!请重新输入(范围0-" << BOARD_SIZE-1 << ",且位置不能为空)。" << endl;
continue;
}
// 落子
board[x][y] = currentPlayer;
drawBoard();
// 检查胜负
if (checkWin(x, y, currentPlayer)) {
cout << endl << "恭喜玩家" << (currentPlayer == PLAYER1 ? "1(黑子)" : "2(白子)") << " 获胜!" << endl;
gameOver = true;
}
// 检查平局
else if (isBoardFull()) {
cout << endl << "棋盘已满,平局!" << endl;
gameOver = true;
}
// 切换玩家
else {
currentPlayer = (currentPlayer == PLAYER1) ? PLAYER2 : PLAYER1;
}
}
cout << endl << "游戏结束!按任意键退出..." << endl;
}
int main() {
cout << "==================== 五子棋游戏 ====================" << endl;
cout << "规则:两人轮流落子,先形成五子连珠者获胜!" << endl;
cout << "输入格式:行号 列号(例如:7 7 表示棋盘中心位置)" << endl;
cout << "====================================================" << endl;
cout << "按任意键开始游戏..." << endl;
gameLoop();
return 0;
}
评论:
请先登录,才能进行评论