MATLAB實現井字棋

一、智能決策系統與博弈游戲概述

(一)智能決策系統核心概念

智能決策系統(Intelligent Decision System, IDS)是通過數據驅動和算法模型模擬人類決策過程的計算機系統,核心目標是在復雜環境中自動生成最優策略,實現決策自動化與智能化。其核心要素包括:

  • 數據層:負責采集、存儲、處理和管理數據,為后續分析提供支撐。
  • 算法層:通過數學模型和邏輯規則解析數據、生成候選策略。
  • 決策層:整合算法輸出、執行最終決策,并對結果進行反饋優化。
  • 交互層:接收用戶輸入、展示決策結果,并支持人機協同決策。

其決策流程為:用戶落子→數據層采集棋盤狀態→算法層用 Minimax 評估所有落子可能→決策層選擇最優位置落子→交互層展示結果→反饋機制記錄對弈數據優化算法。

(二)博弈游戲的研究價值

  1. 規則明確,易于建模:博弈游戲規則清晰固定,便于轉化為計算機可處理的模型。以井字棋為例,3×3 棋盤、雙方輪流落子、先連成三子者勝的規則簡單,可用二維數組表示棋盤狀態。
  2. 算法驗證的理想場景:為各類決策算法提供測試平臺,從基礎的決策樹、極大極小值算法(Minimax)到復雜的蒙特卡洛樹搜索(MCTS)、強化學習算法,都能在博弈游戲中驗證有效性和性能。如井字棋中使用 Minimax 算法,通過遞歸搜索所有可能落子、評估棋局狀態、選擇最優落子策略,可直觀展現算法在有限狀態空間內的決策過程。

二、井字棋場景下的技術架構

(一)棋盤狀態表示

使用 3x3 矩陣表示棋盤,空點為 0,玩家 1 棋子為 1,玩家 2(AI)棋子為 - 1。例如:

plaintext

0  -1  1  
1  -1  0  
-1  1  0  

初始化空棋盤代碼為:board = zeros(3,3);

(二)核心算法:分數評估算法

在棋局未結束時,根據棋盤上棋子的布局情況進行細致打分,計算己方和對方連子的數量和潛在威脅,為不同情況賦予不同分數,同時考慮不同位置的重要性并進行加權。中心位置權重較高(4),邊角位置次之(2),其他位置權重較低(0)。計算分數時,將連子得分加上對應位置的權重得分,以區分不同局面的優劣。具體局面得分情況如下:

局面情況玩家 1 得分玩家 2 得分
行 / 列 / 對角線形成雙連子 (無對方棋子)+5+5
占據中心位置 (5 號)+4+4
占據邊角位置 (1/3/7/9 號)+2+2

(三)極大極小值算法(Minimax)

  • 算法流程:從當前棋盤狀態出發,遞歸搜索所有可能的落子位置,模擬雙方交替落子的過程。Max 層為玩家 1,目標是讓凈得分(玩家 1 得分 - 玩家 2 得分)越大越好;Min 層為玩家 2(AI),目標是讓凈得分越小越好。通過遞歸一次評估得分,最終選擇最優落子位置。
  • 示例說明:在給定的棋盤狀態下,通過遞歸計算不同落子情況的得分,確定最優策略。

三、MATLAB 代碼實現與案例解析

(一)主函數tic_tac_toe()

  • 功能:實現井字棋游戲的主邏輯,包括棋盤初始化、玩家輸入處理、AI 落子、棋盤顯示、得分計算和結局判斷等。
  • 代碼要點
    • 初始化棋盤和游戲狀態,顯示位置編號與棋盤對應關系。
    • 進入游戲主循環,交替進行玩家 1 和玩家 2(AI)的回合。
    • 玩家 1 輸入落子位置,進行有效性檢查后更新棋盤。
    • AI 通過minimax算法計算最佳落子位置并更新棋盤。
    • 顯示棋盤和得分,判斷游戲是否結束,處理平局、玩家 1 勝或玩家 2 勝的情況,并詢問是否重新開始游戲。

(二)顯示棋盤display_board(board)

  • 功能:將棋盤狀態以直觀的方式顯示,用 'X' 表示玩家 1 的棋子,'O' 表示玩家 2(AI)的棋子,'.' 表示空點。
  • 代碼邏輯:遍歷棋盤的每個位置,根據棋子狀態生成相應的字符串并顯示。

