C++写出五子棋的代码
时间: 2023-10-08 14:14:30 浏览: 40
下面是一个简单的C++五子棋代码示例,实现了简单的落子和胜负判断功能。代码注释中有详细的说明:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int BOARD_SIZE = 15; // 棋盘大小
enum class Piece { EMPTY, BLACK, WHITE }; // 棋子类型
class Board {
public:
Board() {
board_.resize(BOARD_SIZE, vector<Piece>(BOARD_SIZE, Piece::EMPTY)); // 初始化棋盘
}
void print() const { // 打印棋盘
cout << " ";
for (int i = 0; i < BOARD_SIZE; ++i) {
cout << i << " ";
}
cout << endl;
for (int i = 0; i < BOARD_SIZE; ++i) {
cout << i << " ";
for (int j = 0; j < BOARD_SIZE; ++j) {
switch (board_[i][j]) {
case Piece::EMPTY:
cout << "+ ";
break;
case Piece::BLACK:
cout << "X ";
break;
case Piece::WHITE:
cout << "O ";
break;
}
}
cout << endl;
}
}
bool put(int x, int y, Piece piece) { // 落子
if (board_[x][y] != Piece::EMPTY) {
return false; // 该位置已经有棋子
}
board_[x][y] = piece;
return true;
}
bool checkWin(int x, int y) const { // 判断胜负
Piece piece = board_[x][y];
int count = 1;
// 横向判断
for (int i = y - 1; i >= 0 && board_[x][i] == piece; --i) {
++count;
}
for (int i = y + 1; i < BOARD_SIZE && board_[x][i] == piece; ++i) {
++count;
}
if (count >= 5) {
return true;
}
// 纵向判断
count = 1;
for (int i = x - 1; i >= 0 && board_[i][y] == piece; --i) {
++count;
}
for (int i = x + 1; i < BOARD_SIZE && board_[i][y] == piece; ++i) {
++count;
}
if (count >= 5) {
return true;
}
// 左上到右下判断
count = 1;
for (int i = x - 1, j = y - 1; i >= 0 && j >= 0 && board_[i][j] == piece; --i, --j) {
++count;
}
for (int i = x + 1, j = y + 1; i < BOARD_SIZE && j < BOARD_SIZE && board_[i][j] == piece; ++i, ++j) {
++count;
}
if (count >= 5) {
return true;
}
// 左下到右上判断
count = 1;
for (int i = x + 1, j = y - 1; i < BOARD_SIZE && j >= 0 && board_[i][j] == piece; ++i, --j) {
++count;
}
for (int i = x - 1, j = y + 1; i >= 0 && j < BOARD_SIZE && board_[i][j] == piece; --i, ++j) {
++count;
}
if (count >= 5) {
return true;
}
return false;
}
private:
vector<vector<Piece>> board_;
};
int main() {
Board board;
Piece turn = Piece::BLACK; // 黑方先手
while (true) {
board.print();
int x, y;
cout << (turn == Piece::BLACK ? "Black" : "White") << " turn: ";
cin >> x >> y;
if (board.put(x, y, turn)) {
if (board.checkWin(x, y)) {
cout << (turn == Piece::BLACK ? "Black" : "White") << " win!" << endl;
break;
}
turn = turn == Piece::BLACK ? Piece::WHITE : Piece::BLACK; // 切换下棋方
}
}
return 0;
}
```
注意,这只是一个简单的示例,没有考虑很多实际中需要考虑的问题,例如禁手规则、提高搜索速度等等。