c++五子棋源代码
以下是一个简单的C++五子棋源代码示例:
#include <iostream>
#include <vector>
const int BOARD_SIZE = 15;
const char EMPTY = '-';
const char BLACK = 'X';
const char WHITE = 'O';
std::vector<std::vector<char>> board(BOARD_SIZE, std::vector<char>(BOARD_SIZE, EMPTY));
bool is_valid_move(int row, int col) {
return row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE && board[row][col] == EMPTY;
}
bool is_winning_move(int row, int col, char player) {
int count = 0;
// 检查水平方向
for (int i = col - 4; i <= col; i++) {
if (i >= 0 && i + 4 < BOARD_SIZE) {
count = 0;
for (int j = i; j <= i + 4; j++) {
if (board[row][j] == player) {
count++;
}
}
if (count == 5) {
return true;
}
}
}
// 检查垂直方向
for (int i = row - 4; i <= row; i++) {
if (i >= 0 && i + 4 < BOARD_SIZE) {
count = 0;
for (int j = i; j <= i + 4; j++) {
if (board[j][col] == player) {
count++;
}
}
if (count == 5) {
return true;
}
}
}
// 检查主对角线方向
for (int i = -4; i <= 0; i++) {
if (row + i >= 0 && row + i + 4 < BOARD_SIZE && col + i >= 0 && col + i + 4 < BOARD_SIZE) {
count = 0;
for (int j = 0; j <= 4; j++) {
if (board[row + i + j][col + i + j] == player) {
count++;
}
}
if (count == 5) {
return true;
}
}
}
// 检查副对角线方向
for (int i = -4; i <= 0; i++) {
if (row + i >= 0 && row + i + 4 < BOARD_SIZE && col - i >= 0 && col - i + 4 < BOARD_SIZE) {
count = 0;
for (int j = 0; j <= 4; j++) {
if (board[row + i + j][col - i - j] == player) {
count++;
}
}
if (count == 5) {
return true;
}
}
}
return false;
}
void print_board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
std::cout << board[i][j] << " ";
}
std::cout << std::endl;
}
}
int main() {
int row, col;
char player = BLACK;
while (true) {
std::cout << "Player " << player << "'s turn. Enter row and column: ";
std::cin >> row >> col;
if (is_valid_move(row, col)) {
board[row][col] = player;
print_board();
if (is_winning_move(row, col, player)) {
std::cout << "Player " << player << " wins!" << std::endl;
break;
}
player = (player == BLACK) ? WHITE : BLACK;
} else {
std::cout << "Invalid move. Try again." << std::endl;
}
}
return 0;
}
这个程序使用一个二维向量来表示棋盘,其中空位置用’-'表示,黑子用’X’表示,白子用’O’表示。程序通过循环接受玩家输入的行和列,然后检查是否是有效的移动,如果是,则在棋盘上放置相应的棋子,并检查是否是获胜的移动。如果是获胜的移动,则输出获胜信息并结束游戏。如果不是获胜的移动,则切换到另一个玩家。
这个程序中的is_valid_move
函数用于检查玩家的移动是否有效。它会检查行和列的范围是否在合法的范围内,并且该位置是否为空。
is_winning_move
函数用于检查玩家的移动是否是获胜的移动。它会检查水平、垂直、主对角线和副对角线四个方向上是否有连续的五个相同的棋子。
print_board
函数用于打印当前的棋盘状态。
在main
函数中,程序会循环接受玩家的输入,并根据输入的行和列进行移动。如果移动有效,则在棋盘上放置相应的棋子,并检查是否是获胜的移动。如果是获胜的移动,则输出获胜信息并结束游戏。如果移动无效,则提示玩家重新输入。
这个程序只是一个简单的示例,可能还有一些功能和优化可以添加,比如判断平局、添加输入验证等。但是这个示例可以作为一个起点,你可以根据自己的需求进行修改和扩展。