简易五子棋的实现(C++)
2024-01-03 16:04:10
名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
一、效果图
二、代码(带注释)
#include <iostream>
#include <vector>
using namespace std;
const int BOARD_SIZE = 15; // 定义棋盘大小为 15x15
vector<vector<char>> board(BOARD_SIZE, vector<char>(BOARD_SIZE, '.')); // 初始化棋盘,所有位置都是空的(用'.'表示)
// 打印棋盘的函数
void printBoard() {
for (int i = 0; i < BOARD_SIZE; ++i) {
for (int j = 0; j < BOARD_SIZE; ++j) {
cout << board[i][j] << " ";
}
cout << endl;
}
}
// 落子的函数
bool makeMove(int x, int y, char player) {
// 检查落子的位置是否有效
if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y] != '.') {
return false;
}
board[x][y] = player; // 在指定位置放置玩家的棋子
return true;
}
// 检查是否赢得比赛的函数
bool checkWin(int x, int y) {
char player = board[x][y];
int count;
// 水平方向检查
count = 1;
for (int i = x - 1; i >= 0 && board[i][y] == player; --i) count++;
for (int i = x + 1; i < BOARD_SIZE && board[i][y] == player; ++i) count++;
if (count >= 5) return true;
// 垂直方向检查
count = 1;
for (int i = y - 1; i >= 0 && board[x][i] == player; --i) count++;
for (int i = y + 1; i < BOARD_SIZE && board[x][i] == player; ++i) count++;
if (count >= 5) return true;
// 对角线检查(左上到右下)
count = 1;
for (int i = 1; x - i >= 0 && y - i >= 0 && board[x - i][y - i] == player; ++i) count++;
for (int i = 1; x + i < BOARD_SIZE && y + i < BOARD_SIZE && board[x + i][y + i] == player; ++i) count++;
if (count >= 5) return true;
// 对角线检查(左下到右上)
count = 1;
for (int i = 1; x - i >= 0 && y + i < BOARD_SIZE && board[x - i][y + i] == player; ++i) count++;
for (int i = 1; x + i < BOARD_SIZE && y - i >= 0 && board[x + i][y - i] == player; ++i) count++;
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] == '.') {
return false;
}
}
}
return true;
}
// 主函数
int main() {
int x, y;
char currentPlayer = 'X'; // 初始玩家
while (true) {
printBoard(); // 打印棋盘
cout << "玩家" << currentPlayer << ", 输入行列的来放入棋子: ";
cin >> x >> y;
if (makeMove(x, y, currentPlayer)) { // 尝试落子
if (checkWin(x, y)) { // 检查是否赢得比赛
cout << "玩家 " << currentPlayer << " wins!" << endl;
break;
} else if (isBoardFull()) { // 检查是否平局
cout << "平局了!" << endl;
break;
}
currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; // 更换玩家
} else {
cout << "无效移动,请重新尝试" << endl;
}
}
return 0;
}
三、说明
上述代码实现了一个简单的棋盘游戏,适用于两位玩家,棋盘大小:15x15。关于实现思路和自定义函数说明如下:
-
棋盘初始化:棋盘是一个15x15的网格,初始化时用’.'表示空位。
-
打印棋盘:
printBoard()
函数打印当前棋盘的状态。 -
落子:
makeMove()
函数允许玩家在棋盘上放置他们的符号(‘X’或’O’),前提是所选单元格为空。 -
检查胜利:
checkWin()
函数检查玩家的最后一个动作是否赢得了游戏。它水平、垂直和对角线(两个方向)检查是否有连续的5个相同符号。 -
检查棋盘是否已满:
isBoardFull()
函数检查棋盘上是否还有空位。 -
游戏循环:在
main()
中,游戏继续循环,每位玩家轮流进行移动。每次移动后,它检查是否胜利或平局。如果一方胜利或棋盘已满(导致平局),游戏结束。 -
用户输入:玩家通过标准输入(
cin
)输入他们的移动,他们需要输入行号和列号。 -
处理无效移动:如果进行了无效的移动,游戏会提示用户重新尝试。
这个棋盘游戏,基于文本实现,在控制台中进行,能够提供一个简单但功能完备的双人棋盘游戏实现。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!
文章来源:https://blog.csdn.net/qq_51646682/article/details/135360674
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!