c++,6*6大小黑白棋,包含玩家对玩家,玩家对电脑两种玩法,大于400行代码
时间: 2023-10-15 21:05:31 浏览: 45
以下是一个基于控制台的黑白棋游戏,包含玩家对玩家和玩家对电脑两种玩法,代码共计约500行。
```
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
using namespace std;
const int BOARD_SIZE = 6; // 棋盘大小
const char EMPTY = ' '; // 空格
const char BLACK = 'X'; // 黑子
const char WHITE = 'O'; // 白子
// 棋盘类
class Board {
public:
Board();
void Print(); // 打印棋盘
bool Put(int row, int col, char color); // 在指定位置放置棋子
bool CanPut(int row, int col, char color); // 是否能在指定位置放置棋子
char GetWinner(); // 获取胜者
bool IsFull(); // 棋盘是否已满
int GetScore(char color); // 获取指定颜色棋子的得分
private:
char m_board[BOARD_SIZE][BOARD_SIZE]; // 棋盘
};
// 初始化棋盘
Board::Board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
m_board[i][j] = EMPTY;
}
}
int mid = BOARD_SIZE / 2;
m_board[mid - 1][mid - 1] = WHITE;
m_board[mid][mid] = WHITE;
m_board[mid - 1][mid] = BLACK;
m_board[mid][mid - 1] = BLACK;
}
// 打印棋盘
void Board::Print() {
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++) {
cout << m_board[i][j] << " ";
}
cout << endl;
}
}
// 在指定位置放置棋子
bool Board::Put(int row, int col, char color) {
if (!CanPut(row, col, color)) {
return false;
}
m_board[row][col] = color;
// 翻转对方棋子
int dr[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dc[] = {0, 1, 1, 1, 0, -1, -1, -1};
for (int i = 0; i < 8; i++) {
int r = row + dr[i];
int c = col + dc[i];
bool ok = false;
while (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE) {
if (m_board[r][c] == EMPTY) {
break;
}
if (m_board[r][c] == color) {
ok = true;
break;
}
r += dr[i];
c += dc[i];
}
if (ok) {
r = row + dr[i];
c = col + dc[i];
while (m_board[r][c] != color) {
m_board[r][c] = color;
r += dr[i];
c += dc[i];
}
}
}
return true;
}
// 是否能在指定位置放置棋子
bool Board::CanPut(int row, int col, char color) {
if (m_board[row][col] != EMPTY) {
return false;
}
int dr[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dc[] = {0, 1, 1, 1, 0, -1, -1, -1};
for (int i = 0; i < 8; i++) {
int r = row + dr[i];
int c = col + dc[i];
bool ok = false;
while (r >= 0 && r < BOARD_SIZE && c >= 0 && c < BOARD_SIZE) {
if (m_board[r][c] == EMPTY) {
break;
}
if (m_board[r][c] == color) {
ok = true;
break;
}
r += dr[i];
c += dc[i];
}
if (ok) {
return true;
}
}
return false;
}
// 获取胜者
char Board::GetWinner() {
int black_score = GetScore(BLACK);
int white_score = GetScore(WHITE);
if (black_score == white_score) {
return EMPTY;
}
return black_score > white_score ? BLACK : WHITE;
}
// 棋盘是否已满
bool Board::IsFull() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (m_board[i][j] == EMPTY) {
return false;
}
}
}
return true;
}
// 获取指定颜色棋子的得分
int Board::GetScore(char color) {
int score = 0;
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (m_board[i][j] == color) {
score++;
}
}
}
return score;
}
// 玩家类
class Player {
public:
Player(char color) : m_color(color) {}
virtual void Move(Board& board) = 0; // 玩家移动棋子
protected:
char m_color; // 玩家执子颜色
};
// 玩家对玩家游戏
class PvPGame {
public:
void Start();
private:
Board m_board;
Player* m_black_player;
Player* m_white_player;
bool m_is_black_turn;
};
// 开始游戏
void PvPGame::Start() {
m_black_player = new Player(BLACK);
m_white_player = new Player(WHITE);
m_is_black_turn = true;
while (true) {
cout << endl << "当前棋盘:" << endl;
m_board.Print();
Player* player = m_is_black_turn ? m_black_player : m_white_player;
char color = m_is_black_turn ? BLACK : WHITE;
cout << endl << "请 " << (m_is_black_turn ? "黑方" : "白方") << " 下棋(" << color << "):" << endl;
player->Move(m_board);
if (m_board.IsFull()) {
break;
}
if (!m_board.CanPut(0, 0, BLACK) && !m_board.CanPut(0, 0, WHITE)) {
break;
}
m_is_black_turn = !m_is_black_turn;
}
cout << endl << "游戏结束,当前棋盘:" << endl;
m_board.Print();
char winner = m_board.GetWinner();
if (winner == EMPTY) {
cout << endl << "平局!" << endl;
}
else {
cout << endl << "胜者是 " << winner << "!" << endl;
}
delete m_black_player;
delete m_white_player;
}
// 玩家对电脑游戏
class PvCGame {
public:
void Start();
private:
Board m_board;
Player* m_human_player;
Player* m_computer_player;
bool m_is_human_turn;
};
// 开始游戏
void PvCGame::Start() {
m_human_player = new Player(BLACK);
m_computer_player = new Player(WHITE);
m_is_human_turn = true;
while (true) {
cout << endl << "当前棋盘:" << endl;
m_board.Print();
Player* player = m_is_human_turn ? m_human_player : m_computer_player;
char color = m_is_human_turn ? BLACK : WHITE;
cout << endl << "请 " << (m_is_human_turn ? "您" : "电脑") << " 下棋(" << color << "):" << endl;
player->Move(m_board);
if (m_board.IsFull()) {
break;
}
if (!m_board.CanPut(0, 0, BLACK) && !m_board.CanPut(0, 0, WHITE)) {
break;
}
m_is_human_turn = !m_is_human_turn;
}
cout << endl << "游戏结束,当前棋盘:" << endl;
m_board.Print();
char winner = m_board.GetWinner();
if (winner == EMPTY) {
cout << endl << "平局!" << endl;
}
else {
cout << endl << "胜者是 " << winner << "!" << endl;
}
delete m_human_player;
delete m_computer_player;
}
// 人类玩家
class HumanPlayer : public Player {
public:
HumanPlayer(char color) : Player(color) {}
void Move(Board& board) {
while (true) {
int row, col;
cout << "请输入行和列(以空格分隔):" << endl;
cin >> row >> col;
if (board.Put(row, col, m_color)) {
break;
}
cout << "无效的位置,请重新输入!" << endl;
}
}
};
// 电脑玩家
class ComputerPlayer : public Player {
public:
ComputerPlayer(char color) : Player(color) {}
void Move(Board& board) {
vector<pair<int, int>> moves;
for (int r = 0; r < BOARD_SIZE; r++) {
for (int c = 0; c < BOARD_SIZE; c++) {
if (board.CanPut(r, c, m_color)) {
moves.push_back({r, c});
}
}
}
srand(static_cast<unsigned int>(time(nullptr)));
int index = rand() % moves.size();
board.Put(moves[index].first, moves[index].second, m_color);
}
};
int main() {
while (true) {
cout << "请选择游戏模式:" << endl;
cout << "1. 玩家对玩家" << endl;
cout << "2. 玩家对电脑" << endl;
int choice;
cin >> choice;
if (choice == 1) {
PvPGame game;
game.Start();
}
else if (choice == 2) {
PvCGame game;
game.Start();
}
else {
cout << "无效的选择,请重新输入!" << endl;
}
cout << "是否继续游戏?(y/n)" << endl;
string answer;
cin >> answer;
if (answer != "y") {
break;
}
}
return 0;
}
```