(三)評分系統evaluateBoard(board)

  • 功能:評估棋盤狀態,判斷游戲是否結束,并計算當前得分。
  • 代碼邏輯
    • 首先檢查行、列、對角線是否有一方連成三子,若有則確定游戲結束并給出相應得分。
    • 檢查是否平局,若棋盤無空點則游戲結束,得分為 [0,0]。
    • 若游戲未結束,計算非終局得分,包括連子得分和位置權重得分。

(四)決策系統 Min 層minimax(board)

  • 功能:實現 Min 層(AI)的決策邏輯,通過遞歸調用minimaxi函數評估所有可能的落子位置,選擇使凈得分最小的最佳落子位置。
  • 代碼要點:獲取所有可用落子位置,模擬 AI 落子后,調用minimaxi函數計算玩家 1 的最佳應對得分,選擇得分最小的位置作為 AI 的落子位置。

(五)決策系統 Max 層minimaxi(new_board)

  • 功能:實現 Max 層(玩家 1)的決策邏輯,評估玩家 1 在 AI 落子后的最佳落子位置,計算凈得分。
  • 代碼要點:獲取所有可用落子位置,模擬玩家 1 落子后,計算當前得分,選擇得分最大的位置對應的凈得分作為結果。

四、擴展思考:從井字棋到五子棋

(一)算法適用性對比

算法類型井字棋適用性五子棋適用性關鍵改進點
Minimax★★☆☆☆(需剪枝)深度擴展至 4 + 層,結合 α-β 剪枝★★★★☆/
Minimax+α-β★★★☆☆剪枝效率決定搜索深度★★★★☆/
蒙特卡洛樹搜索適合高復雜度狀態空間★★☆☆☆★★★★☆/
強化學習結合策略網絡與價值網絡★★★★★★★★(需訓練)/

(二)發展路徑建議

從 Minimax+α-β 剪枝起步,實現基礎 AI;逐步引入 MCTS 提升中局能力;最終可嘗試深度強化學習(如 AlphaGo Zero 思路)構建高性能 AI。

通過對井字棋的研究,我們深入了解了智能決策系統在博弈游戲中的應用架構和算法實現,而從井字棋到五子棋的擴展思考,為我們展示了更復雜博弈場景下智能決策系統的發展方向和潛力。希望本文能為對智能決策系統和博弈游戲算法感興趣的讀者提供有益的參考。

function tic_tac_toe()

% 初始化棋盤

board = zeros(3, 3);

game_over = false;

disp('===== 井字棋游戲 =====');

disp('位置編號與棋盤對應關系:');

disp('1(左上) 2(中上) 3(右上)');

disp('4(左中) 5(中心) 6(右中)');

disp('7(左下) 8(中下) 9(右下)');

disp('玩家1(X)請輸入落子位置(1-9)');

pos_map = [

1 1; % 位置1 → (1,1)

1 2; % 位置2 → (1,2)

1 3; % 位置3 → (1,3)

2 1; % 位置4 → (2,1)

2 2; % 位置5 → (2,2)

2 3; % 位置6 → (2,3)

3 1; % 位置7 → (3,1)

3 2; % 位置8 → (3,2)

3 3]; % 位置9 → (3,3)

% 游戲主循環

while ~game_over

% 玩家1回合(輸入驗證優化)

while true

move_str = input('請輸入位置(1-9):', 's');

if isempty(move_str) || ~all(ismember(move_str, '123456789'))

disp('請輸入1-9的有效數字!');

continue;

end

move = str2double(move_str);

row = pos_map(move, 1);

col = pos_map(move, 2);

if board(row, col) ~= 0

disp('該位置已被占用!');

else

board(row, col) = 1;

break;

end

end

% 顯示棋盤與得分

display_board(board);

[score, game_over] = evaluateBoard(board);

disp(['當前得分:玩家1: ' num2str(score(1)) ' | 玩家2:' num2str(score(2))]);

if game_over, break; end

% 玩家2回合(程序落子,優化提示)

disp('程序正在思考...');

pause(3);

best_move = minimax(board);

row = ceil(best_move / 3);

col = mod(best_move, 3);

if col == 0

col = 3;

end

