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