題目簡述
一、 任務
設計并制作三子棋游戲裝置,能夠控制機械臂或其他機構放置棋子,實現人 機對弈。圖 1 所示的三子棋棋盤和棋子位置示意圖中,棋盤由黑色實線圍成 9 個方格,人、機分別從棋子放置處拾取棋子并放置到方格中,先將己方的 3 個棋 子連成一線(橫連、豎連、斜連皆可)即獲勝。
二、 要求
(1)裝置能將任意 1 顆黑棋子放置到 5 號方格中。(5 分)
(2)裝置能將任意 2 顆黑棋子和 2 顆白棋子依次放置到指定方格中。(20 分)
(3)將棋盤繞中心±45°范圍內旋轉后,裝置能將任意 2 顆黑棋子和 2 顆 白棋子依次放置到指定方格中。(20 分)
(4)裝置執黑棋先行與人對弈(第 1 步方格可設置),若人應對的第 1 步白 棋有錯誤,裝置能獲勝。(20 分)
(5)人執黑棋先行,裝置能正確放置白棋子以保持不輸棋。(20 分)
(6)對弈過程中,若人將裝置下過的 1 顆棋子變動位置,裝置能自動發現 并將該棋子放置回原來位置。(10 分)
Vision Broad開發板簡述
開發板描述:Vision Board搭載全球首顆 480 MHz Arm Cortex-M85芯片,擁有Helium和TrustZone技術的加持。SDK包里集成了OpenMV機器視覺例程,配合MicroPython 解釋器,使其可以流暢地開發機器視覺應用。Vision Board具有以下主要特點:
強大的處理性能:Vision Board搭載了全球首款基于 ARM Cortex-M85 架構的瑞薩電子RA8 MCU,6.39 CoreMark/MHz,可以快速而高效地運行機器視覺算法,實現圖像處理、等功能。
完整支持OpenMV生態:Vision Board完全兼容OpenMV開發平臺,用戶可以直接使用OpenMV IDE進行編程和開發,利用豐富的API和庫函數進行圖像處理和計算機視覺任務。
友好的學習環境:提供簡潔易用的開發環境和示例項目,帶領初學者快速上手機器視覺、GUI等應用。同時具有豐富的文檔資料供給開發者學習。
可擴展性:豐富的擴展接口,如攝像頭、MIPI-DSI、RGB666、樹莓派兼容IO、BTB拓展接口等,用戶可以根據自己的需求連接其他外設或模塊,如以太網、CAN/LIN、傳感器、執行器等,實現更復雜的應用場景。
板載資源:
外設支持情況:
支持的 IDE:RT-Thread Studio、MDKV538。OpenMV工程目前僅支持MDK開發
三子棋思路
找棋盤
生成居中的九宮格區域
函數 generate_centered_rois 的目的是生成一個九宮格的區域,每個區域都包含棋盤上的一個方塊,并且這些區域在整個圖像中居中。函數的參數包括圖像的寬度和高度、每個方塊的邊長 b 以及感興趣區域(ROI)的邊長 k。
函數定義
步驟解析
1.初始化區域列表:
rois 是一個列表,用于存儲每個 ROI 的坐標和大小。
2.計算每個 ROI 中心的位置偏移:
偏移量 offset 是為了確保 ROI 在每個方塊的中心。b 是方塊的邊長,而 k 是 ROI 的邊長。
3.計算整個九宮格的總寬度和高度:
因為九宮格有 3 行 3 列,每個方塊的邊長為 b,所以總寬度和高度分別是 3 * b。
4.計算左上角的起始點:
為了使九宮格在圖像中居中,我們計算左上角的起始點 start_x 和 start_y。它們分別是圖像寬度和高度減去九宮格的總寬度和高度的一半。
5.生成九宮格區域:
使用雙重循環生成每個 ROI 的坐標。
x_center 和 y_center 計算每個方塊的中心位置。
x 和 y 是 ROI 的左上角坐標,減去 k // 2 是為了將 ROI 的中心對齊到方塊的中心。
最后,將每個 ROI 添加到 rois 列表中。
6.返回 ROI 列表:
視覺化解釋
假設圖像的寬度和高度分別為 320 和 240,每個方塊的邊長 b 為 43,每個 ROI 的邊長 k 為 10。九宮格將會在圖像中居中,每個 ROI 將位于方塊的中心,形成一個規則的 3x3 矩陣。
找棋子
棋子識別的關鍵在于處理圖像并根據灰度值來判斷每個方塊中是否存在棋子,以及棋子的顏色是黑色還是白色。這個過程在 while 循環中進行。
代碼段
步驟解析
1.抓取圖像和鏡頭矯正:
使用 Vision Broad的攝像頭捕獲當前圖像,并進行鏡頭矯正,以減少鏡頭畸變。
2.遍歷所有 ROI(感興趣區域):
使用雙重循環遍歷之前生成的九宮格區域 rois。
3.計算灰度值的平均值:
對每個 ROI 計算灰度值的平均值。img.get_statistics(roi=rois[y][x]) 返回一個統計對象,包含了該 ROI 內的像素統計數據。通過 mean() 方法可以得到該區域的平均灰度值。
4.判斷灰度值來確定棋子:
如果灰度值小于 100,則認為該區域有一個黑色棋子("X")。
如果灰度值大于 200,則認為該區域有一個白色棋子("O")。
否則,該區域為空(" ")。
博弈策略計算
minimax 函數
minimax 函數使用遞歸的方法評估所有可能的棋步,并為每個棋步計算一個分數,以確定最佳移動。
步驟解析
1.定義變量:
定義機器人棋子為 ‘X’,玩家棋子為 ‘O’。
2.檢查終止條件:
如果機器人贏了,返回一個正分(10 減去深度,越快贏分數越高)。
如果玩家贏了,返回一個負分(深度減去 10,越快輸分數越低)。
如果平局,返回 0 分。
遞歸搜索:
機器人最大化得分:
初始化 best_score 為負無窮。
遍歷每個空位置,模擬機器人下棋。
遞歸調用 minimax 計算對方的最佳應對分數。
恢復棋盤狀態,更新 best_score。
返回最佳分數。
玩家最小化得分:
初始化 best_score 為正無窮。
遍歷每個空位置,模擬玩家下棋。
遞歸調用 minimax 計算機器人的最佳應對分數。
恢復棋盤狀態,更新 best_score。
返回最佳分數。
computer_move 函數
computer_move 函數用來確定機器人下一步應該下到哪里。
步驟解析
1.初始化變量:
初始化 best_score 為負無窮,用來追蹤最佳分數。move 用來記錄最佳移動位置。
2.遍歷棋盤找空位:
遍歷每個位置,如果是空位,模擬機器人在此下棋。
調用 minimax 計算此移動的分數。
恢復棋盤狀態。
如果當前移動的分數大于 best_score,更新 best_score 和 move。
3.返回最佳移動位置:
如果找到最佳移動位置,返回該位置的坐標。
總結
Minimax 算法:通過遞歸搜索所有可能的棋步,評估每個棋步的得分,最大化機器人的得分,最小化玩家的得分。
確定最佳移動:遍歷所有可能的移動,調用 minimax 算法計算每個移動的得分,并選擇得分最高的移動。
贏者檢測
贏者檢測是通過 check_win 函數實現的。該函數會檢查棋盤的行、列和對角線,判斷某個玩家是否已經獲勝。
check_win 函數
步驟解析
1.檢查行和列:
遍歷每一行,檢查該行是否全部是當前玩家的棋子。如果是,返回 True。
遍歷每一列,檢查該列是否全部是當前玩家的棋子。如果是,返回 True。
2.檢查對角線:
檢查主對角線(從左上到右下),是否全部是當前玩家的棋子。如果是,返回 True。
檢查副對角線(從右上到左下),是否全部是當前玩家的棋子。如果是,返回 True。
3.未找到獲勝者:
如果沒有找到任何一行、一列或對角線全部是當前玩家的棋子,返回 False。
完整代碼:
-
開發板
+關注
關注
25文章
5428瀏覽量
101165 -
board
+關注
關注
0文章
38瀏覽量
19978 -
Vision
+關注
關注
1文章
201瀏覽量
18582
發布評論請先 登錄
電賽猜題
2020電賽E題復盤相關資料分享
【Vision Board 創客營】Vision Board上的DAC實踐

評論