C++之std::atmoic、std::pair、enum class



今天看别人的源码,发现C++里面的有些东西之前都没接触过,记录下来

1、std::atmoic<typename T>

atmoic是应该模板类是C++11新出的应该新特性用来保证线程安全。保证对象是应该原子操作,即每次只能有一个线程对对象进行操作,用来保证数据安全

2、std::pair<typename T1,typename T2>

std::pair<>是将两个数据整合成一个数据,举个例子

std::pair<int,double> p;
p.first=1;
p.second=2;
std::cout<<p.first<<endl;
std::cout<<p.second<<endl;
结果为:
1
2
3、enum class是强类型枚举

六子棋是一种和五子棋类似的棋类游戏,但是棋盘变成了六边形的形状。实现六子棋AI需要使用一些搜索算法,比如Minimax算法、Alpha-Beta剪枝算法等。 首先,我们需要定义棋盘和棋子的类。棋盘类需要包括棋盘大小、当前棋子的位置、当前落子方等信息;棋子类需要包括棋子颜色、棋子位置等信息。 ```c++ class HexBoard { public: HexBoard(int size); bool is_game_over(); bool make_move(int x, int y, Player player); void print_board(); std::vector<std::pair<int, int>> get_moves(); private: std::vector<std::vector<Player>> board; int board_size; Player current_player; }; class HexPiece { public: HexPiece(Player player, int x, int y); Player get_player(); int get_x(); int get_y(); private: Player player; int x_pos; int y_pos; }; ``` 其中,Player是一个枚举类型,表示黑白两方。 ```c++ enum class Player {EMPTY, BLACK, WHITE}; ``` 然后,我们需要实现一个AI类,用于生成下一步的最优落子位置。这里我们使用Minimax算法和Alpha-Beta剪枝算法。 ```c++ class HexAI { public: HexAI(int search_depth); std::pair<int, int> get_next_move(HexBoard board); private: int max_depth; std::pair<int, int> minimax(HexBoard board, int depth, int alpha, int beta, bool maximizing_player); }; ``` Minimax算法是一种极大极小化算法,会搜索所有的可能性,并返回一个最优解。在六子棋中,我们可以假设黑方是极小化玩家,白方是极大化玩家。 Alpha-Beta剪枝算法是一种优化的Minimax算法,它会在搜索树中进行剪枝,减少搜索的数量。具体实现可以参考下面的代码: ```c++ std::pair<int, int> HexAI::get_next_move(HexBoard board) { std::vector<std::pair<int, int>> moves = board.get_moves(); std::pair<int, int> best_move = moves[0]; int best_score = std::numeric_limits<int>::min(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::WHITE); int score = minimax(new_board, max_depth - 1, std::numeric_limits<int>::min(), std::numeric_limits<int>::max(), false); if (score > best_score) { best_score = score; best_move = move; } } return best_move; } int HexAI::minimax(HexBoard board, int depth, int alpha, int beta, bool maximizing_player) { if (depth == 0 || board.is_game_over()) { return board.evaluate(); } if (maximizing_player) { int max_score = std::numeric_limits<int>::min(); std::vector<std::pair<int, int>> moves = board.get_moves(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::WHITE); int score = minimax(new_board, depth - 1, alpha, beta, false); max_score = std::max(max_score, score); alpha = std::max(alpha, score); if (beta <= alpha) { break; } } return max_score; } else { int min_score = std::numeric_limits<int>::max(); std::vector<std::pair<int, int>> moves = board.get_moves(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::BLACK); int score = minimax(new_board, depth - 1, alpha, beta, true); min_score = std::min(min_score, score); beta = std::min(beta, score); if (beta <= alpha) { break; } } return min_score; } } ``` 最后,我们需要实现一个评估函数,用于评估当前棋盘的好坏程度。具体实现可以根据自己的经验和思路来实现。 ```c++ int HexBoard::evaluate() { // TODO: implement the evaluation function return 0; } ``` 完整的代码实现可以参考下面的示例: ```c++ #include <iostream> #include <vector> #include <limits> enum class Player {EMPTY, BLACK, WHITE}; class HexPiece { public: HexPiece(Player player, int x, int y) : player(player), x_pos(x), y_pos(y) {} Player get_player() { return player; } int get_x() { return x_pos; } int get_y() { return y_pos; } private: Player player; int x_pos; int y_pos; }; class HexBoard { public: HexBoard(int size) : board_size(size), current_player(Player::BLACK) { board.resize(size); for (int i = 0; i < size; i++) { board[i].resize(size, Player::EMPTY); } } bool is_game_over() { // Check if black has won for (int i = 0; i < board_size; i++) { if (board[0][i] == Player::BLACK) { std::vector<std::vector<bool>> visited(board_size, std::vector<bool>(board_size, false)); if (dfs(i, 0, Player::BLACK, visited)) { return true; } } } // Check if white has won for (int i = 0; i < board_size; i++) { if (board[i][0] == Player::WHITE) { std::vector<std::vector<bool>> visited(board_size, std::vector<bool>(board_size, false)); if (dfs(0, i, Player::WHITE, visited)) { return true; } } } return false; } bool make_move(int x, int y, Player player) { if (board[x][y] == Player::EMPTY) { board[x][y] = player; pieces.push_back(HexPiece(player, x, y)); if (player == Player::BLACK) { current_player = Player::WHITE; } else { current_player = Player::BLACK; } return true; } return false; } void print_board() { int offset = 2 * (board_size - 1); for (int i = 0; i < board_size; i++) { for (int j = 0; j < i; j++) { std::cout << " "; } std::cout << i << " "; for (int j = 0; j < board_size; j++) { switch (board[i][j]) { case Player::EMPTY: std::cout << "."; break; case Player::BLACK: std::cout << "X"; break; case Player::WHITE: std::cout << "O"; break; } std::cout << " "; } std::cout << i << std::endl; } for (int i = 0; i < offset + board_size; i++) { std::cout << " "; } for (int i = 0; i < board_size; i++) { std::cout << i << " "; } std::cout << std::endl; } std::vector<std::pair<int, int>> get_moves() { std::vector<std::pair<int, int>> moves; for (int i = 0; i < board_size; i++) { for (int j = 0; j < board_size; j++) { if (board[i][j] == Player::EMPTY) { moves.push_back(std::make_pair(i, j)); } } } return moves; } int evaluate() { // TODO: implement the evaluation function return 0; } private: std::vector<std::vector<Player>> board; std::vector<HexPiece> pieces; int board_size; Player current_player; bool dfs(int x, int y, Player player, std::vector<std::vector<bool>>& visited) { if (x < 0 || x >= board_size || y < 0 || y >= board_size || board[x][y] != player) { return false; } if (y == board_size - 1 && player == Player::BLACK) { return true; } if (x == board_size - 1 && player == Player::WHITE) { return true; } if (visited[x][y]) { return false; } visited[x][y] = true; if (dfs(x - 1, y, player, visited) || dfs(x + 1, y, player, visited) || dfs(x, y - 1, player, visited) || dfs(x, y + 1, player, visited)) { return true; } return false; } }; class HexAI { public: HexAI(int search_depth) : max_depth(search_depth) {} std::pair<int, int> get_next_move(HexBoard board) { std::vector<std::pair<int, int>> moves = board.get_moves(); std::pair<int, int> best_move = moves[0]; int best_score = std::numeric_limits<int>::min(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::WHITE); int score = minimax(new_board, max_depth - 1, std::numeric_limits<int>::min(), std::numeric_limits<int>::max(), false); if (score > best_score) { best_score = score; best_move = move; } } return best_move; } private: int max_depth; int minimax(HexBoard board, int depth, int alpha, int beta, bool maximizing_player) { if (depth == 0 || board.is_game_over()) { return board.evaluate(); } if (maximizing_player) { int max_score = std::numeric_limits<int>::min(); std::vector<std::pair<int, int>> moves = board.get_moves(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::WHITE); int score = minimax(new_board, depth - 1, alpha, beta, false); max_score = std::max(max_score, score); alpha = std::max(alpha, score); if (beta <= alpha) { break; } } return max_score; } else { int min_score = std::numeric_limits<int>::max(); std::vector<std::pair<int, int>> moves = board.get_moves(); for (auto move : moves) { HexBoard new_board = board; new_board.make_move(move.first, move.second, Player::BLACK); int score = minimax(new_board, depth - 1, alpha, beta, true); min_score = std::min(min_score, score); beta = std::min(beta, score); if (beta <= alpha) { break; } } return min_score; } } }; int main() { HexBoard board(11); HexAI ai(3); while (!board.is_game_over()) { board.print_board(); if (board.get_moves().size() == 0) { std::cout << "No more moves, game over!" << std::endl; break; } if (board.get_current_player() == Player::BLACK) { int x, y; std::cout << "Enter move (x y): "; std::cin >> x >> y; if (!board.make_move(x, y, Player::BLACK)) { std::cout << "Invalid move, try again!" << std::endl; continue; } } else { std::pair<int, int> move = ai.get_next_move(board); board.make_move(move.first, move.second, Player::WHITE); } } board.print_board(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值