【簡單的C++圍棋游戲開發示例】

C++圍棋游戲開發簡單示例(控制臺版)

?核心代碼實現?


#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int SIZE = 9;  // 簡化棋盤為9x9?:ml-citation{ref="1" data="citationList"}
int board[SIZE][SIZE] = {0};  // 0:空 1:黑 2:白?:ml-citation{ref="1,2" data="citationList"}
pair<int, int> lastRemoved = {-1, -1};  // 記錄上一步提子位置(簡化打劫規則)?:ml-citation{ref="1" data="citationList"}// 顯示棋盤
void displayBoard() {cout << "  ";for (int i = 0; i < SIZE; i++) cout << i << " ";cout << "\n";for (int y = 0; y < SIZE; y++) {cout << y << " ";for (int x = 0; x < SIZE; x++) {char c = (board[y][x] == 1) ? 'B' : (board[y][x] == 2) ? 'W' : '+';cout << c << " ";}cout << "\n";}
}// 檢查坐標合法性
bool isValid(int x, int y) {return x >= 0 && x < SIZE && y >= 0 && y < SIZE;
}// BFS計算氣(Liberty)
int calculateLiberty(int x, int y, int color) {bool visited[SIZE][SIZE] = {false};queue<pair<int, int>> q;q.push({x, y});visited[y][x] = true;int liberty = 0;vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};while (!q.empty()) {auto [cx, cy] = q.front();q.pop();for (auto [dx, dy] : dirs) {int nx = cx + dx, ny = cy + dy;if (!isValid(nx, ny) || visited[ny][nx]) continue;if (board[ny][nx] == 0) liberty++;else if (board[ny][nx] == color) {visited[ny][nx] = true;q.push({nx, ny});}}}return liberty;
}// 提子邏輯
void removeGroup(int x, int y, int color) {queue<pair<int, int>> q;q.push({x, y});board[y][x] = 0;vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};while (!q.empty()) {auto [cx, cy] = q.front();q.pop();for (auto [dx, dy] : dirs) {int nx = cx + dx, ny = cy + dy;if (isValid(nx, ny) && board[ny][nx] == color) {board[ny][nx] = 0;q.push({nx, ny});}}}
}// 落子邏輯
bool placeStone(int x, int y, int color) {if (!isValid(x, y) || board[y][x] != 0) return false;board[y][x] = color;vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};// 檢查周圍敵方棋子是否無氣for (auto [dx, dy] : dirs) {int nx = x + dx, ny = y + dy;if (isValid(nx, ny) && board[ny][nx] != 0 && board[ny][nx] != color) {if (calculateLiberty(nx, ny, board[ny][nx]) == 0) {removeGroup(nx, ny, board[ny][nx]);lastRemoved = {x, y};  // 記錄提子位置?:ml-citation{ref="1" data="citationList"}}}}// 檢查自身棋子是否存活if (calculateLiberty(x, y, color) == 0) {board[y][x] = 0;  // 自殺規則return false;}return true;
}int main() {int currentPlayer = 1;  // 黑方先手while (true) {displayBoard();int x, y;cout << "玩家" << ((currentPlayer == 1) ? "黑(B)" : "白(W)") << "輸入坐標(x y): ";cin >> x >> y;if (placeStone(x, y, currentPlayer)) {currentPlayer = (currentPlayer == 1) ? 2 : 1;  // 切換玩家?:ml-citation{ref="3" data="citationList"}} else {cout << "落子無效,請重新輸入!\n";}}return 0;
}

核心功能說明?

1.棋盤初始化?

使用9x9簡化棋盤,通過二維數組board存儲狀態?12。
符號B表示黑子,W表示白子,+表示空位?3。

2?.落子與提子?

通過placeStone()函數實現落子合法性檢查,包括自殺規則和敵方提子邏輯?12。
使用BFS算法計算棋子群的氣,氣為0時觸發removeGroup()提子?14。

3.交互與顯示?

控制臺輸入坐標,動態更新棋盤狀態?3。
簡化打劫規則:僅記錄最后一次提子位置(未完全實現劫爭判斷)?1。

4.編譯與運行?

?環境要求?

支持C++11標準的編譯器(如GCC/Clang/Visual Studio)?13。
控制臺模式下直接運行,無需圖形庫依賴?3。

5.操作說明?

輸入坐標格式為x y(例如3 4表示第3列第4行)。
若落子位置無效(如已有棋子或導致自殺),提示重新輸入?3。

6.擴展方向?

?規則完善?
增加劫爭判斷:通過lastRemoved變量阻止立即回提?1。
實現勝負判定:通過計算領地或活子數量?24。

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

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

相關文章

