用C++實現五子棋游戲

#include <iostream>
#include <vector>
#include <string>
#include <iomanip>  // 用于控制輸出格式
#include <limits>   // 用于numeric_limitsusing namespace std;// 游戲常量定義
const int BOARD_SIZE = 15;  // 定義棋盤大小為15x15// 棋子類型枚舉
enum class Piece { EMPTY,  // 空位置BLACK,  // 黑棋(先手)WHITE   // 白棋(后手)
};// 游戲狀態枚舉
enum class GameState { PLAYING,    // 游戲進行中BLACK_WIN,  // 黑方勝利WHITE_WIN,  // 白方勝利DRAW        // 平局
};/?**?* 棋盤類 - 管理棋盤狀態和游戲規則*/
class Board {
private:vector<vector<Piece>> grid;  // 使用二維數組表示棋盤public:// 構造函數 - 初始化空棋盤Board() : grid(BOARD_SIZE, vector<Piece>(BOARD_SIZE, Piece::EMPTY)) {}/?**?* 重置棋盤 - 將所有位置設為空*/void reset() {// 遍歷每一行for (auto& row : grid) {// 將每行的所有元素設為EMPTYfill(row.begin(), row.end(), Piece::EMPTY);}}/?**?* 在指定位置放置棋子* @param x 橫坐標(0-14)* @param y 縱坐標(0-14)* @param piece 要放置的棋子類型* @return 放置是否成功*/bool placePiece(int x, int y, Piece piece) {// 檢查坐標是否有效且該位置為空if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || grid[x][y] != Piece::EMPTY) {return false;  // 無效移動}grid[x][y] = piece;  // 放置棋子return true;}/?**?* 獲取指定位置的棋子* @param x 橫坐標* @param y 縱坐標* @return 該位置的棋子類型(無效坐標返回EMPTY)*/Piece getPiece(int x, int y) const {// 檢查坐標是否有效if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE) {return Piece::EMPTY;}return grid[x][y];}/?**?* 檢查是否五子連珠* @param x 最后落子的橫坐標* @param y 最后落子的縱坐標* @return 是否形成五子連珠*/bool checkFiveInARow(int x, int y) const {Piece current = grid[x][y];if (current == Piece::EMPTY) return false;  // 空位置不可能五連// 四個檢查方向: 水平、垂直、主對角線、副對角線int directions[4][2] = { {1,0},  // 水平方向{0,1},   // 垂直方向{1,1},   // 主對角線{1,-1} }; // 副對角線// 檢查每個方向for (auto& dir : directions) {int count = 1;  // 當前棋子已經算1個// 正向檢查for (int i = 1; i < 5; i++) {int nx = x + dir[0] * i;int ny = y + dir[1] * i;if (getPiece(nx, ny) != current) break;  // 遇到不同顏色停止count++;}// 反向檢查for (int i = 1; i < 5; i++) {int nx = x - dir[0] * i;int ny = y - dir[1] * i;if (getPiece(nx, ny) != current) break;count++;}// 如果同色棋子數達到5個或更多,返回trueif (count >= 5) return true;}return false;  // 沒有找到五連}/?**?* 打印棋盤到控制臺*/void print() const {// 打印列號(頂部坐標)cout << "   ";for (int i = 0; i < BOARD_SIZE; i++) {cout << setw(2) << i << " ";  // 格式化輸出列號}cout << endl;// 打印每一行for (int i = 0; i < BOARD_SIZE; i++) {cout << setw(2) << i << " ";  // 打印行號for (int j = 0; j < BOARD_SIZE; j++) {// 根據棋子類型輸出不同符號switch (grid[i][j]) {case Piece::EMPTY: cout << " . "; break;  // 空位case Piece::BLACK: cout << " ● "; break;  // 黑棋case Piece::WHITE: cout << " ○ "; break;  // 白棋}}cout << endl;  // 換行}}
};/?**?* 游戲主類 - 管理游戲流程和狀態*/
class GomokuGame {
private:Board board;         // 棋盤對象GameState state;     // 當前游戲狀態Piece currentPlayer; // 當前玩家public:/?**?* 構造函數 - 初始化新游戲*/GomokuGame() : state(GameState::PLAYING), currentPlayer(Piece::BLACK) {}/?**?* 開始新游戲 - 重置棋盤和游戲狀態*/void startNewGame() {board.reset();  // 清空棋盤state = GameState::PLAYING;currentPlayer = Piece::BLACK;  // 黑棋先手}/?**?* 獲取當前游戲狀態* @return 當前游戲狀態*/GameState getGameState() const {return state;}/?**?* 打印當前游戲狀態*/void printStatus() const {board.print();  // 打印棋盤cout << endl;// 根據游戲狀態顯示不同信息switch (state) {case GameState::PLAYING:cout << "當前玩家: " << (currentPlayer == Piece::BLACK ? "黑方" : "白方") << endl;break;case GameState::BLACK_WIN:cout << "游戲結束! 黑方獲勝!" << endl;break;case GameState::WHITE_WIN:cout << "游戲結束! 白方獲勝!" << endl;break;case GameState::DRAW:cout << "游戲結束! 平局!" << endl;break;}}/?**?* 執行走棋操作* @param x 橫坐標* @param y 縱坐標* @return 走棋是否成功*/bool makeMove(int x, int y) {// 檢查游戲狀態和走棋有效性if (state != GameState::PLAYING || !board.placePiece(x, y, currentPlayer)) {return false;  // 走棋失敗}// 檢查是否獲勝if (board.checkFiveInARow(x, y)) {// 根據當前玩家設置勝利狀態state = (currentPlayer == Piece::BLACK) ? GameState::BLACK_WIN : GameState::WHITE_WIN;return true;}// 切換玩家currentPlayer = (currentPlayer == Piece::BLACK) ? Piece::WHITE : Piece::BLACK;return true;}
};/?**?* 主函數 - 游戲入口*/
int main() {GomokuGame game;  // 創建游戲實例game.startNewGame(); // 初始化新游戲// 主游戲循環while (true) {game.printStatus();  // 顯示當前游戲狀態// 檢查游戲是否結束if (game.getGameState() != GameState::PLAYING) {cout << "輸入'r'重新開始,'q'退出: ";char cmd;cin >> cmd;if (cmd == 'r') {game.startNewGame();  // 重新開始游戲continue;}else if (cmd == 'q') {break;  // 退出游戲}}// 獲取玩家輸入cout << "輸入坐標(x y): ";int x, y;cin >> x >> y;// 處理玩家走棋if (!game.makeMove(x, y)) {cout << "無效移動! 請重新輸入。" << endl;// 清除錯誤輸入cin.clear();cin.ignore(numeric_limits<streamsize>::max(), '\n');}}return 0;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90175.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode 熱題 100】73. 矩陣置零——(解法一)空間復雜度 O(M + N)

Problem: 73. 矩陣置零 題目&#xff1a;給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(M * N)空間復雜度&#xff1a;O(M N)整體思路…

【深度學習新浪潮】國內零樣本抗體設計的科研進展如何?

什么是AI零樣本抗體設計? AI零樣本抗體設計(Zero-shot AI Antibody Design)是指不依賴任何已知抗體序列或結構數據,僅根據靶點抗原信息,通過人工智能直接生成具有高親和力、高特異性的全新抗體序列的技術。其核心在于突破傳統抗體研發的“數據依賴瓶頸”,實現真正的“從…

【論文閱讀】A Diffusion model for POI recommendation

論文出處&#xff1a;ACM Transactions on Information Systems (TOIS) SCI一區 CCF-A期刊 論文地址&#xff1a;[2304.07041] A Diffusion model for POI recommendation 論文代碼&#xff1a;Yifang-Qin/Diff-POI: The official PyTorch implementation of Diff-POI. 目…

Rust實現FasterR-CNN目標檢測全流程

使用 Rust 和 FasterR-CNN 進行目標檢測 FasterR-CNN 是目標檢測領域廣泛使用的深度學習模型。Rust 生態中可以通過 tch-rs(Torch 綁定)調用預訓練的 PyTorch 模型實現。以下為完整實現步驟: 環境準備 安裝 Rust 和必要的依賴: cargo add tch cargo add anyhow # 錯誤…

Github 2025-07-03Go開源項目日報Top10

根據Github Trendings的統計,今日(2025-07-03統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10JavaScript項目2Go編程語言:構建簡單、可靠和高效的軟件 創建周期:3474 天開發語言:Go協議類型:BSD 3-Clause “New” or “Revise…

XML Schema 安裝使用教程

一、XML Schema 簡介 XML Schema&#xff08;XSD&#xff0c;全稱 XML Schema Definition&#xff09;是用于定義 XML 文檔結構、數據類型和數據約束的標準方式。它比 DTD 更加強大&#xff0c;支持數據類型、默認值、命名空間等&#xff0c;是企業級 XML 應用推薦的驗證方式。…

【字節跳動】數據挖掘面試題0008:計算西瓜視頻內容好評率

文章大綱題目描述題目描述 西瓜視頻近期開展了”2020百大人氣創作者”優質內容扶持項目&#xff0c;鼓勵用戶產出優質的視頻內容。 現需要統計2020年11月01日至2020年11月30日期間創作的視頻中&#xff0c; “科技”大類下“數碼測評"子類的視頻好評率&#xff08;好評率好…

Linux 進程控制:全面深入剖析進程創建、終止、替換與等待

文章目錄引言一、進程創建&#xff1a;fork()系統調用的奧秘1.1 fork()的基本原理1.2 代碼示例與解讀1.3 寫時復制&#xff08;COW&#xff09;優化二、進程終止&#xff1a;exit()與_exit()的抉擇2.1 exit()和_exit()的區別2.2 代碼示例與分析三、進程替換&#xff1a;exec()函…

PJSIP 中的 TCP 傳輸配置指南

PJSIP 支持通過 TCP 傳輸 SIP 消息&#xff0c;相比 UDP 提供了更可靠的傳輸機制。以下是關于在 PJSIP 中使用 TCP 的詳細指南。1. 創建 TCP 傳輸基本 TCP 傳輸配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…

小菜狗的云計算之旅,今天學習MySQL數據庫基礎知識及操作

目錄 一、概述 數據庫概念 數據庫的類型 關系型數據庫模型 關系數據庫相關概念 二、安裝 1、mariadb安裝 2、mysql安裝 3、啟動并開機自啟 4、本地連接&#xff08;本地登錄&#xff09; 三、mysql數據庫配置與命令 yum安裝后生成的目錄 mysql服務器的啟動腳本 數…

為什么是直接在**原型(prototype)上**添加函數

這是一個非常經典、核心的 JavaScript 面向對象編程問題&#xff1a;> 為什么是直接在**原型&#xff08;prototype&#xff09;上**添加函數&#xff0c;而不是在類/構造函數內部直接添加&#xff1f;你提到的代碼中&#xff1a;javascript function TopSearchComponent() …

深入理解 classnames:React 動態類名管理的最佳實踐

在現代前端開發中&#xff0c;我們經常需要根據組件的狀態、屬性或用戶交互來動態切換 CSS 類名。雖然 JavaScript 提供了多種方式來處理字符串拼接&#xff0c;但隨著應用復雜性的增加&#xff0c;傳統的類名管理方式很快就會變得混亂不堪。這時&#xff0c;classnames 庫就像…

C++系列(七):深度探索C++內存 --- 分區、堆棧、new/delete與高效編程實踐

引言 程序運行的本質是對數據的處理&#xff0c;而內存則是程序執行的核心舞臺。理解內存的物理與邏輯分區&#xff0c;是掌握程序底層行為、編寫高效可靠代碼的關鍵基石。內存并非混沌一片&#xff0c;而是被嚴格劃分為代碼區、全局區、棧區和堆區。每個區域擁有獨特的生命周…

微信小程序71~80

1.總結小程序生命周期 小程序冷啟動&#xff0c;鉤子函數執行的順序保留當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序銷毀當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序小程序熱啟動&#xff0c;鉤子函數執行的順序 2.使用Componen…

[Pytest][Part 3]檢測python package狀態

目錄 實現需求1&#xff1a; 檢查python package狀態——pkg_resource hook實現自動檢測包狀態 conftest.py hook鉤子函數 Part1: https://blog.csdn.net/x1987200567/article/details/144915315?spm1001.2014.3001.5501 從這里開始逐個實現Part1中的需求 實現需求1&a…

自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

&#x1f553; 自定義時間范圍選擇組件使用教程&#xff08;基于 Vue 3 Element Plus&#xff09;? 一個靈活實用的時間范圍選擇器&#xff0c;支持開始時間、結束時間、快捷時間選項、本地雙向綁定、插槽擴展等功能。–&#x1f4d8; 一、功能介紹 該組件基于 Element Plus …

YOLOv8 模型轉換 ONNX 后 C# 調用異常:一個參數引發的跨平臺適配難題

一、問題背景&#xff1a;從 Python 訓練到 C# 部署的跨平臺需求 作為一名 C# 開發者&#xff0c;我在完成 YOLOv8 模型訓練&#xff08;使用 Ultralytics 官方框架&#xff0c;訓練數據為自定義目標檢測數據集&#xff0c;輸入尺寸 640x640&#xff0c;訓練輪次 100 輪&#…

Apache Cloudberry 亮相 2025 IvorySQL 生態大會暨 PostgreSQL 高峰論壇

6 月 27 日至 28 日&#xff0c;IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇在泉城濟南順利召開。本屆大會由 IvorySQL 開源數據庫社區主辦、瀚高基礎軟件股份有限公司承辦&#xff0c;吸引了來自國內外的數據庫技術專家、開發者與開源愛好者齊聚一堂&#xff0c;聚焦數據庫…

CMake之CMakeLists.txt語法規則

本文主要參考正點原子的應用開發手冊&#xff0c;僅作為本人學習筆記使用。 目錄 cmake 的使用方法其實還是非常簡單的&#xff0c;重點在于編寫 CMakeLists.txt&#xff0c;CMakeLists.txt 的語法規則也簡單&#xff0c;并沒有 Makefile的語法規則那么復雜難以理解&#xff01…

Mysql專題復習

重點內容&#xff1a;1. Mysql架構&#xff1a;客戶端 Server層 存儲引擎2. 索引數據結構&#xff1a;B樹4. 索引優化&#xff1a;覆蓋索引、排序、JOIN、分頁&#xff1b; COUNT; 索引下推&#xff1b;單/雙路排序5. 數據庫事務&#xff1b; 鎖&#xff1b;隔離級別&#xff…