如何使用 pygame 为棋盘游戏 Nip 制作圆形区域?

问题描述 投票:0回答:1

我想用 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。

输出是这样的

白色单元格是一开始创建的单元格,红色单元格是我试图制作成外圈的单元格。

如何在不影响单元格原来的行和列的情况下,使外侧变圆?

这是我的完整代码。

python arrays python-3.x math pygame
1个回答
0
投票

您可以使用欧氏距离来测试一个点是否在圆内:

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:
            ...  
© www.soinside.com 2019 - 2024. All rights reserved.