RK3568平臺(音頻篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系統中用于配置音頻策略和音量的 XML 文件。它定義了音頻流的音量曲線、動態范圍控制(DRC)參數以及音頻設備的音量設置。該文件通常位于 /vendor/etc/ 或 /system/etc/ 目錄下,是 Android 音頻框架的重要組成部分。 以下是對 audi…

如何下載安裝 PyCharm?

李升偉 整理 一、下載 PyCharm 訪問官網 打開 PyCharm 官網&#xff0c;點擊 "Download" 按鈕25。 版本選擇&#xff1a; 社區版&#xff08;Community&#xff09;&#xff1a;免費使用&#xff0c;適合個人學習和基礎開發。 專業版&#xff08;Professional&#…

leetcode day27 455+376

455 分發餅干 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平臺簡介&#xff1a; 主要是官方手冊指南、B站視頻&#xff08;培訓視頻、軟件視頻&#xff09; 1&#xff0c;超算平臺架構&#xff1a; 和普通的家用電腦的架構不同&#xff0c; 主要區別在于&#xff1a;層次化的結構 &#xff08;1&#xff09;超算是有…

K8S單機部署

主線 :部署簡單的單節點k8s - sowler - 博客園 學習網址&#xff1a;為什么我不能獲取到鏡像&#xff0c;ImagePullBackoff | Kuboard docker鏡像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3區塊鏈

Web3 是指下一代互聯網&#xff0c;也被稱為“去中心化互聯網”或“區塊鏈互聯網”。它是基于區塊鏈技術構建的&#xff0c;旨在創建一個更加開放、透明和用戶主導的網絡生態系統。以下是關于 Web3 的一些關鍵點&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…

SQL Server核心知識總結

SQL Server核心知識總結 &#x1f3af; 本文總結了SQL Server核心知識點,每個主題都提供實際可運行的示例代碼。 一、SQL Server基礎精要 1. 數據庫核心操作 -- 1. 創建數據庫&#xff08;核心配置&#xff09; CREATE DATABASE 學生管理系統 ON PRIMARY (NAME 學生管理系統…

android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局&#xff1a;可以靈活地顯示自定義樣式的 Toast。 線程安全&#xff1a;確保在主線程中顯示 Toast&#xff0c;避免崩潰。 避免內存泄漏&#xff1a;使用 ApplicationContext 和取消機制&#xff0c;防止內存泄漏問題。 工具類&#xff1a;作為一個通用的工具…

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…

RocketMQ提供了哪些過濾機制?

前言 本篇文章比較簡單&#xff0c;分別介紹RocketMQ支持幾種過濾機制&#xff0c;其原理和使用。 RocketMQ 提供了多種消息過濾機制&#xff0c;幫根據業務需求高效篩選消息&#xff0c;可以減少不必要的消息傳輸和處理。以下是其核心過濾機制及使用場景&#xff1a; 1. Tag…

Redis數據結構深度解析:從String到Stream的奇幻之旅(一)

Redis系列文章 《半小時掌握Redis核心操作&#xff1a;從零開始的實戰指南》-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;一&#xff09;-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;二&…

【Java開發指南 | 第三十五篇】Maven + Tomcat Web應用程序搭建

讀者可訂閱專欄&#xff1a;Java開發指南 |【CSDN秋說】 文章目錄 前言Maven Tomcat Web應用程序搭建1、使用Maven構建新項目2、單擊項目&#xff0c;連續按兩次shift鍵&#xff0c;輸入"添加"&#xff0c;選擇"添加框架支持"3、選擇Java Web程序4、點擊&…

機器始終是一個機器:技術本質與哲學邊界

機器始終是一個機器&#xff1a;技術本質與哲學邊界 這句話揭示了人工智能發展中的核心矛盾——無論技術如何進步&#xff0c;機器的本質仍是基于規則與數據的計算系統。這種「機器性」既是其能力的源泉&#xff0c;也是其與生命體智能不可逾越的邊界的根源。以下從技術本質、…

JAVA編程【jvm垃圾回收的差異】

jvm垃圾回收的差異 JVM&#xff08;Java Virtual Machine&#xff09;的垃圾回收&#xff08;GC&#xff09;機制是自動管理內存的一種方式&#xff0c;能夠幫助開發者釋放不再使用的內存&#xff0c;避免內存泄漏和溢出等問題。不同的垃圾回收器&#xff08;GC&#xff09;有…

親測解決筆記本觸摸板使用不了Touchpad not working

這個問題可以通過FnFxx來解決&#xff0c;筆記本鍵盤上Fxx會有一個觸摸板圖標。如果不行應該玉藻設置中關了&#xff0c;打開即可。 解決辦法 在藍牙&#xff0c;觸摸板里打開即可。 Turn it on in settings。

RAG技術深度解析:從基礎Agent到復雜推理Deep Search的架構實踐

重磅推薦專欄: 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用,以及與之相關的人工智能生成內容(AIGC)技術。通過深入的技術解析和實踐經…

數據結構篇——串(String)

一、引入 在計算機中的處理的數據內容大致可分為以整形、浮點型等的數值處理和字符、字符串等的非數值處理。 今天我們主要學習的就是字符串數據。本章主要圍繞“串的定義、串的類型、串的結構及其運算”來進行串介紹與學習。 二、串的定義 2.1、串的基本定義 串&#xff08;s…

【智能體架構:Agent】LangChain智能體類型ReAct、Self-ASK的區別

1. 什么是智能體 將大語言模型作為一個推理引擎。給定一個任務&#xff0c; 智能體自動生成完成任務所需步驟&#xff0c; 執行相應動作&#xff08;例如選擇并調用工具&#xff09;&#xff0c; 直到任務完成。 2. 先定義工具&#xff1a;Tools 可以是一個函數或三方 API也…

OmniParser技術分析(一)

1.引言 通過上篇文章介紹 OmniParser:下一代純視覺UI自動化測試先驅相信大家已經對OmniParser有初步了解&#xff0c;接下來詳細介紹下OmniParser使用了哪些技術模型實現了對UI純視覺的檢測和理解。 2.整體方案 通過閱讀OmniParser提供的運行Demo代碼知道&#xff0c;其實整…

設計心得——繼承和實例

一、繼承的應用場景 在上篇文章分析了繼承的應用&#xff0c;本文反過來講繼承和實例。可以理解對上文的繼承進行一下基礎知識的鋪墊&#xff0c;繼承的應用場景非常多&#xff0c;典型的應用場景包括&#xff1a; 1、單純屬性的繼承 這種繼承非常常見&#xff0c;在前面也舉過…