board(row, col) = -1;

% 顯示棋盤與得分

display_board(board);

[score, game_over] = evaluateBoard(board);

disp(['當前得分:玩家1:' num2str(score(1)) ' | 玩家2: ' num2str(score(2))]);

end

% 結局判斷(簡化邏輯)

if score(1) == 10

disp('玩家1獲得MVP!');

elseif score(2) == 10

disp('菜就多練!');

else

disp('棋逢對手,將遇良才,本次平局!');

end

% 詢問是否重啟(新增功能)

if input('是否重新開始?(1=是,0=否):', 's') == '1'

tic_tac_toe();

end

end

% 顯示棋盤(保持不變)

function display_board(board)

disp('當前棋盤狀態:');

for i = 1:3

row_str = [];

for j = 1:3

if board(i,j) == 1

row_str = [row_str, ' X '];

elseif board(i,j) == -1

row_str = [row_str, ' O '];

else

row_str = [row_str, ' . '];

end

end

disp(row_str);

end

end

function [score, game_over] = evaluateBoard(board)

game_over = false;

score = zeros(1,2);

% 檢查行、列、對角線(提前return)

for i = 1:3

if sum(board(i,:)) == 3 || sum(board(:,i)) == 3

score = [10, 0];

game_over = true;

return;

end

if sum(board(i,:)) == -3 || sum(board(:,i)) == -3

score = [0, 10];

game_over = true;

return;

end

end

if sum(diag(board)) == 3 || sum(diag(fliplr(board))) == 3

score = [10, 0];

game_over = true;

return;

end

if sum(diag(board)) == -3 || sum(diag(fliplr(board))) == -3

score = [0, 10];

game_over = true;

return;

end

% 檢查平局

if sum(board(:) == 0) == 0

score = [0, 0];

game_over = true;

return;

end

% 計算非終局得分(僅在未結束時執行)

position_weights = [2,0,2;0,4,0;2,0,2];

