五子棋小游戏

五子棋小游戏

好久没有碰C++了,最近写个五子棋的小游戏玩玩。

代码如下:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

// 棋盘的大小
const int SIZE = 15;
// 棋子的类型(空格、黑棋、白棋)
const char EMPTY = ' ';
const char BLACK = 'X';
const char WHITE = 'O';

// 初始化棋盘
void init_board(vector<vector<char>>& board) {
	for (int i = 0; i < SIZE; ++i) {
		board[i].assign(SIZE, EMPTY);
	}
}

// 打印棋盘
void print_board(vector<vector<char>>& board) {
	cout << "  ";//空两格
	// 打印列号
	for (int i = 0; i < SIZE; ++i) {
		printf("%2d", i + 1);
	}
	cout << endl;
	// 打印棋盘内容
	for (int i = 0; i < SIZE; ++i) {
		printf("%2d", i + 1);
		for (int j = 0; j < SIZE; ++j) {
			cout << "|" << board[i][j];
		}
		cout << "|" << endl;
		// 打印分隔线
		if (i != SIZE - 1) {
			cout << "  ";
			for (int j = 0; j < SIZE; ++j) {
				cout << "+-";
			}
			cout << "+" << endl;
		}
	}
	cout << endl;
}

// 胜负判断
bool check_win(vector<vector<char>>& board, int x, int y, char player) {
	// 用于遍历方向(水平、垂直、左斜、右斜)
	int dirs[4][2] = { {0, 1}, {1, 0}, {1, 1}, {1, -1} };

	for (auto dir : dirs) {
		int dx = dir[0];
		int dy = dir[1];
		int count = 0; // 统计该方向上的连续棋子数(不含当前位置)
		for (int i = -4; i <= 4; ++i) {
			if (i == 0) continue; // 跳过当前位置
			int nx = x + dx * i;
			int ny = y + dy * i;
			if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE && board[nx][ny] == player) {
				count++;
			}
			else {
				break; // 遇到边界或不同棋子,停止该方向检查
			}
		}
		if (count + 1 >= 5) return true; // 加上当前位置,共5个则获胜
	}
	return false;
}

int main() {
	cout << "五子棋游戏" << endl;
	cout << "输入格式:行号 列号。例如输入:1 2(表示在第1行第2列落子)" << endl;

	vector<vector<char>> board(SIZE, vector<char>(SIZE));
	init_board(board);  // 先初始化
	print_board(board); // 再打印初始棋盘

	char cur_player = BLACK; // 黑棋先行
	bool game_over = false;

	int x, y;
	while (!game_over) {
		cout << ((cur_player == BLACK) ? "黑棋(X)落子: " : "白棋(O)落子: ");
		cin >> x >> y;
		x--; // 转换为0-based索引(用户输入1~15 → 0~14)
		y--;

		// 检查输入合法性
		if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) {
			cout << "输入无效,请输入1-" << SIZE << "之间的数字" << endl;
			continue;
		}
		if (board[x][y] != EMPTY) {
			cout << "该位置已经有棋子!请重新落子" << endl;
			continue;
		}

		// 落子
		board[x][y] = cur_player;
		print_board(board);

		// 检测是否获胜
		if (check_win(board, x, y, cur_player)) {
			cout << (cur_player == BLACK ? "黑棋(X)获胜!" : "白棋(O)获胜!") << endl;
			game_over = true;
		}
		// 检测是否平局
		else {
			bool is_full = true;
			for (int i = 0; i < SIZE; ++i) {
				for (int j = 0; j < SIZE; ++j) {
					if (board[i][j] == EMPTY) {
						is_full = false;
						break;
					}
				}
				if (!is_full) break;
			}
			if (is_full) {
				cout << "平局!" << endl;
				game_over = true;
			}
		}

		// 仅在游戏未结束时切换玩家
		if (!game_over) {
			cur_player = (cur_player == BLACK) ? WHITE : BLACK;
		}
	}

	cout << "游戏结束!" << endl;
	return 0;
}

大概效果如下:

相关推荐
用户9799848071838 分钟前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks39 分钟前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea1 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术1 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术1 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
codigger1 小时前
ObjectSense:一门千行内核、把可靠性写进骨子里的面向对象脚本语言
开发语言·编程·编程语言
用户0441440924491 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠1 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术1 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考1 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法