我想用 pygame 为名为 Nip 的棋盘游戏制作圆形场地。 黑白棋传统上是在方形棋盘上进行的。标准游戏板是 8x8 网格。 Nip 是在圆板上玩的黑白棋的变体。
这里我设置了游戏板。我喜欢这个是因为我需要跟踪游戏中黑盘或白盘的放置位置。
EMPTY,CORNER = 0,0
BLACK = 1
WHITE = -1
board = [
[ 2, 2, CORNER, CORNER, CORNER, CORNER, 2, 2,],
[ 2, CORNER, EMPTY, EMPTY, EMPTY, EMPTY, CORNER, 2,],
[ CORNER, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, CORNER,],
[ CORNER, EMPTY, EMPTY, BLACK, WHITE, EMPTY, EMPTY, CORNER,],
[ CORNER, EMPTY, EMPTY, WHITE, BLACK, EMPTY, EMPTY, CORNER,],
[ CORNER, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, CORNER,],
[ 2, CORNER, EMPTY, EMPTY, EMPTY, EMPTY, CORNER, 2,],
[ 2, 2, CORNER, CORNER, CORNER, CORNER, 2, 2,],
]
然后我尝试制作像这样放置光盘的单元
for row in range(ROWS):
for col in range(COLS):
if board[row][col] != 2 :
x = col * SQUARE_SIZE + SQUARE_SIZE // 2
y = row * SQUARE_SIZE + SQUARE_SIZE // 2
# Draw the cell
pygame.draw.circle(self.win, WHITE_COLOR, (x, y), PIECE_RADIUS//3, 2)
然而,这形成了六边形场。然后我尝试重新排列外圆中的角单元,以使用此代码制作圆形字段。
for i in range(0,360,THETA):
pygame.draw.circle(self.win, (255,0,0), (400+380*math.cos(math.radians(i)), 400+380*math.sin(math.radians(i))), PIECE_RADIUS//3, 2)
这里我计算了相邻单元格之间的 THETA,并将单元格放置在外圆上。外圆的圆心坐标为(400,400),半径为380。
白色单元格是一开始创建的单元格,红色单元格是我试图制作成外圈的单元格。
如何在不影响单元格原来的行和列的情况下,使外侧变圆?
您可以使用欧氏距离来测试一个点是否在圆内:
import math
max_distance = SQUARE_SIZE * 4
center_x = SQUARE_SIZE * 5
center_y = SQUARE_SIZE * 5
for row in range(ROWS):
for col in range(COLS):
x = col * SQUARE_SIZE + SQUARE_SIZE // 2
y = row * SQUARE_SIZE + SQUARE_SIZE // 2
dx = x - center_x
dy = y - center_y
distance = math.sqrt(dx*dx + dy*dy)
if distance < max_distance:
...