lines = [board(1,:); board(2,:); board(3,:); board(:,1)'; board(:,2)'; board(:,3)'; diag(board)'; diag(fliplr(board))'];

player1_double = 0;

player2_double = 0;

for i = 1:8

if sum(lines(i,:)) == 2

player1_double = player1_double + 5;

end

if sum(lines(i,:)) == -2

player2_double = player2_double + 5;

end

end

board_1 = board;

board_2 = board;

board_1(board_1<0)=0;

board_2(board_2>0)=0;

player1_position = sum(sum(board_1.* position_weights)); % 向量化計算位置得分

player2_position = -sum(sum(board_2.* position_weights));

score(1) = player1_double + player1_position;

score(2) = player2_double + player2_position;

end

function best_move = minimax(board)

available_moves = find(board' == 0);

num_moves = length(available_moves);

best_score = inf;

best_move = available_moves(1);

pos_map = [

1 1; % 位置1 → (1,1)

1 2; % 位置2 → (1,2)

1 3; % 位置3 → (1,3)

2 1; % 位置4 → (2,1)

2 2; % 位置5 → (2,2)

2 3; % 位置6 → (2,3)

3 1; % 位置7 → (3,1)

3 2; % 位置8 → (3,2)

3 3]; % 位置9 → (3,3)

for i = 1:num_moves

move = available_moves(i);

row = pos_map(move, 1);

col = pos_map(move, 2);

new_board = board;

new_board(row, col) = -1; % AI落子推演

best_score_test = minimaxi(new_board);% 推演后,玩家1給出最佳方案時的凈得分

if best_score_test < best_score

best_score = best_score_test;

best_move = move;

end

end

end

function best_score_test = minimaxi(new_board)

available_moves = find(new_board' == 0);

num_moves = length(available_moves);

best_score_test = -inf;

pos_map = [

1 1; % 位置1 → (1,1)

1 2; % 位置2 → (1,2)

1 3; % 位置3 → (1,3)

2 1; % 位置4 → (2,1)

2 2; % 位置5 → (2,2)

2 3; % 位置6 → (2,3)

3 1; % 位置7 → (3,1)

3 2; % 位置8 → (3,2)

3 3]; % 位置9 → (3,3)

for i = 1:num_moves

move = available_moves(i);

row = pos_map(move, 1);

col = pos_map(move, 2);

nnew_board = new_board;

nnew_board(row, col) = 1; % 玩家1落子推演

[best_score_tes, ~] = evaluateBoard(nnew_board);

best_score_testt = best_score_tes(1)-best_score_tes(2);

if best_score_testt > best_score_test

best_score_test = best_score_testt;

end

end

end

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

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

相關文章

解決el-select選擇框右側下拉箭頭遮擋文字問題

如圖所示&#xff1a; el-select長度較短的時候&#xff0c;選擇框右側下拉箭頭會遮擋選中的數據 選中數據被遮擋 解決辦法&#xff1a; 組件如下&#xff1a; <td class"fmtd" :colspan"col.ptproCupNum" v-for"col in row" :key"…

【Linux】pthread多線程同步

參考文章&#xff1a;https://blog.csdn.net/Alkaid2000/article/details/128121066 一、線程同步 線程的主要優勢在于&#xff0c;能夠通過全局變量來共享信息。不過&#xff0c;這種便攜的共享是有代價的&#xff1b;必須確保多個線程不會同時修改同一變量&#xff0c;或者某…

Spring框架學習day7--SpringWeb學習(概念與搭建配置)

SpringWeb1.SpringWeb特點2.SpringWeb運行流程3.SpringWeb組件4.搭建項目結構圖&#xff1a;4.1導入jar包4.2在Web.xml配置**4.2.1配置統一攔截分發器 DispatcherServlet**4.2.2開啟SpringWeb注解&#xff08;spring.xml&#xff09; 5.處理類的搭建6.SpringWeb請求流程(自己理…

業務到解決方案構想

解決方案構想的核心理解 解決方案構想是連接業務需求與技術實現的關鍵橋梁&#xff0c;從您描述的內容和我的理解&#xff0c;這個階段的核心點包括&#xff1a; 核心要點解讀 轉化視角&#xff1a;將業務視角的需求轉變為解決方案視角 業務能力探索階段識別了"做什么&q…

jvm學習第1day jvm簡介,棧溢出、堆溢出

jvm學習第1day jvm簡介&#xff0c;棧溢出、堆溢出 jvm簡介棧線程安全棧溢出線程運行診斷堆堆溢出 方法區方法區內存溢出常量池和運行時常量池 jvm簡介 jvm 是編譯后的字節碼文件運行的環境&#xff0c; 因此各個平臺有了jvm可以運行java.class文件&#xff0c;這是Java跨平臺…

關于神經網絡中的激活函數

這篇博客主要介紹一下神經網絡中的激活函數以及為什么要存在激活函數。 首先&#xff0c;我先做一個簡單的類比&#xff1a;激活函數的作用就像給神經網絡里的 “數字信號” 加了一個 “智能閥門”&#xff0c;讓機器能學會像人類一樣思考復雜問題。 沒有激活i函數的神經網絡…

免費無限使用GPT Plus、Claude Pro、Grok Super、Deepseek滿血版

滲透智能-ShirtAI&#xff0c;可以免費無限使用GPT Plus、Claude Pro、Grok Super、Deepseek滿血版、除此之外還能免費使用AI搜索、Gemini AI、AI照片修復、AI橡皮擦、AI去背景、AI智能摳圖、AI證件照、OCR識別、在線思維導圖、在線繪圖工具、PDF工具箱、PDF翻譯。 傳送入口&a…

阿里云 Linux 搭建郵件系統全流程及常見問題解決

阿里云 Linux 搭建 [conkl.com]郵件系統全流程及常見問題解決 目錄 阿里云 Linux 搭建 [conkl.com]郵件系統全流程及常見問題解決一、前期準備&#xff08;關鍵配置需重點檢查&#xff09;1.1 服務器與域名準備1.2 系統初始化&#xff08;必做操作&#xff09; 二、核心組件安裝…

python版若依框架開發:項目結構解析

python版若依框架開發 從0起步&#xff0c;揚帆起航。 python版若依部署代碼生成指南&#xff0c;迅速落地CURD&#xff01;項目結構解析 文章目錄 python版若依框架開發前端后端 前端 后端

RabbitMQ 的異步化、解耦和流量削峰三大核心機制

RabbitMQ 的異步化、解耦和流量削峰三大核心機制 RabbitMQ 是解決數據庫高并發問題的利器&#xff0c;通過異步化、解耦和流量削峰三大核心機制保護數據庫。下面從設計思想到具體實現&#xff0c;深入剖析 RabbitMQ 應對高并發的完整方案&#xff1a; 一、數據庫高并發核心痛點…

前端沒有“秦始皇“,但可以做跨端的王[特殊字符]

前端各領域的 “百家爭鳴” 框架之爭&#xff1a;有 React、Vue、Angular 等多種框架。它們各有優缺點&#xff0c;開發者之間還存在鄙視鏈&#xff0c;比如 Vue 嫌 React 難用&#xff0c;React 嫌 Vue 不夠靈活。樣式處理&#xff1a; CSS 預處理器&#xff1a;像 Sass、Les…

Spring Boot-面試題(52)

摘要&#xff1a; 1、通俗易懂&#xff0c;適合小白 2、僅做面試復習用&#xff0c;部分來源網絡&#xff0c;博文免費&#xff0c;知識無價&#xff0c;侵權請聯系&#xff01; 1. 什么是 Spring Boot 框架&#xff1f; Spring Boot 是基于 Spring 框架的快速開發框架&#…

JVM——JVM中的字節碼:解碼Java跨平臺的核心引擎

引入 在Java的技術版圖中&#xff0c;字節碼&#xff08;Bytecode&#xff09;是連接源代碼與機器世界的黃金橋梁。當開發者寫下第一行public class HelloWorld時&#xff0c;編譯器便開始了一場精密的翻譯工程——將人類可讀的Java代碼轉化為JVM能夠理解的字節碼指令。這些由…

Java中的JSONObject詳解:從基礎到高級應用

Java中的JSONObject詳解&#xff1a;從基礎到高級應用 在當今前后端分離的架構中&#xff0c;JSONObject已成為Java開發者處理JSON數據的瑞士軍刀。本文將深入解析JSONObject的核心機制與實戰技巧。 一、JSONObject的本質與實現庫 1.1 核心定位 JSONObject是Java中表示JSON對…

在 SpringBoot+Tomcat 環境中 線程安全問題的根本原因以及哪些變量會存在線程安全的問題。

文章目錄 前言Tomcat SpringBoot單例加載結果分析多例加載&#xff1a;結果分析&#xff1a; 哪些變量存在線程安全的問題&#xff1f;線程不安全線程安全 總結 前言 本文帶你去深入理解為什么在web環境中(Tomcat SpringBoot)會存在多線程的問題以及哪些變量會存在線程安全的…

npm install 相關命令

npm install 相關命令 基本安裝命令 # 安裝 package.json 中列出的所有依賴 npm install npm i # 簡寫形式# 安裝特定包 npm install <package-name># 安裝特定版本 npm install <package-name><version>依賴類型選項 # 安裝為生產依賴&#xff08;默認&…

貪心算法應用:最小反饋頂點集問題詳解

貪心算法應用&#xff1a;最小反饋頂點集問題詳解 1. 問題定義與背景 1.1 反饋頂點集定義 反饋頂點集(Feedback Vertex Set, FVS)是指在一個有向圖中&#xff0c;刪除該集合中的所有頂點后&#xff0c;圖中將不再存在任何有向環。換句話說&#xff0c;反饋頂點集是破壞圖中所…

BiliNote部署實踐

? 開源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速開始 1. 克隆倉庫 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 啟動后端&#xff08;FastAPI&#xff09; cd backend pip insta…

用go從零構建寫一個RPC(4)--gonet網絡框架重構+聚集發包

在追求高性能的分布式系統中&#xff0c;RPC 框架的底層網絡能力和數據傳輸效率起著決定性作用。經過幾輪迭代優化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;這一版本的最大亮點在于 重寫了底層網絡框架 和 實現了發送端的數據聚集機制&#xff0c;這…

MySQL 高可用基石 - 復制監控與常見 HA 方案

MySQL 高可用基石 - 復制監控與常見 HA 方案 MySQL 復制核心原理 MySQL 復制允許數據從一個 MySQL 數據庫服務器(稱為主庫 - Primary,舊稱 Master)復制到一個或多個其他的 MySQL 服務器(稱為從庫 - Replica,舊稱 Slave)。 復制的主要目的: 高可用性 (High Availability…