请在这里粘贴代码# Edge Impulse - OpenMV Object Detection Example
import sensor, image, time, os, tf, math, uos, gc
from pyb import UART
import chess
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240)) # Set 240x240 window.
sensor.skip_frames(time=2000) # Let the camera adjust.
sensor.set_auto_gain(True)
sensor.set_auto_whitebal(False)
uart = UART(3, 115200) #OpenMV RT 用UART(1)这行,注释掉上一行UART(3)
#生成九宫格的区域位置
def generate_centered_rois(width, height, b, k):
rois = []
# 计算每个ROI中心的位置偏移
offset = (b - k) // 2
# 计算整个3x3矩阵的宽度和高度
total_width = 3 * b
total_height = 3 * b
# 计算左上角的起始点,使矩阵居中
start_x = (width - total_width) // 2
start_y = (height - total_height) // 2
for i in range(3):
row = []
for j in range(3):
x_center = start_x + j * b + b // 2
y_center = start_y + i * b + b // 2
x = x_center - k // 2
y = y_center - k // 2
row.append((x, y, k, k))
rois.append(row)
return rois
distance = 53
block = 18
# 九宫格的区域位置
rois = generate_centered_rois(sensor.width(), sensor.height(), distance, block)
# 棋盘数组
# 黑子:X
# 白子:O
# 没有棋子:空字符串
board = [
[" "," "," "],
[" "," "," "],
[" "," "," "],
]
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# 图像识别得到棋盘数组
for y in range(len(rois)):
for x in range(len(rois[y])):
gray = img.get_statistics(roi=rois[y][x]).mean()
if gray < 45:
board[y][x] = "X"
elif gray > 60:
board[y][x] = "O"
else:
board[y][x] = " "
# 打印当前棋盘数组
for line in board:
print(line)
print()
# 画棋盘数组
for y in range(len(rois)):
for x in range(len(rois[y])):
if board[y][x] == "X":
color = 255
elif board[y][x] == "O":
color = 0
elif board[y][x] == " ":
color = 127
img.draw_rectangle(rois[y][x], color=color)
#第四题 数据接收 接收1发送坐标
if uart.any():
data=uart.read(1)
if data==b'0' :
if chess.check_win(board, 'O'):
print("你赢啦!")
elif chess.check_win(board, 'X'):
print("我赢啦!")
elif chess.check_draw(board):
print("平局啦!")
elif chess.check_turn(board) == "X":
# 计算下一步棋子放在哪里
line,row =chess.computer_move(board)
sensor.flush()
elif chess.check_turn(board) == "O":
print("该你下了!")
if line==0 and row ==0 :
uart.writechar(1)
elif line==0 and row==1:
uart.writechar(2)
elif line==0 and row==2:
uart.writechar(3)
elif line==1 and row==0:
uart.writechar(4)
elif line==1 and row==1:
uart.writechar(5)
elif line==1 and row==2:
uart.writechar(6)
elif line==2 and row==0:
uart.writechar(7)
elif line==2 and row==1:
uart.writechar(8)
elif line==2 and row==2:
uart.writechar(9)
#第五题 数据接收 接收1发送坐标
if uart.any():
data=uart.read(1)
if data==b'1' :
if chess.check_win(board, 'O'):
print("你赢啦!")
elif chess.check_win(board, 'X'):
print("我赢啦!")
elif chess.check_draw(board):
print("平局啦!")
elif chess.check_turn(board) == "O":
# 计算下一步棋子放在哪里
line,row =chess.computer_move(board)
sensor.flush()
elif chess.check_turn(board) == "X":
print("该你下了!")
if line==0 and row ==0 :
uart.writechar(1)
elif line==0 and row==1:
uart.writechar(2)
elif line==0 and row==2:
uart.writechar(3)
elif line==1 and row==0:
uart.writechar(4)
elif line==1 and row==1:
uart.writechar(5)
elif line==1 and row==2:
uart.writechar(6)
elif line==2 and row==0:
uart.writechar(7)
elif line==2 and row==1:
uart.writechar(8)
elif line==2 and row==2:
uart.writechar(9)
模块化代码
chess.py
SIZE = 3
检查赢了吗
def check_win(board, player):
# Check rows and columns
for i in range(SIZE):
if all(board[i][j] == player for j in range(SIZE)) or
all(board[j][i] == player for j in range(SIZE)):
return True
# Check diagonals
if all(board[i][i] == player for i in range(SIZE)) or
all(board[i][SIZE - 1 - i] == player for i in range(SIZE)):
return True
return False
检查平局了吗
def check_draw(board):
return all(board[i][j] != ' ' for i in range(SIZE) for j in range(SIZE))
计算策略得分
def minimax(board, depth, is_maximizing):
computer = 'X'
player = 'O'
if check_win(board, computer):
return 10 - depth
if check_win(board, player):
return depth - 10
if check_draw(board):
return 0
if is_maximizing:
best_score = float('-inf')
for i in range(SIZE):
for j in range(SIZE):
if board[i][j] == ' ':
board[i][j] = computer
score = minimax(board, depth + 1, False)
board[i][j] = ' '
best_score = max(score, best_score)
return best_score
else:
best_score = float('inf')
for i in range(SIZE):
for j in range(SIZE):
if board[i][j] == ' ':
board[i][j] = player
score = minimax(board, depth + 1, True)
board[i][j] = ' '
best_score = min(score, best_score)
return best_score
计算下一步位置
def computer_move(board):
if board == [
[" "," "," "],
[" "," "," "],
[" "," "," "]
]:
return 1,1
best_score = float('-inf')
move = (-1, -1)
for i in range(SIZE):
for j in range(SIZE):
if board[i][j] == ' ':
board[i][j] = 'X'
score = minimax(board, 0, False)
board[i][j] = ' '
if score > best_score:
best_score = score
move = (i, j)
if move != (-1, -1):
# board[move[0]][move[1]] = 'X'
print(f"Computer places X at ({move[0]}, {move[1]})")
return move[0], move[1]
检查该谁走了
def check_turn(board):
x_count = sum(row.count("X") for row in board)
o_count = sum(row.count("O") for row in board)
return "X" if x_count == o_count else "O"